From 3d3bc7dc70df91a18012aad141d77707d9249f79 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 5 Feb 2021 01:10:54 +0100 Subject: [PATCH 01/26] Ne plus afficher les tirages automatiques MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les tirages automatiques sont intégrés dans les messages --- module/rdd-commands.js | 14 ++++++-------- module/rdd-rolltables.js | 10 +++++----- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/module/rdd-commands.js b/module/rdd-commands.js index d148eca9..f4bbcb47 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -1,6 +1,5 @@ /* -------------------------------------------- */ -import { ChatUtility } from "./chat-utility.js"; import { DeDraconique } from "./de-draconique.js"; import { RdDItemCompetence } from "./item-competence.js"; import { Misc } from "./misc.js"; @@ -22,13 +21,12 @@ export class RdDCommands { const rddCommands = new RdDCommands(); rddCommands.registerCommand({ path: ["/aide"], func: (content, msg, params) => rddCommands.help(msg), descr: "Affiche l'aide pour toutes les commandes" }); rddCommands.registerCommand({ path: ["/help"], func: (content, msg, params) => rddCommands.help(msg), descr: "Affiche l'aide pour toutes les commandes" }); - rddCommands.registerCommand({ path: ["/table", "queues"], func: (content, msg, params) => RdDRollTables.getQueue(), descr: "Tire une Queue de Dragon" }); - rddCommands.registerCommand({ path: ["/table", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre(), descr: "Tire une Ombre de Dragon" }); - rddCommands.registerCommand({ path: ["/table", "tetehr"], func: (content, msg, params) => RdDRollTables.getTeteHR(), descr: "Tire une Tête de Dragon pour Hauts Revants" }); - rddCommands.registerCommand({ path: ["/table", "tete"], func: (content, msg, params) => RdDRollTables.getTete(), descr: "Tire une Tête de Dragon" }); - rddCommands.registerCommand({ path: ["/table", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle(), descr: " Tire un Souffle de Dragon" }); - rddCommands.registerCommand({ path: ["/table", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot(), descr: "Tire une carte du Tarot Draconique" }); - rddCommands.registerCommand({ path: ["/table", "tmr"], func: (content, msg, params) => TMRUtility.getTMRAleatoire(), descr: "Tire une case aléatoire des Terres médianes" }); + rddCommands.registerCommand({ path: ["/table", "queues"], func: (content, msg, params) => RdDRollTables.getQueue(true), descr: "Tire une Queue de Dragon" }); + rddCommands.registerCommand({ path: ["/table", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre(true), descr: "Tire une Ombre de Dragon" }); + rddCommands.registerCommand({ path: ["/table", "tetehr"], func: (content, msg, params) => RdDRollTables.getTeteHR(true), descr: "Tire une Tête de Dragon pour Hauts Revants" }); + rddCommands.registerCommand({ path: ["/table", "tete"], func: (content, msg, params) => RdDRollTables.getTete(true), descr: "Tire une Tête de Dragon" }); + rddCommands.registerCommand({ path: ["/table", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle(true), descr: " Tire un Souffle de Dragon" }); + rddCommands.registerCommand({ path: ["/table", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot(true), descr: "Tire une carte du Tarot Draconique" }); rddCommands.registerCommand({ path: ["/tmra"], func: (content, msg, params) => TMRUtility.getTMRAleatoire(), descr: "Tire une case aléatoire des Terres médianes" }); rddCommands.registerCommand({ diff --git a/module/rdd-rolltables.js b/module/rdd-rolltables.js index 8d7ba802..c0152062 100644 --- a/module/rdd-rolltables.js +++ b/module/rdd-rolltables.js @@ -35,12 +35,12 @@ export class RdDRollTables { } /* -------------------------------------------- */ - static async getSouffle(toChat = true) { + static async getSouffle(toChat = false) { return await RdDRollTables.drawItemFromRollTable("Souffles de Dragon", toChat); } /* -------------------------------------------- */ - static async getQueue(toChat = true) { + static async getQueue(toChat = false) { let queue = await RdDRollTables.drawItemFromRollTable("Queues de dragon", toChat); if (queue.name.toLowerCase().includes('lancinant') ) { queue = await RdDRollTables.drawItemFromRollTable("Désirs lancinants", toChat); @@ -52,17 +52,17 @@ export class RdDRollTables { } /* -------------------------------------------- */ - static async getTete(toChat = true) { + static async getTete(toChat = false) { return await RdDRollTables.drawItemFromRollTable("Têtes de Dragon pour haut-rêvants", toChat); } /* -------------------------------------------- */ - static async getTeteHR(toChat = true) { + static async getTeteHR(toChat = false) { return await RdDRollTables.drawItemFromRollTable("Têtes de Dragon pour tous personnages", toChat); } /* -------------------------------------------- */ - static async getOmbre(toChat = true) { + static async getOmbre(toChat = false) { return await RdDRollTables.drawItemFromRollTable("Ombre de Thanatos", toChat); } From d53077d862c48ddb71a735a3b58262a57afb6e9e Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 5 Feb 2021 01:12:27 +0100 Subject: [PATCH 02/26] Ajout mule --- icons/creatures/chamule.svg | 18 +++++------ icons/creatures/mule.svg | 60 +++++++++++++++++++++++++++++++++++++ packs/animaux.db | 1 + 3 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 icons/creatures/mule.svg diff --git a/icons/creatures/chamule.svg b/icons/creatures/chamule.svg index 6ddaf4c4..c2342281 100644 --- a/icons/creatures/chamule.svg +++ b/icons/creatures/chamule.svg @@ -37,16 +37,16 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="3840" - inkscape:window-height="2066" + inkscape:window-width="2056" + inkscape:window-height="997" id="namedview57" showgrid="false" - inkscape:zoom="1.6310818" - inkscape:cx="764.55266" - inkscape:cy="395.59228" - inkscape:window-x="-11" - inkscape:window-y="-11" - inkscape:window-maximized="1" + inkscape:zoom="1.153349" + inkscape:cx="470.48408" + inkscape:cy="229.26543" + inkscape:window-x="668" + inkscape:window-y="872" + inkscape:window-maximized="0" inkscape:current-layer="svg55" inkscape:document-rotation="0" fit-margin-top="0" @@ -59,5 +59,5 @@ stroke="#000000" stroke-width="1.5" d="m 437.17618,99.433481 c 0.36,-3.21 0.51,-7.515 1.68,-10.44 1.14,-2.865 3.735,-5.28 3.21,-7.77 -1.005,-4.725 -8.97,-3.48 -11.49,-9.135 -3.525,-7.86 3.45,-27.09 7.62,-34.155 2.205,-3.735 4.86,-7.65 9.48,-8.445001 12.69,-2.19 17.55,25.950001 23.13,29.355001 2.55,1.575 6.87,0.84 9.87,1.05 3.945,0.105 11.265,1.56 14.745,0 10.575,-4.38 12.09,-19.86 21.255,-24.96 -1.515,18.45 -8.19,26.625 -8.595,31.44 -0.765,8.895 14.31,10.095 14.865,19.575 0.195,3.27 -7.5,21.974999 -10.035,24.224999 0,0 -10.98,6.585 -10.98,6.585 -3.57,2.85 -5.94,6.75 -10.77,7.56 -5.445,0.93 -10.755,-2.505 -14.985,-5.385 -2.025,5.58 -3.945,8.22 1.5,12 0,0 -3,6 -3,6 0,0 10.5,3 10.5,3 0,0 0,3 0,3 0,0 -10.5,1.5 -10.5,1.5 5.745,4.815 12.63,7.755 15,15 0,0 -7.5,-4.5 -7.5,-4.5 0,0 6,7.5 6,7.5 -3.195,11.41503 0.18,22.90503 0,34.50003 -0.285,17.22 -7.095,8.22 -4.5,25.5 -7.185,2.925 -7.77,3.06 -6,10.5 0,0 -4.5,-1.5 -4.5,-1.5 0,0 4.5,12 4.5,12 0,0 -7.5,-1.5 -7.5,-1.5 0,0 6,6 6,6 0,0 -4.5,6 -4.5,6 0,0 -1.185,33 -1.185,33 1.05,7.38 7.05,14.475 6.465,21 -0.48,5.37 -3.51,8.715 -8.28,10.5 0,0 1.5,7.5 1.5,7.5 0,0 -7.5,-4.5 -7.5,-4.5 0,0 -1.5,9 -1.5,9 0,0 -5.61,1.35 -5.61,1.35 0,0 -19.89,18.51 -19.89,18.51 0,0 -16.5,9.45 -16.5,9.45 0,0 -10.485,5.64 -10.485,5.64 0,0 -2.865,10.05 -2.865,10.05 0,0 -5.16,25.5 -5.16,25.5 0,0 7.545,13.5 7.545,13.5 0,0 4.305,18 4.305,18 0,0 -1.65,25.5 -1.65,25.5 0,0 3.48,19.5 3.48,19.5 0,0 4.365,16.5 4.365,16.5 0,0 -4.275,16.5 -4.275,16.5 0,0 -1.515,13.245 -1.515,13.245 0,0 -22.245,21.255 -22.245,21.255 -1.905,-0.405 -3.885,-0.675 -5.685,-1.485 -4.47,-2.025 -8.055,-8.355 -5.145,-12.945 3.45,-5.445 11.085,-5.025 16.83,-17.07 0,0 -6,-1.5 -6,-1.5 0,0 10.5,-16.5 10.5,-16.5 -13.335,-4.56 -12.405,-11.475 -17.205,-22.5 -4.23,-9.72 -8.985,-10.545 -11.745,-16.635 -4.755,-10.455 1.14,-13.98 -8.55,-26.865 -2.385,10.425 -3.72,10.695 -7.425,19.5 0,0 -12.945,40.5 -12.945,40.5 -0.6,6.93 4.26,15 5.085,22.5 0.96,8.535 -1.29,13.485 3.555,22.365 5.16,9.48 14.385,8.085 19.02,11.535 3.84,2.865 4.815,6.795 6.21,11.1 -12.555,6.51 -13.83,6.87 -27,2.82 -3,-0.915 -7.62,-2.1 -10.035,-4.08 -3.9,-3.195 -3.105,-7.23 -6.195,-13.74 -7.155,-15.015 -12.18,-15.21 -12.405,-34.5 0,0 0,-12 0,-12 -1.17,-8.655 -4.05,-11.085 -2.415,-22.5 0,0 5.1,-24.855 5.1,-24.855 0,0 5.505,-11.4 5.505,-11.4 2.715,-10.89 -6.18,-12.66 -3.555,-25.245 0,0 -4.5,-3 -4.5,-3 0,0 10.5,-1.5 10.5,-1.5 0,0 -9,-6 -9,-6 0,0 10.5,0 10.5,0 0,0 -6,-4.5 -6,-4.5 0,0 0,-4.5 0,-4.5 0,0 6,-1.5 6,-1.5 0,0 -1.5,-4.5 -1.5,-4.5 0,0 -6,3 -6,3 0,0 10.5,-13.5 10.5,-13.5 0,0 -7.5,1.5 -7.5,1.5 0,0 3,-9 3,-9 -13.245,-0.84 -10.365,2.97 -21,6 0,0 0,-7.5 0,-7.5 0,0 -3,3 -3,3 0,0 -1.5,0 -1.5,0 0,0 -4.5,-4.5 -4.5,-4.5 0,0 0,6 0,6 4.02,1.38 5.37,1.485 4.5,6 0,0 -4.5,-4.5 -4.5,-4.5 0,0 -1.5,19.5 -1.5,19.5 -6.285,-2.58 -5.715,-8.91 -6,-15 0,0 -10.5,12 -10.5,12 0,0 -7.5,-3 -7.5,-3 0,0 1.5,6 1.5,6 -4.86,-3.255 -4.305,-4.92 -4.5,-10.5 0,0 -3,0 -3,0 0,7.89 2.625,17.985 -6,21 0,0 1.5,-10.5 1.5,-10.5 0,0 -6,0 -6,0 0,0 4.5,-18 4.5,-18 0,0 -3,0 -3,0 0,0 -4.5,19.5 -4.5,19.5 0,0 -9,1.5 -9,1.5 0,0 -1.5,4.5 -1.5,4.5 -11.535,-4.035 -0.855,-9.99 -9,-19.5 0,0 -3,21 -3,21 -5.595,-3.75 -4.47,-7.275 -4.5,-13.5 0,0 -4.5,-3 -4.5,-3 -8.475,3.135 -10.26,-1.245 -9,-9 -9.78,8.325 -4.5,13.185 -11.145,20.67 -3.75,4.23 -7.86,4.53 -12.435,8.445 -5.925,5.1 -21.075,23.925 -25.89,30.885 -2.865,4.155 -8.97,11.91 -8.895,16.92 0,0 4.125,22.08 4.125,22.08 1.53,11.655 1.215,32.685 7.935,41.79 4.92,6.66 11.28,5.025 17.49,10.185 4.035,3.345 7.86,10.305 1.575,13.635 -2.28,1.2 -4.8,0.915 -7.26,0.75 -3.45,-0.24 -7.335,-0.585 -10.485,-2.07 -5.58,-2.61 -17.745,-15.15 -19.905,-20.79 -1.98,-5.16 -0.015,-9.87 -4.11,-18 -2.805,-5.595 -5.715,-8.19 -10.2,-12 1.185,-6.12 1.875,-11.79 0,-18 -3.21,-13.665 -15.72,-26.595 1.2,-36 0,0 -1.5,-4.5 -1.5,-4.5 0,0 6,-1.5 6,-1.5 0,0 -3,-6 -3,-6 0,0 4.5,-3 4.5,-3 0,0 -4.5,-1.5 -4.5,-1.5 0,0 0,-3 0,-3 0,0 7.5,-1.5 7.5,-1.5 -8.97,-11.46 -0.75,-8.925 -1.5,-22.5 0,0 -31.5,22.5 -31.5,22.5 -7.2,5.19 -9.075,8.61 -17.999998,10.5 8.519998,11.805 25.454998,28.215 23.999998,43.5 -10.185,-6.21 -16.755,-9.165 -25.034998,-18.255 -2.505,-2.745 -6.614996,-9.72 -10.799996,-9.105 -4.89,0.72 -6.87,14.13 -7.83,18.36 -0.87,3.795 -1.29,8.565 -2.715,12 0,0 -5.595,10.5 -5.595,10.5 -3.705,8.265 -5.145,21.57 -1.485,30 8.715,20.025 26.654996,1.335 29.459996,25.5 -5.46,1.725 -11.144996,5.685 -16.499996,5.355 -17.7,-1.08 -25.215,-15.015 -31.5,-29.355 -2.01,-4.56 -5.4,-10.125 -5.67,-15 0,0 9.045,-43.5 9.045,-43.5 2.445,-15.06 -1.815,-24.12 7.125,-37.5 -2.82,-3.15 -3.96,-5.49 -6.165,-9 -6.9,-11.01 -7.29,-9.15 -7.335,-22.5 0,0 -6,0 -6,0 0,0 3,-9 3,-9 -7.185,-2.985 -3.57,-13.425 -2.04,-19.5 0,0 9.3,-24.735 9.3,-24.735 0,0 6.345,-7.035 6.345,-7.035 0,0 4.155,-7.995 4.155,-7.995 3.9,-4.83 5.295,-2.31 7.74,-9.735 0,0 16.5,-7.5 16.5,-7.5 0,0 -1.5,-7.5 -1.5,-7.5 0,0 1.5,-1.5 1.5,-1.5 17.099994,1.725 14.834996,-19.8 28.499994,-13.5 0,0 4.5,-7.5 4.5,-7.5 18.855,0.33 10.545,-16.575 30,-26.43 17.955,-9.12 39,-9.3 58.5,-10.995 0,0 18,-1.35 18,-1.35 0,0 18,0 18,0 0,0 13.5,2.64 13.5,2.64 0,0 27,2.04 27,2.04 9.435,1.83 13.575,8.565 37.5,8.595 10.83,0.015 24.48,0.495 34.5,-4.14 11.64,-5.385 18.345,-16.62 39,-17.085 3.735,0.18 13.65,0.87 16.47,0 10.77,-4.47 13.155,-23.01 16.11,-32.775 0,0 7.275,-19.50003 7.275,-19.50003 0,0 -3.6,-33 -3.6,-33 -0.72,-7.695 0.495,-9.765 0.975,-16.5 0.345,-5.01 -0.825,-10.005 -1.23,-15 0,0 7.5,-1.5 7.5,-1.5 0,0 -6,-5.999999 -6,-5.999999 0,0 6,1.5 6,1.5 z m -322.5,214.500029 c 0,0 -13.5,-1.5 -13.5,-1.5 0,0 -4.499998,9 -4.499998,9 0,0 -3,0 -3,0 0,0 -4.499996,-6 -4.499996,-6 0,0 -7.5,15 -7.5,15 0,0 -3,0 -3,0 0,0 -4.5,-6 -4.5,-6 0,0 -1.5,16.5 -1.5,16.5 -7.935,1.365 -7.305,4.725 -7.5,12 0,0 -4.5,-1.5 -4.5,-1.5 -1.74,6.15 -1.17,22.59 1.275,28.44 1.725,4.125 13.11,18.165 16.725,21.06 3.765,-8.67 4.5,-11.265 13.499996,-15 0,0 -1.499996,-6 -1.499996,-6 0,0 5.999996,0 5.999996,0 0.525,-6.405 0.555,-8.625 7.499998,-9 0,0 1.5,-1.5 1.5,-1.5 -3.33,-9.21 -3.195,-12.63 7.5,-13.5 0,0 -1.5,-7.5 -1.5,-7.5 0,0 -7.5,1.5 -7.5,1.5 0,0 2.88,-15 2.88,-15 0,0 0,-10.5 0,-10.5 0,0 7.62,-10.5 7.62,-10.5 z m 166.5,60 c -2.775,-3.66 -2.94,-3.09 -7.5,-3 0.51,6.21 0.435,7.365 6,10.5 -1.215,-4.29 -2.025,-4.59 1.5,-7.5 z m 57,15 c 0,0 -1.5,0 -1.5,0 0,0 1.5,1.5 1.5,1.5 0,0 0,-1.5 0,-1.5 z" - style="fill:#000000;stroke:#f4e3d7" /> + style="fill:#000000;stroke:none" /> diff --git a/icons/creatures/mule.svg b/icons/creatures/mule.svg new file mode 100644 index 00000000..acf6cec2 --- /dev/null +++ b/icons/creatures/mule.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/packs/animaux.db b/packs/animaux.db index 12497af5..af4836c4 100644 --- a/packs/animaux.db +++ b/packs/animaux.db @@ -25,6 +25,7 @@ {"_id":"eGvgsF9uiR4vKLB2","name":"Quileurbist","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"creature","data":{"carac":{"taille":{"type":"number","value":"14","label":"Taille","xp":0,"derivee":false},"constitution":{"type":"number","value":"14","label":"Constitution","xp":0,"derivee":false},"force":{"type":"number","value":"18","label":"Force","xp":0,"derivee":false},"perception":{"type":"number","value":"10","label":"Perception","xp":0,"derivee":false},"volonte":{"type":"number","value":"10","label":"Volonté","xp":0,"derivee":false},"reve":{"type":"number","value":"10","label":"Rêve","xp":0,"derivee":false}},"sante":{"vie":{"type":"number","max":14,"value":14,"label":"Vie","derivee":false},"endurance":{"type":"number","max":28,"value":28,"label":"Endurance","derivee":false},"sonne":{"value":false,"label":"Sonné"}},"blessures":{"legeres":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"graves":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"critiques":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]}},"attributs":{"plusdom":{"type":"number","value":"+3","label":"+dom","derivee":true},"vitesse":{"type":"string","value":"14/28","label":"Vitesse","derivee":true},"encombrement":{"type":"number","value":"0","label":"Encombrement","derivee":false},"protection":{"type":"number","value":"5","label":"Protection","derivee":false}},"compteurs":{"etat":{"value":0,"label":"Etat général"},"surenc":{"value":0,"label":"Sur-encombrement"}},"description":"

Description

\n

Le quileurbist est une créature simiesque recouverte d’une carapace d’écailles hérissées de piquants. Sa tête plate et triangulaire est dotée d’une large mâchoire plantée de crocs, et ses bras plutôt longs se terminent par des pattes plantées de griffes acérées. Comme les grands singes, il se tient en position semi-verticale. Son cri, rauque et guttural, ressemble à la syllabe kill, d’où, d’après Paranos le Moindre, l’origine de son nom. Il fait en moyenne 1m85 pour 100 kg.

\n

Mœurs

\n

Le quileurbist n’a pas d’habitat spécifique, encore qu’on le rencontre surtout dans les collines rocheuses et peu boisées, mais vagabond itinérant, il change souvent de lieu. Il faut dire que partout où se trouve un quileurbist, la région se dépeuple de toute autre vie animale. La créature semble en effet n’avoir qu’une vocation\" : tuer, déchirer, éventrer, massacrer toutes les autres formes de vie. Le quileurbist résiste automatiquement au sort de Non-Agressivité d’Hypnos. En combat, ses réussites particulières sont toujours passées en rapidité.

","notesmj":"Notes du MJ","competencecreature[0]":{"data":{"carac_value":"12"}},"competencecreature[0]]":{"data":{"dommages":"+0"}},"competencecreature[1]":{"data":{"carac_value":"15"}},"competencecreature[1]]":{"data":{"dommages":"+0"}},"competencecreature[2]":{"data":{"carac_value":"12"}},"competencecreature[2]]":{"data":{"dommages":"+0"}},"competencecreature[3]":{"data":{"carac_value":"15"}},"competencecreature[3]]":{"data":{"dommages":"+2"}},"competencecreature[4]":{"data":{"carac_value":"10"}},"competencecreature[4]]":{"data":{"dommages":"+0"}},"competencecreature[5]":{"data":{"carac_value":"15"}},"competencecreature[5]]":{"data":{"dommages":"+0"}}},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/creatures/quileurbist.svg","token":{"flags":{},"name":"Quileurbist","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/creatures/quileurbist.svg","tint":null,"width":1,"height":1,"scale":1,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightAlpha":1,"lightAnimation":{"speed":5,"intensity":5},"actorId":"eGvgsF9uiR4vKLB2","actorLink":false,"disposition":-1,"displayBars":0,"bar1":{},"bar2":{},"randomImg":false},"items":[{"_id":"shsUV8UpU18c0RJK","name":"Course","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":12,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":400000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_course.png","effects":[]},{"_id":"4GmpkphbsmQjvVVK","name":"Escalade","type":"competencecreature","data":{"categorie_parade":"","niveau":5,"default_diffLibre":0,"carac_value":15,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":800000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_escalade.png","effects":[]},{"_id":"CYpxxf1uTa78NWR9","name":"Esquive","type":"competencecreature","data":{"categorie_parade":"","niveau":5,"default_diffLibre":0,"carac_value":12,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":850000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.png","effects":[]},{"_id":"BjqRrGtHtTzuNpZB","name":"Griffes et Crocs","type":"competencecreature","data":{"categorie_parade":"","niveau":5,"default_diffLibre":0,"carac_value":15,"iscombat":true,"isparade":false,"dommages":2,"description":""},"sort":900000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.png","effects":[]},{"_id":"lzEdMrKXbOYrWG5S","name":"Vigilance","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":1800000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]},{"_id":"8O8e3Msr2KPZqwkY","name":"Saut","type":"competencecreature","data":{"categorie_parade":"","niveau":5,"default_diffLibre":0,"carac_value":15,"iscombat":false,"isparade":false,"dommages":0,"description":null},"sort":1900000,"flags":{"core":{"sourceId":"Item.JZDgJ7ySiV84llkK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_saut.png","effects":[]}],"effects":[]} {"_id":"f31jeCsQgw3hWjk6","name":"Furlong","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"creature","data":{"carac":{"taille":{"type":"number","value":"7","label":"Taille","xp":0,"derivee":false},"constitution":{"type":"number","value":"12","label":"Constitution","xp":0,"derivee":false},"force":{"type":"number","value":"11","label":"Force","xp":0,"derivee":false},"perception":{"type":"number","value":"13","label":"Perception","xp":0,"derivee":false},"volonte":{"type":"number","value":"10","label":"Volonté","xp":0,"derivee":false},"reve":{"type":"number","value":"10","label":"Rêve","xp":0,"derivee":false}},"sante":{"vie":{"type":"number","max":10,"value":10,"label":"Vie","derivee":false},"endurance":{"type":"number","max":22,"value":22,"label":"Endurance","derivee":false},"sonne":{"value":false,"label":"Sonné"}},"blessures":{"legeres":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"graves":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"critiques":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]}},"attributs":{"plusdom":{"type":"number","value":"+0","label":"+dom","derivee":true},"vitesse":{"type":"string","value":"12/30","label":"Vitesse","derivee":true},"encombrement":{"type":"number","value":"0","label":"Encombrement","derivee":false},"protection":{"type":"number","value":"0","label":"Protection","derivee":false}},"compteurs":{"etat":{"value":0,"label":"Etat général"},"surenc":{"value":0,"label":"Sur-encombrement"}},"description":"

Description

\n

Le furlong est un carnassier des forêts, au corps très allongé, presque serpentin, pourvu de huit pattes. Hormis ce nombre de pattes curieusement excédentaire (4 de chaque côté), qui lui donne l’air d’une chenille à fourrure, il pourrait ressembler à un long, très long vison. Adulte, il mesure en moyenne 2 m du museau au bout de la queue, pour un poids de 50 kg.

\n

Mœurs

\n

Très bon grimpeur, le furlong vit essentiellement dans les arbres où il se coule de branche en branche avec la rapidité et l’efficacité d’un serpent. Ses proies de prédilection sont les oiseaux et les rongeurs, mais poussé par la faim, il peut s’attaquer à des animaux aussi gros que les chevreuils, voire aux humains isolés. La fourrure de furlong est très recherchée.

","notesmj":"Notes du MJ","competencecreature[0]":{"data":{"carac_value":"10"}},"competencecreature[0]]":{"data":{"dommages":"+0"}},"competencecreature[1]":{"data":{"carac_value":"14"}},"competencecreature[1]]":{"data":{"dommages":"+0"}},"competencecreature[2]":{"data":{"carac_value":"14"}},"competencecreature[2]]":{"data":{"dommages":"+0"}},"competencecreature[3]":{"data":{"carac_value":"12"}},"competencecreature[3]]":{"data":{"dommages":"+0"}},"competencecreature[4]":{"data":{"carac_value":"12"}},"competencecreature[4]]":{"data":{"dommages":"+1"}},"competencecreature[5]":{"data":{"carac_value":"13"}},"competencecreature[5]]":{"data":{"dommages":"+0"}}},"sort":100001,"flags":{"core":{"sheetClass":"wfrp4e.RdDActorCreatureSheet"}},"img":"systems/foundryvtt-reve-de-dragon/icons/creatures/furlong.svg","token":{"flags":{},"name":"Furlong","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/creatures/furlong.svg","tint":null,"width":1,"height":1,"scale":1,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightAlpha":1,"lightAnimation":{"speed":5,"intensity":5},"actorId":"f31jeCsQgw3hWjk6","actorLink":false,"disposition":-1,"displayBars":0,"bar1":{},"bar2":{},"randomImg":false},"items":[{"_id":"shsUV8UpU18c0RJK","name":"Course","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":100000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_course.png","effects":[]},{"_id":"yDHZfK4RmwQW4YaW","name":"Discrétion","type":"competencecreature","data":{"categorie_parade":"","niveau":5,"default_diffLibre":0,"carac_value":14,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":200000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_discretion.png","effects":[]},{"_id":"4GmpkphbsmQjvVVK","name":"Escalade","type":"competencecreature","data":{"categorie_parade":"","niveau":5,"default_diffLibre":0,"carac_value":14,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":300000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_escalade.png","effects":[]},{"_id":"CYpxxf1uTa78NWR9","name":"Esquive","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":12,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":400000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.png","effects":[]},{"_id":"6DK46pyO0hzEuuUg","name":"Morsure","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":12,"iscombat":true,"isparade":false,"dommages":1,"description":""},"sort":500000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.png","effects":[]},{"_id":"lzEdMrKXbOYrWG5S","name":"Vigilance","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":13,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":600000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]}],"effects":[]} {"_id":"f6wzOaOzdwy51prt","name":"Goule","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"creature","data":{"carac":{"taille":{"type":"number","value":"11","label":"Taille","xp":0,"derivee":false},"constitution":{"type":"number","value":"14","label":"Constitution","xp":0,"derivee":false},"force":{"type":"number","value":"13","label":"Force","xp":0,"derivee":false},"perception":{"type":"number","value":"10","label":"Perception","xp":0,"derivee":false},"volonte":{"type":"number","value":"7","label":"Volonté","xp":0,"derivee":false},"reve":{"type":"number","value":"10","label":"Rêve","xp":0,"derivee":false}},"sante":{"vie":{"type":"number","max":13,"value":13,"label":"Vie","derivee":false},"endurance":{"type":"number","max":27,"value":27,"label":"Endurance","derivee":false},"sonne":{"value":false,"label":"Sonné"}},"blessures":{"legeres":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"graves":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"critiques":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]}},"attributs":{"plusdom":{"type":"number","value":"+1","label":"+dom","derivee":true},"vitesse":{"type":"string","value":"12/24","label":"Vitesse","derivee":true},"encombrement":{"type":"number","value":"0","label":"Encombrement","derivee":false},"protection":{"type":"number","value":"0","label":"Protection","derivee":false}},"compteurs":{"etat":{"value":0,"label":"Etat général"},"surenc":{"value":0,"label":"Sur-encombrement"}},"description":"

Description

\n

Créature anthropomorphe, bipède et verticale, la goule ressemble à un cadavre décharné. Sa taille est celle d’un homme. Son cri, un hurlement rauque, glace le sang. Ses griffes sont particulièrement puissantes.

\n

Mœurs

\n

La goule est un charognard ayant une prédilection pour la chair humaine. Elle hante nécropoles, cimetières et champs de bataille, déterrant les cadavres dont elle se nourrit. Paranos le Moindre affirme qu’elle possède la faculté thanataire de pouvoir jeûner des mois entiers, voire des années, en n’absorbant qu’un peu de terre. Cela ne l’empêche pas de désirer ardemment de la chair, bien au contraire. Et si elle est lâche isolée, elle est très agressive en bande. Pour corser le tout, sa morsure inocule un venin qui paralyse.

\n

Venin

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Malignité6
Périodicité1 round
Dommages1 ligne de fatigue
Antidotes-4 \\ Floume-dhu +16
\n

La paralysie intervient quand toutes les lignes de fatigue sont pleines et dure 6 heures.

\n

Le floume-dhu est obtenu en mélangeant en quantités égales gelée de floumette et lait humain (pour une dose\": une demi-mesure de chaque). Puis chauffer le mélange jusqu’à couleur bleu-sangue (-2).

","notesmj":"Notes du MJ","competencecreature[0]":{"data":{"carac_value":"10"}},"competencecreature[0]]":{"data":{"dommages":"+0"}},"competencecreature[1]":{"data":{"carac_value":"10"}},"competencecreature[1]]":{"data":{"dommages":"+0"}},"competencecreature[2]":{"data":{"carac_value":"10"}},"competencecreature[2]]":{"data":{"dommages":"+0"}},"competencecreature[3]":{"data":{"carac_value":"13"}},"competencecreature[3]]":{"data":{"dommages":"+1"}},"competencecreature[4]":{"data":{"carac_value":"10"}},"competencecreature[4]]":{"data":{"dommages":"+0"}}},"sort":100001,"flags":{},"img":"icons/svg/mystery-man.svg","token":{"flags":{},"name":"Goule","displayName":0,"img":"icons/svg/mystery-man.svg","tint":null,"width":1,"height":1,"scale":1,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightAlpha":1,"lightAnimation":{"speed":5,"intensity":5},"actorId":"f6wzOaOzdwy51prt","actorLink":false,"disposition":-1,"displayBars":0,"bar1":{},"bar2":{},"randomImg":false},"items":[{"_id":"shsUV8UpU18c0RJK","name":"Course","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":100000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_course.png","effects":[]},{"_id":"yDHZfK4RmwQW4YaW","name":"Discrétion","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":200000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_discretion.png","effects":[]},{"_id":"CYpxxf1uTa78NWR9","name":"Esquive","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":300000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.png","effects":[]},{"_id":"BjqRrGtHtTzuNpZB","name":"Griffes et Crocs","type":"competencecreature","data":{"categorie_parade":"","niveau":4,"default_diffLibre":0,"carac_value":13,"iscombat":true,"isparade":false,"dommages":1,"description":""},"sort":400000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.png","effects":[]},{"_id":"lzEdMrKXbOYrWG5S","name":"Vigilance","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":500000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]}],"effects":[]} +{"_id":"i7pvn7kgTwIdKYtP","name":"Mule","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"creature","data":{"carac":{"taille":{"type":"number","value":"23","label":"Taille","xp":0,"derivee":false},"constitution":{"type":"number","value":"17","label":"Constitution","xp":0,"derivee":false},"force":{"type":"number","value":"17","label":"Force","xp":0,"derivee":false},"perception":{"type":"number","value":"12","label":"Perception","xp":0,"derivee":false},"volonte":{"type":"number","value":"12","label":"Volonté","xp":0,"derivee":false},"reve":{"type":"number","value":"12","label":"Rêve","xp":0,"derivee":false}},"sante":{"vie":{"type":"number","max":20,"value":20,"label":"Vie","derivee":false},"endurance":{"type":"number","max":40,"value":40,"label":"Endurance","derivee":false},"sonne":{"value":false,"label":"Sonné"}},"blessures":{"legeres":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":"","loc":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":"","loc":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":"","loc":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":"","loc":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":"","loc":""}]},"graves":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":"","loc":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":"","loc":""}]},"critiques":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":"","loc":""}]}},"attributs":{"plusdom":{"type":"number","value":"+4","label":"+dom","derivee":true},"vitesse":{"type":"string","value":"12/40","label":"Vitesse","derivee":true},"encombrement":{"type":"number","value":"18","label":"Encombrement","derivee":false},"protection":{"type":"number","value":"1","label":"Protection","derivee":false}},"compteurs":{"etat":{"value":0,"label":"Etat général"},"surenc":{"value":0,"label":"Sur-encombrement"}},"description":"

Description

\n

La mule est une le croisement entre un cheval et une ânesse. Adulte, la mule pèse 300 kg pour 1m65 au garrot.

","notesmj":"Notes du MJ","competencecreature[0]":{"data":{"carac_value":"12","niveau":"+3"}},"competencecreature[0]]":{"data":{"dommages":"+0"}},"competencecreature[1]":{"data":{"carac_value":"8","niveau":"+3"}},"competencecreature[1]]":{"data":{"dommages":"+0"}},"competencecreature[2]":{"data":{"carac_value":"12","niveau":"+2"}},"competencecreature[2]]":{"data":{"dommages":"+1"}},"competencecreature[3]":{"data":{"carac_value":"12","niveau":"+0"}},"competencecreature[3]]":{"data":{"dommages":"+0"}},"competencecreature[4]":{"data":{"carac_value":"13","niveau":"+3"}},"competencecreature[4]]":{"data":{"dommages":"+3"}}},"sort":100001,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/creatures/mule.svg","token":{"flags":{},"name":"Mule","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/creatures/mule.svg","tint":"","width":2,"height":2,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"i7pvn7kgTwIdKYtP","actorLink":false,"disposition":0,"displayBars":0,"bar1":{"attribute":""},"bar2":{"attribute":""},"randomImg":false},"items":[{"_id":"shsUV8UpU18c0RJK","name":"Course","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":12,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":100000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_course.png","effects":[]},{"_id":"CYpxxf1uTa78NWR9","name":"Esquive","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":8,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":200000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.png","effects":[]},{"_id":"6DK46pyO0hzEuuUg","name":"Morsure","type":"competencecreature","data":{"categorie_parade":"","niveau":2,"default_diffLibre":0,"carac_value":12,"iscombat":true,"isparade":false,"dommages":1,"description":""},"sort":300000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.png","effects":[]},{"_id":"lzEdMrKXbOYrWG5S","name":"Vigilance","type":"competencecreature","data":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":12,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":400000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]},{"_id":"3MgAaUHeKGBcbyr5","name":"Coup de pied","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":13,"iscombat":true,"isparade":false,"dommages":3,"description":null},"sort":500000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.Zpl2Bi451vB3r91W"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-coup_de_pied.png","effects":[]}],"effects":[]} {"_id":"icS4ht40EGkUbUus","name":"Rananècre","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"creature","data":{"carac":{"taille":{"type":"number","value":"10","label":"Taille","xp":0,"derivee":false},"constitution":{"type":"number","value":"10","label":"Constitution","xp":0,"derivee":false},"force":{"type":"number","value":"10","label":"Force","xp":0,"derivee":false},"perception":{"type":"number","value":"10","label":"Perception","xp":0,"derivee":false},"volonte":{"type":"number","value":"10","label":"Volonté","xp":0,"derivee":false},"reve":{"type":"number","value":"10","label":"Rêve","xp":0,"derivee":false}},"sante":{"vie":{"type":"number","max":10,"value":10,"label":"Vie","derivee":false},"endurance":{"type":"number","max":10,"value":10,"label":"Endurance","derivee":false},"sonne":{"value":false,"label":"Sonné"}},"blessures":{"legeres":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"graves":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"critiques":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]}},"attributs":{"plusdom":{"type":"number","value":"0","label":"+dom","derivee":true},"vitesse":{"type":"string","value":"0","label":"Vitesse","derivee":true},"encombrement":{"type":"number","value":"0","label":"Encombrement","derivee":false},"protection":{"type":"number","value":"0","label":"Protection","derivee":false}},"compteurs":{"etat":{"value":0,"label":"Etat général"},"surenc":{"value":0,"label":"Sur-encombrement"}},"description":"

Description

\n

Le rananècre est un rat géant de la taille d’un chien, au pelage gris moisi, pesant en moyenne 35 kg. Sa morsure inocule une horrible maladie : la nécrophase.

\n

Mœurs

\n

Le rananècre vit dans les désolations, les anciennes ruines, partout où les courants lourds du cauchemar ont laissé leur empreinte. Sa présence s’accompagne souvent d’entités de cauchemar non incarnées (haines, désespoirs).

\n

Nécrophase

\n

Tout autour de la blessure, la chair s’enfle, vire au noir et se putréfie, puis l’ensemble du corps est gagné peu à peu. Si la mort survient, elle donne naissance à une entité de cauchemar non incarnée ayant le même nombre de points de rêve que la caractéristique RÊVE de la victime. Tirer 1d2 : 1 = haine ; 2 = désespoir.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Malignité7
Périodicité1 heure
Dommages-2 points de vie
Antidotes-4 \\ Tournegraisse +16, Huile de Sélikanthe +6
\n

 

","notesmj":"Notes du MJ","competencecreature[0]":{"data":{"carac_value":"11","niveau":"+3"}},"competencecreature[0]]":{"data":{"dommages":"+1"}},"competencecreature[1]":{"data":{"carac_value":"10","niveau":"+2"}},"competencecreature[1]]":{"data":{"dommages":"+0"}},"competencecreature[2]":{"data":{"carac_value":"11","niveau":"+3"}},"competencecreature[2]]":{"data":{"dommages":"+0"}},"competencecreature[3]":{"data":{"carac_value":"10","niveau":"+3"}},"competencecreature[3]]":{"data":{"dommages":"+0"}},"competencecreature[4]":{"data":{"carac_value":"10","niveau":"+3"}},"competencecreature[4]]":{"data":{"dommages":"+0"}}},"sort":100001,"flags":{},"img":"icons/svg/mystery-man.svg","token":{"flags":{},"name":"Quileurbist","displayName":0,"img":"icons/svg/mystery-man.svg","tint":null,"width":1,"height":1,"scale":1,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightAlpha":1,"lightAnimation":{"speed":5,"intensity":5},"actorId":"icS4ht40EGkUbUus","actorLink":false,"disposition":-1,"displayBars":0,"bar1":{},"bar2":{},"randomImg":false},"items":[{"_id":"0z35nbSeViandim4","name":"Morsure (maladie)","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":11,"iscombat":true,"isparade":false,"dommages":1,"description":""},"sort":100000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.6DK46pyO0hzEuuUg"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.png","effects":[]},{"_id":"w1BjJ6evq83ZMieY","name":"Esquive","type":"competencecreature","data":{"categorie_parade":"","niveau":2,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":200000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.CYpxxf1uTa78NWR9"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.png","effects":[]},{"_id":"dv9QLfHGa5ZwDN7l","name":"Course","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":11,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":300000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.shsUV8UpU18c0RJK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_course.png","effects":[]},{"_id":"VdLbNp5bz8hU6KDl","name":"Discrétion","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":400000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.yDHZfK4RmwQW4YaW"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_discretion.png","effects":[]},{"_id":"TXC25fwUDxF6Qp5A","name":"Vigilance","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":500000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.lzEdMrKXbOYrWG5S"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]}],"effects":[]} {"_id":"igtHarwizNIUhd8M","name":"Glipzouk","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"creature","data":{"carac":{"taille":{"type":"number","value":"6","label":"Taille","xp":0,"derivee":false},"constitution":{"type":"number","value":"10","label":"Constitution","xp":0,"derivee":false},"force":{"type":"number","value":"9","label":"Force","xp":0,"derivee":false},"perception":{"type":"number","value":"14","label":"Perception","xp":0,"derivee":false},"volonte":{"type":"number","value":"11","label":"Volonté","xp":0,"derivee":false},"reve":{"type":"number","value":"12","label":"Rêve","xp":0,"derivee":false}},"sante":{"vie":{"type":"number","max":8,"value":8,"label":"Vie","derivee":false},"endurance":{"type":"number","max":18,"value":18,"label":"Endurance","derivee":false},"sonne":{"value":false,"label":"Sonné"}},"blessures":{"legeres":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"graves":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"critiques":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]}},"attributs":{"plusdom":{"type":"number","value":"-1","label":"+dom","derivee":true},"vitesse":{"type":"string","value":"12/26","label":"Vitesse","derivee":true},"encombrement":{"type":"number","value":"0","label":"Encombrement","derivee":false},"protection":{"type":"number","value":"0","label":"Protection","derivee":false}},"compteurs":{"etat":{"value":0,"label":"Etat général"},"surenc":{"value":0,"label":"Sur-encombrement"}},"description":"

Manque

\n

Saut

\n

Description

\n

Le glipzouk, ou singe vert, a la morphologie générale du ouistiti, membres minces et longue queue préhensile, avec un pelage uniformément vert amande, sauf le museau et le ventre qui sont blancs. Des épaules à la naissance de la queue, il mesure 1 m en moyenne, la queue pouvant, elle, atteindre le double. Ses quatre mains sont extrêmement habiles, et comme tous les singes, il est d’une agilité diabolique. Le glipzouk doit son nom à son «langage». On dirait presque un véritable parler, avec des syllabes articulées et une intonation générale, sauf que glip et zouk sont les seuls phonèmes qu’il emploie, en les prononçant sur tous les tons et en les mélangeant en d’infinies variations.

\n

Mœurs

\n

Paisibles, les colonies de glipzouks vivent en milieu boisé, se nourrissant de pousses et de fruits. Très bon observateur et non moins excellent imitateur, le glipzouk est un voleur et un pickpocket né. Il vaut mieux éviter de laisser traîner ses a!aires quand on voyage dans une région peuplée de glipzouks, et la nuit, être particulièrement vigilant en montant la garde. Non agressif, le glipzouk ne se bat que s’il est acculé sans pouvoir fuir.

","notesmj":"Notes du MJ","competencecreature[0]":{"data":{"carac_value":"10"}},"competencecreature[0]]":{"data":{"dommages":"+1"}},"competencecreature[1]":{"data":{"carac_value":"15"}},"competencecreature[1]]":{"data":{"dommages":"+0"}},"competencecreature[2]":{"data":{"carac_value":"14"}},"competencecreature[2]]":{"data":{"dommages":"+0"}},"competencecreature[3]":{"data":{"carac_value":"14"}},"competencecreature[3]]":{"data":{"dommages":"+0"}},"competencecreature[4]":{"data":{"carac_value":"14"}},"competencecreature[4]]":{"data":{"dommages":"+0"}},"competencecreature[5]":{"data":{"carac_value":"15"}},"competencecreature[5]]":{"data":{"dommages":"+0"}},"competencecreature[6]":{"data":{"carac_value":"15"}},"competencecreature[6]]":{"data":{"dommages":"+0"}}},"sort":100001,"flags":{"core":{"sheetClass":"wfrp4e.RdDActorCreatureSheet"}},"img":"systems/foundryvtt-reve-de-dragon/icons/creatures/glipzouk.svg","token":{"flags":{},"name":"Glipzouk","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/creatures/glipzouk.svg","tint":null,"width":1,"height":1,"scale":1,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightAlpha":1,"lightAnimation":{"speed":5,"intensity":5},"actorId":"igtHarwizNIUhd8M","actorLink":false,"disposition":-1,"displayBars":0,"bar1":{},"bar2":{},"randomImg":false},"items":[{"_id":"bwJZ6nTLX9hohV7Q","name":"Morsure","type":"competencecreature","data":{"categorie_parade":"","niveau":1,"default_diffLibre":0,"carac_value":10,"iscombat":true,"isparade":false,"dommages":1,"description":""},"sort":100000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.6DK46pyO0hzEuuUg"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.png","effects":[]},{"_id":"7td0EmFMtpwNyWwo","name":"Esquive","type":"competencecreature","data":{"categorie_parade":"","niveau":6,"default_diffLibre":0,"carac_value":15,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":200000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.CYpxxf1uTa78NWR9"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.png","effects":[]},{"_id":"d2yxJ5c57vMatAQV","name":"Discrétion","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":14,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":300000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.yDHZfK4RmwQW4YaW"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_discretion.png","effects":[]},{"_id":"aGm8xRr55CPUo5rM","name":"Pickpocket","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":14,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":400000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.sUdXhpuVVOAlcVpo"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_pickpocket.png","effects":[]},{"_id":"bL7lL688cp1s1Vke","name":"Vigilance","type":"competencecreature","data":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":14,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":500000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.lzEdMrKXbOYrWG5S"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]},{"_id":"Fu61NMCeLxi9nfSD","name":"Course","type":"competencecreature","data":{"categorie_parade":"","niveau":6,"default_diffLibre":0,"carac_value":15,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":600000,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.shsUV8UpU18c0RJK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_course.png","effects":[]},{"_id":"uW9fTmhw6GBnf1e9","name":"Saut","type":"competencecreature","data":{"categorie_parade":"","niveau":6,"default_diffLibre":0,"carac_value":15,"iscombat":false,"isparade":false,"dommages":0,"description":null},"sort":700000,"flags":{"core":{"sourceId":"Item.JZDgJ7ySiV84llkK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_saut.png","effects":[]}],"effects":[]} {"_id":"kPDswxsWVnSYitfL","name":"Drakkule","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"creature","data":{"carac":{"taille":{"type":"number","value":"4","label":"Taille","xp":0,"derivee":false},"constitution":{"type":"number","value":"10","label":"Constitution","xp":0,"derivee":false},"force":{"type":"number","value":"8","label":"Force","xp":0,"derivee":false},"perception":{"type":"number","value":"12","label":"Perception","xp":0,"derivee":false},"volonte":{"type":"number","value":"7","label":"Volonté","xp":0,"derivee":false},"reve":{"type":"number","value":"7","label":"Rêve","xp":0,"derivee":false}},"sante":{"vie":{"type":"number","max":7,"value":7,"label":"Vie","derivee":false},"endurance":{"type":"number","max":17,"value":17,"label":"Endurance","derivee":false},"sonne":{"value":false,"label":"Sonné"}},"blessures":{"legeres":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"graves":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""},{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]},"critiques":{"liste":[{"active":false,"premiers_soins":0,"soins_complets":0,"jours":0,"localisation":""}]}},"attributs":{"plusdom":{"type":"number","value":"-1","label":"+dom","derivee":true},"vitesse":{"type":"string","value":"12/38","label":"Vitesse","derivee":true},"encombrement":{"type":"number","value":"0","label":"Encombrement","derivee":false},"protection":{"type":"number","value":"-3","label":"Protection","derivee":false}},"compteurs":{"etat":{"value":0,"label":"Etat général"},"surenc":{"value":0,"label":"Sur-encombrement"}},"description":"

Manque

\n

Contre, Esquive Vol

\n

Description

\n

Le drakkule, également surnommé chauve- souris dragon, est un énorme chiroptère vampire pouvant atteindre 20 kg pour 4 m d’envergure. Paranos le Moindre suggère que son surnom vient sûrement de ce que les mythiques Dragons du Premier Âge étaient censés posséder les mêmes grandes ailes membraneuses et le même goût du sang. Serions-nous alors dans un rêve de chauve-souris ? Je suppose que c’est encore une de vos plaisanteries, cher Paranos !

\n

Mœurs

\n

Comme les chauves-souris, les drakkules sont nocturnes, repliés le jour dans des cavernes ou autres lieux sombres, pour ne sortir chasser qu’à la tombée de la nuit. Comme pour la plupart des grands prédateurs, l’homme est pour eux une proie comme les autres.

\n

En combat, quand un drakkule réussit une particulière et cause au moins une blessure légère, il reste accroché à sa victime qui perd alors automatiquement 1d6 points d’endurance par round sous l’effet de la saignée. Quand l’endurance tombe à zéro, le drakkule continue à la vider de son sang à raison de 1d6 points de vie par round. Le drakkule ne se détache que blessé gravement ou sonné. Pour se dégager, la victime ne peut utiliser que Corps à corps (totaliser 2 points d’empoignade) ou une dague. Tant qu’il est accroché, le drakkule ne joue plus de jet d’attaque, puisqu’il cause des dommages automatiques, mais peut contrer empoignade ou attaque de dague par le battement de ses ailes.

","notesmj":"Notes du MJ","competencecreature[0]":{"data":{"carac_value":"10"}},"competencecreature[0]]":{"data":{"dommages":"+0"}},"competencecreature[1]":{"data":{"carac_value":"10"}},"competencecreature[1]]":{"data":{"dommages":"+0"}},"competencecreature[2]":{"data":{"carac_value":"10"}},"competencecreature[2]]":{"data":{"dommages":"+0"}}},"sort":100001,"flags":{"core":{"sheetClass":"wfrp4e.RdDActorCreatureSheet"}},"img":"systems/foundryvtt-reve-de-dragon/icons/creatures/drakkule.svg","token":{"flags":{},"name":"Drakkule","displayName":0,"img":"systems/foundryvtt-reve-de-dragon/icons/creatures/drakkule.svg","tint":null,"width":1,"height":1,"scale":1,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightAlpha":1,"lightAnimation":{"speed":5,"intensity":5},"actorId":"kPDswxsWVnSYitfL","actorLink":false,"disposition":-1,"displayBars":0,"bar1":{},"bar2":{},"randomImg":false},"items":[{"_id":"CYpxxf1uTa78NWR9","name":"Esquive","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":900000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.png","effects":[]},{"_id":"6DK46pyO0hzEuuUg","name":"Morsure","type":"competencecreature","data":{"categorie_parade":"","niveau":2,"default_diffLibre":0,"carac_value":10,"iscombat":true,"isparade":false,"dommages":0,"description":""},"sort":1150000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.png","effects":[]},{"_id":"Kt7WlB5Ui97X211z","name":"Vol","type":"competencecreature","data":{"categorie_parade":"","niveau":3,"default_diffLibre":0,"carac_value":10,"iscombat":false,"isparade":false,"dommages":0,"description":""},"sort":1900000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-vol.png","effects":[]}],"effects":[]} From 9fd7db2ccff3f24bfe79a35308b1e4f9fc9ee0a4 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 5 Feb 2021 01:38:40 +0100 Subject: [PATCH 03/26] Fixes nombreux sur tmr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rencontre sur case humide ne causait pas de maîtrise - détermination de la liste des tmrs par type à l'init (classify) - tirages aléatoire par type de tmr dans les commandes - amélioration de messages (nom de case) - fix expérience case humide - correction gestion des débordement - montées très laborieuses multiples - renommages et extraits méthodes - distinction de pos (x, y) vs coord (A1) --- module/actor-sheet.js | 5 +- module/actor-vehicule-sheet.js | 3 +- module/actor.js | 36 +++-- module/item-competencecreature.js | 2 +- module/item.js | 26 +--- module/misc.js | 20 ++- module/rdd-commands.js | 60 +++++--- module/rdd-tmr-dialog.js | 239 +++++++++++++++-------------- module/rdd-tmr-rencontre-dialog.js | 32 ++-- module/tmr-rencontres.js | 2 +- module/tmr-utility.js | 103 +++++-------- 11 files changed, 282 insertions(+), 246 deletions(-) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 6c7314f0..ef20bd34 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -9,6 +9,7 @@ import { RdDItem } from "./item.js"; import { RdDItemArme } from "./item-arme.js"; import { RdDItemCompetence } from "./item-competence.js"; import { RdDBonus } from "./rdd-bonus.js"; +import { Misc } from "./misc.js"; /* -------------------------------------------- */ export class RdDActorSheet extends ActorSheet { @@ -38,11 +39,11 @@ export class RdDActorSheet extends ActorSheet { data.data.showCompNiveauBase = this.options.showCompNiveauBase; data.data.montrerArchetype = this.options.montrerArchetype; - data.itemsByType = RdDItem.buildItemsClassification(data.items); + data.itemsByType = Misc.classify(data.items); // Competence per category data.data.competenceXPTotal = 0; - data.competenceByCategory = RdDItem.classify( + data.competenceByCategory = Misc.classify( data.itemsByType.competence, item => item.data.categorie, item => { diff --git a/module/actor-vehicule-sheet.js b/module/actor-vehicule-sheet.js index b9136a2b..0a2c90d7 100644 --- a/module/actor-vehicule-sheet.js +++ b/module/actor-vehicule-sheet.js @@ -6,6 +6,7 @@ import { RdDUtility } from "./rdd-utility.js"; import { HtmlUtility } from "./html-utility.js"; import { RdDItem } from "./item.js"; +import { Misc } from "./misc.js"; /* -------------------------------------------- */ export class RdDActorVehiculeSheet extends ActorSheet { @@ -36,7 +37,7 @@ export class RdDActorVehiculeSheet extends ActorSheet { getData() { let data = super.getData(); - data.itemsByType = RdDItem.buildItemsClassification(data.items); + data.itemsByType = Misc.classify(data.items); RdDUtility.filterItemsPerTypeForSheet(data); RdDUtility.buildArbreDeConteneur(this, data); diff --git a/module/actor.js b/module/actor.js index a22e56bf..fadb6bbb 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1,5 +1,5 @@ import { RdDUtility } from "./rdd-utility.js"; -import { TMRUtility } from "./tmr-utility.js"; +import { TMRType, TMRUtility } from "./tmr-utility.js"; import { RdDRollDialogEthylisme } from "./rdd-roll-ethylisme.js"; import { RdDRoll } from "./rdd-roll.js"; import { RdDTMRDialog } from "./rdd-tmr-dialog.js"; @@ -21,6 +21,7 @@ import { RdDAlchimie } from "./rdd-alchimie.js"; import { StatusEffects } from "./status-effects.js"; import { RdDItemCompetenceCreature } from "./item-competencecreature.js"; import { ReglesOptionelles } from "./regles-optionelles.js"; +import { RdDItem } from "./item.js"; /* -------------------------------------------- */ @@ -1837,22 +1838,25 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - checkIsAdditionnalHumide(cellDescr, coordTMR) { - let pontHumide = this.data.items.find(item => item.type == 'souffle' && item.name.toLowerCase().includes(' des ponts')); - if (pontHumide && cellDescr.type == 'pont') { + isCaseHumideAdditionelle(tmr) { + if (tmr.type == 'pont' && this.data.items.find(it => RdDItem.isSoufflePontImpraticable(it))) { ChatMessage.create({ - content: "Vous êtes sous le coup d'une Impraticabilité des Ponts : ils doivent être maîtrisés comme des cases humides.", + content: tmr.label +": Vous êtes sous le coup d'une Impraticabilité des Ponts : ce pont doit être maîtrisé comme une case humide.", whisper: ChatMessage.getWhisperRecipients(game.user.name) }); return true; } // Débordement ? - let debordementList = this.data.items.filter(item => item.type == 'casetmr' && item.data.specific == 'debordement'); - for (let caseTMR of debordementList) { - if (caseTMR.data.coord == coordTMR) - return true; + let isTmrInondee = this.data.items.filter(it => RdDItem.isCaseTMR(it)) + .filter(it => it.data.coord == tmr.coord) + .find(it => RdDItem.isCaseInnondee(it)); + if (isTmrInondee) { + ChatMessage.create({ + content: tmr.label +": cette case est inondée, elle doit être maîtrisée comme une case humide.", + whisper: ChatMessage.getWhisperRecipients(game.user.name) + }); + return true; } - return false; } @@ -2398,14 +2402,14 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - checkMonteeLaborieuse() { // Return +1 si la queue Montée Laborieuse est présente, 0 sinon - let monteLaborieuse = this.data.items.find(item => (item.type == 'queue' || item.type == 'souffle') && item.name.toLowerCase().includes('montée laborieuse')); - if (monteLaborieuse) { + checkMonteeLaborieuse() { // Return +1 par queue/ombre/souffle Montée Laborieuse présente + let countMonteLaborieuse = this.data.items.filter(item => (item.type == 'queue' || item.type == 'ombre' || item.type == 'souffle') && item.name.toLowerCase().includes('montée laborieuse')).length; + if (countMonteLaborieuse) { ChatMessage.create({ - content: "Vous êtes sous le coup d'une Montée Laborieuse : vos montées en TMR coûtent 1 Point de Rêve de plus.", + content: `Vous êtes sous le coup d'une Montée Laborieuse : vos montées en TMR coûtent ${countMonteLaborieuse} Point de Rêve de plus.`, whisper: ChatMessage.getWhisperRecipients(game.user.name) }); - return 1; + return countMonteLaborieuse; } return 0; } @@ -2414,7 +2418,7 @@ export class RdDActor extends Actor { refreshTMRView( tmrData ) { console.log("REFRESH !!!!"); if ( this.currentTMR ) { - this.currentTMR.forceDemiRevePositionView(tmrData.tmrPos); + this.currentTMR.forceDemiRevePositionView(); } } diff --git a/module/item-competencecreature.js b/module/item-competencecreature.js index 524d5829..67896acb 100644 --- a/module/item-competencecreature.js +++ b/module/item-competencecreature.js @@ -29,7 +29,7 @@ export class RdDItemCompetenceCreature extends Item { }); return arme; } - console.error("RdDItem.toArme(", item, ") : impossible de transformer l'Item en arme"); + console.error("RdDItemCompetenceCreature.toArme(", item, ") : impossible de transformer l'Item en arme"); return undefined; } diff --git a/module/item.js b/module/item.js index 46ad7721..988d3ecf 100644 --- a/module/item.js +++ b/module/item.js @@ -1,28 +1,18 @@ +import { Misc } from "./misc.js"; /* -------------------------------------------- */ export class RdDItem { - /* -------------------------------------------- */ - static buildItemsClassification(items) { - return RdDItem.classify(items, it => it.type) + static isSoufflePontImpraticable(item) { + return item.type == 'souffle' && item.name.toLowerCase().includes(' des ponts'); } - static classify(items, classifier = it => it.type, transform = it => it) { - let itemsBy = {}; - RdDItem.classifyInto(itemsBy, items, classifier, transform); - return itemsBy; + static isCaseInnondee(item) { + return RdDItem.isCaseTMR(item) && item.data.specific == 'debordement'; } - static classifyInto(itemsBy, items, classifier = it => it.type, transform = it => it) { - for (const item of items) { - const classification = classifier(item); - let list = itemsBy[classification]; - if (!list) { - list = []; - itemsBy[classification] = list; - } - list.push(transform(item)); - } - } + static isCaseTMR(item) { + return item.type == 'casetmr'; + } } \ No newline at end of file diff --git a/module/misc.js b/module/misc.js index 6b754e23..50566a09 100644 --- a/module/misc.js +++ b/module/misc.js @@ -1,5 +1,4 @@ - /** * This class is intended as a placeholder for utility methods unrelated * to actual classes of the game system or of FoundryVTT @@ -41,4 +40,23 @@ export class Misc { default: return '1/' + diviseur; } } + + static classify(items, classifier = it => it.type, transform = it => it) { + let itemsBy = {}; + Misc.classifyInto(itemsBy, items, classifier, transform); + return itemsBy; + } + + static classifyInto(itemsBy, items, classifier = it => it.type, transform = it => it) { + for (const item of items) { + const classification = classifier(item); + let list = itemsBy[classification]; + if (!list) { + list = []; + itemsBy[classification] = list; + } + list.push(transform(item)); + } + } + } \ No newline at end of file diff --git a/module/rdd-commands.js b/module/rdd-commands.js index f4bbcb47..f58eaec9 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -9,7 +9,7 @@ import { RdDRollResolutionTable } from "./rdd-roll-resolution-table.js"; import { RdDRollTables } from "./rdd-rolltables.js"; import { RdDUtility } from "./rdd-utility.js"; import { TMRRencontres } from "./tmr-rencontres.js"; -import { TMRUtility } from "./tmr-utility.js"; +import { TMRType, TMRUtility } from "./tmr-utility.js"; const rddRollNumeric = /(\d+)\s*([\+\-]?\d+)?\s*(s)?/; @@ -21,20 +21,23 @@ export class RdDCommands { const rddCommands = new RdDCommands(); rddCommands.registerCommand({ path: ["/aide"], func: (content, msg, params) => rddCommands.help(msg), descr: "Affiche l'aide pour toutes les commandes" }); rddCommands.registerCommand({ path: ["/help"], func: (content, msg, params) => rddCommands.help(msg), descr: "Affiche l'aide pour toutes les commandes" }); - rddCommands.registerCommand({ path: ["/table", "queues"], func: (content, msg, params) => RdDRollTables.getQueue(true), descr: "Tire une Queue de Dragon" }); - rddCommands.registerCommand({ path: ["/table", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre(true), descr: "Tire une Ombre de Dragon" }); - rddCommands.registerCommand({ path: ["/table", "tetehr"], func: (content, msg, params) => RdDRollTables.getTeteHR(true), descr: "Tire une Tête de Dragon pour Hauts Revants" }); - rddCommands.registerCommand({ path: ["/table", "tete"], func: (content, msg, params) => RdDRollTables.getTete(true), descr: "Tire une Tête de Dragon" }); - rddCommands.registerCommand({ path: ["/table", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle(true), descr: " Tire un Souffle de Dragon" }); - rddCommands.registerCommand({ path: ["/table", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot(true), descr: "Tire une carte du Tarot Draconique" }); + rddCommands.registerCommand({ path: ["/table", "queues"], func: (content, msg, params) => RdDRollTables.getQueue(), descr: "Tire une Queue de Dragon" }); + rddCommands.registerCommand({ path: ["/table", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre(), descr: "Tire une Ombre de Dragon" }); + rddCommands.registerCommand({ path: ["/table", "tetehr"], func: (content, msg, params) => RdDRollTables.getTeteHR(), descr: "Tire une Tête de Dragon pour Hauts Revants" }); + rddCommands.registerCommand({ path: ["/table", "tete"], func: (content, msg, params) => RdDRollTables.getTete(), descr: "Tire une Tête de Dragon" }); + rddCommands.registerCommand({ path: ["/table", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle(), descr: " Tire un Souffle de Dragon" }); + rddCommands.registerCommand({ path: ["/table", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot(), descr: "Tire une carte du Tarot Draconique" }); - rddCommands.registerCommand({ path: ["/tmra"], func: (content, msg, params) => TMRUtility.getTMRAleatoire(), descr: "Tire une case aléatoire des Terres médianes" }); + rddCommands.registerCommand({ + path: ["/tmra"], func: (content, msg, params) => rddCommands.getTMRAleatoire(msg, params), + descr: `Tire une case aléatoire des Terres médianes +
/tmra forêt détermine une 'forêt' aléatoire +
/tmra détermine une case aléatoire dans toutes les TMR` }); rddCommands.registerCommand({ path: ["/tmrr"], func: (content, msg, params) => rddCommands.getRencontreTMR(params), - descr: ` - Exemple: /tmrr foret lance un d100 et détermine la rencontre correspondante en 'forêt' - Exemple: /tmrr forêt 47 détermine la rencontre en 'forêt' pour un jet de dé de 47 - ` + descr: `Détermine une rencontre dans un type de case +
/tmrr foret lance un d100 et détermine la rencontre correspondante en 'forêt' +
/tmrr forêt 47 détermine la rencontre en 'forêt' pour un jet de dé de 47` }); rddCommands.registerCommand({ @@ -53,27 +56,24 @@ export class RdDCommands { rddCommands.registerCommand({ path: ["/rdd"], func: (content, msg, params) => rddCommands.rollRdd(msg, params), descr: `Effectue un jet de dés dans la table de résolution. Exemples: -
/rdd ouvre la table de résolution -
/rdd 10 3 effectue un jet 10 à +3 -
/rdd 10 +2 effectue un jet 10 à +2 -
/rdd 15 -2 effectue un jet 15 à -2 -
/rdd 15 0 s effectue un jet 15 à 0, avec significative requise - ` +
/rdd ouvre la table de résolution +
/rdd 10 3 effectue un jet 10 à +3 +
/rdd 10 +2 effectue un jet 10 à +2 +
/rdd 15 -2 effectue un jet 15 à -2 +
/rdd 15 0 s effectue un jet 15 à 0, avec significative requise` }); rddCommands.registerCommand({ path: ["/ddr"], func: (content, msg, params) => rddCommands.rollDeDraconique(msg), descr: "Lance un Dé Draconique" }); rddCommands.registerCommand({ path: ["/payer"], func: (content, msg, params) => RdDUtility.afficherDemandePayer(params[0], params[1]), descr: `Permet de payer un montant. Exemples: -
/payer 5s 10d permet d'envoyer un message pour payer 5 sols et 10 deniers -
/payer 10d permet d'envoyer un message pour payer 10 deniers - ` +
/payer 5s 10d permet d'envoyer un message pour payer 5 sols et 10 deniers +
/payer 10d permet d'envoyer un message pour payer 10 deniers` }); rddCommands.registerCommand({ path: ["/astro"], func: (content, msg, params) => RdDUtility.afficherHeuresChanceMalchance(params[0]), descr: `Affiche les heures de chance et de malchance selon l'heure de naissance donnée en argument. Exemples: -
/astro Lyre - ` +
/astro Lyre` }); game.system.rdd.commands = rddCommands; } @@ -185,7 +185,7 @@ export class RdDCommands { /* -------------------------------------------- */ async getRencontreTMR(params) { - if (params.length == 1 || params.length ==2) { + if (params.length == 1 || params.length == 2) { return TMRRencontres.rollRencontre(params[0], params[1]) } else { @@ -232,6 +232,18 @@ export class RdDCommands { RdDCommands._chatAnswer(msg, `Lancer d'un Dé draconique: ${ddr.total}`); } + getTMRAleatoire(msg, params) { + if (params.length < 2) { + let type = params[0]; + const tmr = TMRUtility.getTMRAleatoire(type); + RdDCommands._chatAnswer(msg, `Case aléatoire: ${tmr.coord} - ${tmr.label}`); + } + else { + return false; + } + } + + /* -------------------------------------------- */ getCoutXpComp(msg, params) { if (params && (params.length == 1 || params.length == 2)) { diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 61b9059e..9745a5f6 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -200,7 +200,6 @@ export class RdDTMRDialog extends Dialog { this.actor.deleteTMRRencontreAtPosition(); this.updatePreviousRencontres(); - let rencontreData = { actor: this.actor, alias: this.actor.name, @@ -248,20 +247,22 @@ export class RdDTMRDialog extends Dialog { rencontreData.nbRounds++; this.nbFatigue += 1; this._tentativeMaitrise(rencontreData); - setTimeout(() => this._deleteTmrMessages(rencontreData.actor, rencontreData.nbRounds), 500); + this._deleteTmrMessages(rencontreData.actor, rencontreData.nbRounds); }, 2000); } } _deleteTmrMessages(actor, nbRounds = -1) { - if (nbRounds < 0) { - ChatUtility.removeChatMessageContaining(`

`); + setTimeout(() => { + if (nbRounds < 0) { + ChatUtility.removeChatMessageContaining(`

`); + } + } + }, 500); } /* -------------------------------------------- */ @@ -275,38 +276,38 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - async manageRencontre(coordTMR, cellDescr) { + async manageRencontre(tmr, postRencontre) { if (this.viewOnly) { return; } this.currentRencontre = undefined; - let rencontre = await this._jetDeRencontre(coordTMR, cellDescr); + let rencontre = await this._jetDeRencontre(tmr); if (rencontre) { // Manages it if (rencontre.rencontre) rencontre = rencontre.rencontre; // Manage stored rencontres console.log("manageRencontre", rencontre); this.currentRencontre = duplicate(rencontre); - let dialog = new RdDTMRRencontreDialog("", this, this.currentRencontre); + let dialog = new RdDTMRRencontreDialog("", this, this.currentRencontre, postRencontre); dialog.render(true); } } /* -------------------------------------------- */ - async _jetDeRencontre(coordTMR, cellDescr) { + async _jetDeRencontre(tmr) { if (TMRUtility.isForceRencontre()) { - return await TMRUtility.rencontreTMRRoll(coordTMR, cellDescr); + return await TMRUtility.rencontreTMRRoll(tmr.coord, tmr); } - let rencontre = this.rencontresExistantes.find(prev => prev.coord == coordTMR); + let rencontre = this.rencontresExistantes.find(prev => prev.coord == tmr.coord); if (rencontre) { return rencontre; } let myRoll = new Roll("1d7").evaluate(); if (myRoll.total == 7) { let isMauvaise = this.actor.isRencontreSpeciale(); - return await TMRUtility.rencontreTMRRoll(coordTMR, cellDescr, isMauvaise); + return await TMRUtility.rencontreTMRRoll(tmr.coord, tmr, isMauvaise); } - this._tellToUser(myRoll.total + ": Pas de rencontre en " + cellDescr.label + " (" + coordTMR + ")"); + this._tellToUser(myRoll.total + ": Pas de rencontre en " + tmr.label + " (" + tmr.coord + ")"); } /* -------------------------------------------- */ @@ -330,13 +331,13 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - async manageCaseSpeciale(cellDescr, coordTMR) { + async manageCaseSpeciale(tmr) { for (let caseTMR of this.casesSpeciales) { - if (caseTMR.data.coord == coordTMR) { // Match ! + if (caseTMR.data.coord == tmr.coord) { // Match ! if (caseTMR.data.specific == 'trounoir') { let newTMR = TMRUtility.getTMRAleatoire(); let tmrPos = duplicate(this.actor.data.data.reve.tmrpos); - tmrPos.coord = newTMR; + tmrPos.coord = newTMR.coord; await this.actor.update({ "data.reve.tmrpos": tmrPos }); ChatMessage.create({ content: "Vous êtes rentré sur un Trou Noir : ré-insertion aléatoire.", @@ -349,12 +350,7 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ isCaseMaitrisee(coordTMR) { - for (let caseTMR of this.casesSpeciales) { - if (caseTMR.data.coord == coordTMR && caseTMR.data.specific == 'maitrisee') { - return true; - } - } - return false; + return this.casesSpeciales.find(it => it.data.coord = coordTMR && it.data.specific == 'maitrisee'); } /* -------------------------------------------- */ @@ -364,19 +360,11 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - async manageCaseHumide(cellDescr, coordTMR) { + async manageCaseHumide(tmr) { if (this.viewOnly || this.currentRencontre) { return; } - let isHumide = this.actor.checkIsAdditionnalHumide(cellDescr, coordTMR); - if (cellDescr.type == "lac" || cellDescr.type == "fleuve" || cellDescr.type == "marais" || isHumide) { - if (this.isCaseMaitrisee(coordTMR)) { - ChatMessage.create({ - content: "Cette case humide est déja maitrisée grâce à votre Tête Quête des Eaux", - whisper: ChatMessage.getWhisperRecipients(game.user.name) - }); - return; - } + if (this.isCaseHumide(tmr)) { // TODO: permettre de choisir la voie de draconic? let draconic = this.actor.getBestDraconic(); @@ -404,7 +392,7 @@ export class RdDTMRDialog extends Dialog { explication += "Vous êtes entré sur une case humide, et vous avez réussi votre maîtrise !" msg2MJ += game.user.name + " est rentré sur une case humides : Réussite !"; } - explication += "
Test : Rêve actuel / " + draconic.name + " / " + cellDescr.type + "" + explication += "
Test : Rêve actuel / " + draconic.name + " / " + tmr.type + "" + RdDResolutionTable.explain(rolled); if (rolled.isETotal) { @@ -414,7 +402,7 @@ export class RdDTMRDialog extends Dialog { } if (rolled.isPart) { explication += "
Vous avez fait une Réussite Particulière"; - this.actor._appliquerAjoutExperience({ rolled: rolled, seletedCarac: { label: 'reve' }, competence: draconic.name }) + this.actor._appliquerAjoutExperience({ rolled: rolled, selectedCarac: { label: 'reve' }, competence: draconic.name }) msg2MJ += "
Et a fait une réussite particulière"; } @@ -432,6 +420,21 @@ export class RdDTMRDialog extends Dialog { humideDiag.render(true); } } + + isCaseHumide(tmr) { + if (this.isCaseMaitrisee(tmr.coord)) { + ChatMessage.create({ + content: tmr.label + ": cette case humide est déja maitrisée grâce à votre Tête Quête des Eaux", + whisper: ChatMessage.getWhisperRecipients(game.user.name) + }); + return false; + } + if (this.actor.isCaseHumideAdditionelle(tmr)) { + return true; + } + return tmr.type == "lac" || tmr.type == "fleuve" || tmr.type == "marais"; + } + /* -------------------------------------------- */ isReserveExtensible(coordTMR) { for (let caseTMR of this.casesSpeciales) { @@ -537,60 +540,38 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - async deplacerDemiReve(event) { + async onClickTMR(event) { if (this.viewOnly) { return; } let origEvent = event.data.originalEvent; - let myself = event.target.tmrObject; + let tmrObject = event.target.tmrObject; - let eventCoord = RdDTMRDialog._computeEventCoord(origEvent); - let cellx = eventCoord.cellx; - let celly = eventCoord.celly; - console.log("deplacerDemiReve >>>>", cellx, celly); - let currentPos = TMRUtility.convertToCellCoord(myself.actor.data.data.reve.tmrpos.coord); - let coordTMR = TMRUtility.convertToTMRCoord(cellx, celly); - let currentTMR = TMRUtility.convertToTMRCoord(currentPos.x, currentPos.y); + let eventPos = RdDTMRDialog._computeEventPos(origEvent); + await tmrObject._onClickTMRPos(eventPos); // Vérifier l'état des compteurs reve/fatigue/vie + } + + async _onClickTMRPos(eventPos) { + let currentPos = TMRUtility.convertToCellPos(this.actor.data.data.reve.tmrpos.coord); + + console.log("deplacerDemiReve >>>>", currentPos, eventPos); + + let targetCoordTMR = TMRUtility.convertToTMRCoord(eventPos); + let currentCoordTMR = TMRUtility.convertToTMRCoord(currentPos); // Validation de la case de destination (gestion du cas des rencontres qui peuvent téléporter) let deplacementType = 'erreur'; - if (myself.rencontreState == 'aucune') { // Pas de recontre en post-processing, donc deplacement normal - if (!RdDTMRDialog._horsDePortee(currentPos, cellx, celly) || myself.isTerreAttache(coordTMR) || myself.checkConnaissanceFleuve(currentTMR, coordTMR)) { + if (this.rencontreState == 'aucune') { // Pas de recontre en post-processing, donc deplacement normal + if (!RdDTMRDialog._horsDePortee(currentPos, eventPos) || this.isTerreAttache(targetCoordTMR) || this.checkConnaissanceFleuve(currentCoordTMR, targetCoordTMR)) { deplacementType = 'normal'; } } else { - deplacementType = myself.processClickPostRencontre(coordTMR); + deplacementType = this.processClickPostRencontre(targetCoordTMR); } // Si le deplacement est valide if (deplacementType == 'normal' || deplacementType == 'saut') { - if (myself.currentRencontre != 'normal') - myself.nettoyerRencontre(); - let cellDescr = TMRUtility.getTMR(coordTMR); - - await myself.manageCaseSpeciale(cellDescr, coordTMR); // Gestion cases spéciales type Trou noir, etc - - console.log("deplacerDemiReve: TMR column is", coordTMR, cellx, celly, cellDescr, this); - - let tmrPos = duplicate(myself.actor.data.data.reve.tmrpos); - tmrPos.coord = coordTMR; - await myself.actor.update({ "data.reve.tmrpos": tmrPos }); - myself._updateDemiReve(myself); - myself.nbFatigue += 1; - myself.updateValuesDisplay(); - game.socket.emit("system.foundryvtt-reve-de-dragon", { - msg: "msg_tmr_move", data: { - actorId: myself.actor.data._id, - tmrPos: tmrPos - } - }); - - if (deplacementType == 'normal') { // Pas de rencontres après un saut de type passeur/changeur/... - await myself.manageRencontre(coordTMR, cellDescr); - } - await myself.manageCaseHumide(cellDescr, coordTMR); - await myself.declencheSortEnReserve(coordTMR); - await myself.actor.checkSoufflePeage(cellDescr); + await this._deplacerDemiReve(targetCoordTMR, deplacementType); } else if (deplacementType == 'messager') { // Dans ce cas, ouverture du lancement de sort sur la case visée /* @@ -598,29 +579,71 @@ export class RdDTMRDialog extends Dialog { Si la case est le demi-rêve, ne pas lancer de sort. Si un lancement de sort est en cours, trouver un moyen de réafficher cette fenêtre si on essaie de lancer un sort (ou bloquer le lancer de sort) */ - await myself.actor.rollUnSort(coordTMR); - myself.nettoyerRencontre(); + await this._messagerDemiReve(targetCoordTMR); } else { ui.notifications.error("Vous ne pouvez vous déplacer que sur des cases adjacentes à votre position ou valides dans le cas d'une rencontre"); - console.log("STATUS :", myself.rencontreState, myself.currentRencontre); + console.log("STATUS :", this.rencontreState, this.currentRencontre); } - myself.checkQuitterTMR(); // Vérifier l'état des compteurs reve/fatigue/vie + this.checkQuitterTMR(); + } + + async _messagerDemiReve(targetCoordTMR) { + await this.actor.rollUnSort(targetCoordTMR); + this.nettoyerRencontre(); + } + + async _deplacerDemiReve(targetCoord, deplacementType) { + if (this.currentRencontre != 'normal') { + this.nettoyerRencontre(); + } + let tmr = TMRUtility.getTMR(targetCoord); + + await this.manageCaseSpeciale(tmr); // Gestion cases spéciales type Trou noir, etc + + console.log("deplacerDemiReve: TMR is", tmr, this); + + let tmrPos = duplicate(this.actor.data.data.reve.tmrpos); + tmrPos.coord = targetCoord; + await this.actor.update({ "data.reve.tmrpos": tmrPos }); + + this._updateDemiReve(); + this.nbFatigue += 1; + this.updateValuesDisplay(); + game.socket.emit("system.foundryvtt-reve-de-dragon", { + msg: "msg_tmr_move", data: { + actorId: this.actor.data._id, + tmrPos: tmrPos + } + }); + + if (deplacementType == 'normal') { // Pas de rencontres après un saut de type passeur/changeur/... + await this.manageRencontre(tmr, () => this.postRencontre(tmr)); + } + else{ + await this.postRencontre(tmr); + } + } + + async postRencontre(tmr) { + await this.manageCaseHumide(tmr); + await this.declencheSortEnReserve(tmr.coord); + await this.actor.checkSoufflePeage(tmr); } /* -------------------------------------------- */ async forceDemiRevePositionView(coordTMR) { - this._updateDemiReve(this); + this._updateDemiReve(); } /* -------------------------------------------- */ async forceDemiRevePosition(coordTMR) { await this.actor.updateCoordTMR(coordTMR); - this._updateDemiReve(this); - let cellDescr = TMRUtility.getTMR(coordTMR); - this.manageCaseHumide(cellDescr, coordTMR); - await this.declencheSortEnReserve(coordTMR); + this._updateDemiReve(); + let tmr = TMRUtility.getTMR(coordTMR); + this.manageCaseHumide(tmr); + await this.declencheSortEnReserve(tmr.coord); } /* -------------------------------------------- */ @@ -661,7 +684,7 @@ export class RdDTMRDialog extends Dialog { mytmr.buttonMode = true; mytmr.tmrObject = this; if (!this.viewOnly) { - mytmr.on('pointerdown', this.deplacerDemiReve); + mytmr.on('pointerdown', this.onClickTMR); } this.pixiApp.stage.addChild(mytmr); @@ -676,42 +699,36 @@ export class RdDTMRDialog extends Dialog { } // Gestion du cout de montée en points de rêve - let reveCout = -1; - if (this.actor.checkTeteDeplacementAccelere()) { - reveCout = -1; - } else { - reveCout = (this.tmrdata.isRapide) ? -2 : -1; - } + let reveCout = (this.tmrdata.isRapide && !this.actor.checkTeteDeplacementAccelere()) ? -2 : -1; reveCout -= this.actor.checkMonteeLaborieuse(); await this.actor.reveActuelIncDec(reveCout); // Le reste... this.updateValuesDisplay(); - let coordTMR = this.actor.data.data.reve.tmrpos.coord; - let cellDescr = TMRUtility.getTMR(coordTMR); - await this.manageRencontre(coordTMR, cellDescr); - this.manageCaseHumide(cellDescr, coordTMR); - // Mise à jour du nb de cases de Fatigue - this.nbFatigue = this.actor.getTMRFatigue(); - this.actor.displayTMRQueueSouffleInformation(); + let tmr = TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord); + await this.manageRencontre(tmr, () => { + this.postRencontre(tmr); + this.nbFatigue = this.actor.getTMRFatigue(); + this.actor.displayTMRQueueSouffleInformation(); + }); } /* -------------------------------------------- */ - static _computeEventCoord(origEvent) { + static _computeEventPos(origEvent) { let canvasRect = origEvent.target.getBoundingClientRect(); let x = origEvent.clientX - canvasRect.left; let y = origEvent.clientY - canvasRect.top; let cellx = Math.floor(x / tmrConstants.cellw); // [From 0 -> 12] y -= (cellx % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y; let celly = Math.floor(y / tmrConstants.cellh); // [From 0 -> 14] - return { cellx, celly }; + return { x: cellx, y: celly }; } /* -------------------------------------------- */ - static _horsDePortee(pos, cellx, celly) { - return Math.abs(cellx - pos.x) > 1 - || Math.abs(celly - pos.y) > 1 - || (pos.y == 0 && celly > pos.y && cellx != pos.x && pos.x % 2 == 0) - || (celly == 0 && celly < pos.y && cellx != pos.x && pos.x % 2 == 1); + static _horsDePortee(origin, target) { + return Math.abs(target.x - origin.x) > 1 + || Math.abs(target.y - origin.y) > 1 + || (origin.y == 0 && target.y > origin.y && target.x != origin.x && origin.x % 2 == 0) + || (target.y == 0 && target.y < origin.y && target.x != origin.x && origin.x % 2 == 1); } /* -------------------------------------------- */ @@ -811,14 +828,14 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - _updateDemiReve(myself) { - myself._setTokenPosition(myself.demiReve); + _updateDemiReve() { + this._setTokenPosition(this.demiReve); } /* -------------------------------------------- */ /** Retourne les coordonnées x, h, w, h du rectangle d'une case donnée */ _getCaseRectangleCoord(coord) { - let coordXY = TMRUtility.convertToCellCoord(coord); + let coordXY = TMRUtility.convertToCellPos(coord); let decallagePairImpair = (coordXY.x % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y; let x = tmrConstants.gridx + (coordXY.x * tmrConstants.cellw) - (tmrConstants.cellw / 2); let y = tmrConstants.gridy + (coordXY.y * tmrConstants.cellh) - (tmrConstants.cellh / 2) + decallagePairImpair; @@ -827,7 +844,7 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ _setTokenPosition(token) { - let coordXY = TMRUtility.convertToCellCoord(token.coordTMR()); + let coordXY = TMRUtility.convertToCellPos(token.coordTMR()); let decallagePairImpair = (coordXY.x % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y; let dx = (token.sprite.decallage == undefined) ? 0 : token.sprite.decallage.x; let dy = (token.sprite.decallage == undefined) ? 0 : token.sprite.decallage.y; diff --git a/module/rdd-tmr-rencontre-dialog.js b/module/rdd-tmr-rencontre-dialog.js index 5b432fda..dfa9ffb3 100644 --- a/module/rdd-tmr-rencontre-dialog.js +++ b/module/rdd-tmr-rencontre-dialog.js @@ -1,22 +1,22 @@ /* -------------------------------------------- */ export class RdDTMRRencontreDialog extends Dialog { - + /* -------------------------------------------- */ - constructor(html, tmrApp, rencontre) { + constructor(html, tmrApp, rencontre, postRencontre) { const dialogConf = { title: "Rencontre en TMR!", content: "Vous recontrez un " + rencontre.name + " de force " + rencontre.force + "
", buttons: { - derober: { icon: '', label: "Se dérober", callback: () => { this.toClose = true; this.tmrApp.derober() } }, - refouler: { icon: '', label: "Refouler", callback: () => { this.toClose = true; this.tmrApp.refouler() } }, - maitiser: { icon: '', label: "Maîtriser", callback: () => { this.toClose = true; this.tmrApp.maitriser() } } + derober: { icon: '', label: "Se dérober", callback: () => { this.onButtonFuir(() => tmrApp.derober()); } }, + refouler: { icon: '', label: "Refouler", callback: () => this.onButtonAction(() => tmrApp.refouler()) }, + maitiser: { icon: '', label: "Maîtriser", callback: () => this.onButtonAction(() => tmrApp.maitriser()) } }, default: "derober" - } + }; if (rencontre.ignorer) { - dialogConf.buttons.ignorer = { icon: '', label: "Ignorer", callback: () => { this.toClose = true; this.tmrApp.ignorerRencontre() }}; - } - + dialogConf.buttons.ignorer = { icon: '', label: "Ignorer", callback: () => this.onButtonAction(() => tmrApp.ignorerRencontre()) } + }; + const dialogOptions = { classes: ["tmrrencdialog"], width: 320, height: 240, @@ -26,13 +26,25 @@ export class RdDTMRRencontreDialog extends Dialog { this.toClose = false; this.rencontreData = duplicate(rencontre); + this.postRencontre = postRencontre; this.tmrApp = tmrApp; this.tmrApp.minimize(); } + + async onButtonAction(action) { + this.toClose = true; + await action(); + this.postRencontre(); + } + onButtonFuir(action) { + this.toClose = true; + await action(); + } + /* -------------------------------------------- */ close() { - if ( this.toClose ) { + if (this.toClose) { this.tmrApp.maximize(); return super.close(); } diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js index da24a414..cab3a844 100644 --- a/module/tmr-rencontres.js +++ b/module/tmr-rencontres.js @@ -84,7 +84,7 @@ const typeRencontres = { }, changeur: { - msgSucces: (data) => `Le ${data.rencontre.name} vaincu accepte de vous déplacer sur une autre ${TMRType[data.tmr.type]} de votre choix en échange de sa liberté.`, + msgSucces: (data) => `Le ${data.rencontre.name} vaincu accepte de vous déplacer sur une autre ${TMRType[data.tmr.type].name} de votre choix en échange de sa liberté.`, msgEchec: (data) => { data.newTMR = TMRUtility.getTMRAleatoire(data.tmr.type); return `Le ${data.rencontre.name} vous embobine avec des promesses, et vous transporte en ${data.newTMR.label} sans attendre votre avis.`; diff --git a/module/tmr-utility.js b/module/tmr-utility.js index b423edc8..4cedfaa7 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -1,6 +1,7 @@ import { DeDraconique } from "./de-draconique.js"; import { TMRRencontres } from "./tmr-rencontres.js"; import { Grammar } from "./grammar.js"; +import { Misc } from "./misc.js"; /* -------------------------------------------- */ const TMRMapping = { @@ -210,20 +211,20 @@ const TMRMapping = { } export const TMRType = { - cite: "cité", - sanctuaire: "sanctuaire", - plaines: "plaines", - pont: "pont", - collines: "collines", - foret: "forêt", - monts: "monts", - desert: "désert", - fleuve: "fleuve", - lac: "lac", - marais: "marais", - gouffre: "gouffre", - necropole: "nécropole", - desolation: "désolation" + cite: {name:"cité"}, + sanctuaire: {name:"sanctuaire"}, + plaines: {name:"plaines"}, + pont: {name:"pont"}, + collines: {name:"collines"}, + foret: {name:"forêt"}, + monts: {name:"monts"}, + desert: {name:"désert"}, + fleuve: {name:"fleuve"}, + lac: {name:"lac"}, + marais: {name:"marais"}, + gouffre: {name:"gouffre"}, + necropole: {name:"nécropole"}, + desolation: {name:"désolation"} } /* -------------------------------------------- */ @@ -257,14 +258,17 @@ export class TMRUtility { for (let coord in TMRMapping) { TMRMapping[coord].coord = coord; } + let tmrByType = Misc.classify(Object.values(TMRMapping)); + for (const [type, list] of Object.entries(tmrByType)) { + TMRType[type].list = list; + } } /* -------------------------------------------- */ - static convertToTMRCoord( x, y ) + static convertToTMRCoord( pos ) { - y = y + 1 - let letterX = String.fromCharCode(65+x); - return letterX+y + let letterX = String.fromCharCode(65+ (pos.x)); + return letterX + (pos.y +1) } /* -------------------------------------------- */ @@ -280,7 +284,7 @@ export class TMRUtility { } /* -------------------------------------------- */ - static convertToCellCoord( coordTMR ) + static convertToCellPos( coordTMR ) { let x = coordTMR.charCodeAt(0) - 65; let y = coordTMR.substr(1) - 1; @@ -328,13 +332,13 @@ export class TMRUtility { /* -------------------------------------------- */ static deplaceTMRSelonPattern( coord, direction, nTime ) { for (let i=0; i it.coord); } - /* -------------------------------------------- */ - static getTMRAleatoire(terrain=undefined) - { - if (terrain) { - let list = TMRUtility.getListTMR(terrain); - let index = new Roll("1d" + list.length).evaluate().total - 1; - return list[index]; - } - let num = new Roll("1d15").roll().total; - let letter, letterValue; - if ( num == 15) { - letterValue = new Roll( "1d7").roll().total; - letter = String.fromCharCode( 65 + ((parseInt(letterValue)-1)*2) ); - } else { - letterValue = new Roll( "1d13 + 64" ).roll().total; - letter = String.fromCharCode( letterValue ); - } - let caseIndex = letter+num; - ChatMessage.create( { content: "Case aléatoire : " + letter+num + " - " + TMRMapping[caseIndex].label , - whisper: ChatMessage.getWhisperRecipients("GM") } ); - return caseIndex; + static getTMRAleatoire(terrain = undefined) { + let list = terrain ? TMRUtility.getListTMR(terrain) : Object.values(TMRMapping); + let index = new Roll("1d" + list.length).evaluate().total - 1; + return list[index]; } /* -------------------------------------------- */ @@ -432,22 +413,22 @@ export class TMRUtility { /** Returns a list of case inside a given distance * */ - static getTMRPortee(coord, portee) { - return TMRUtility.getTMRArea(coord, portee, tmrConstants); + static getTMRPortee(centerCoord, portee) { + return TMRUtility.getTMRArea(centerCoord, portee, tmrConstants); } - static getTMRArea( coord, distance, tmrConstants ) { - let pos = this.convertToCellCoord( coord ); - let posPic = this.computeRealPictureCoordinates( pos, tmrConstants ); + static getTMRArea( centerCoord, distance, tmrConstants ) { + let centerPos = this.convertToCellPos( centerCoord ); + let posPic = this.computeRealPictureCoordinates( centerPos, tmrConstants ); let caseList = []; - for (let x=pos.x-distance; x<=pos.x+distance; x++ ) { // Loop thru lines - for (let y=pos.y-distance; y<=pos.y+distance; y++ ) { // Loop thru lines - //console.log("Parsing position", x, y); - if ( this._checkTMRCoord(x, y) ) { // Coordinate is valie - let posPicNow = this.computeRealPictureCoordinates( {x: x, y: y}, tmrConstants ); + for (let dx=-distance; dx<=distance; dx++ ) { // Loop thru lines + for (let dy=-distance; dy<=distance; dy++ ) { // Loop thru lines + const currentPos = { x: centerPos.x+dx, y: centerPos.y+dy }; + if ( this._checkTMRCoord(currentPos.x, currentPos.y) ) { // Coordinate is valie + let posPicNow = this.computeRealPictureCoordinates( currentPos, tmrConstants ); let dist = Math.sqrt(Math.pow(posPicNow.x - posPic.x,2) + Math.pow(posPicNow.y - posPic.y, 2)) / tmrConstants.cellw; if ( dist < distance+0.5) { - caseList.push( this.convertToTMRCoord(x, y) ); // Inside the area + caseList.push( this.convertToTMRCoord(currentPos) ); // Inside the area } } } From a2ec26c4c09c80b117bc3fd52cd2ac881737f5fb Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 5 Feb 2021 23:51:12 +0100 Subject: [PATCH 04/26] =?UTF-8?q?Extraction=20m=C3=A9thodes=20identificati?= =?UTF-8?q?on=20items?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pour savoir si certaines queues/souffles sont là et rendre le code plus lisible --- module/actor.js | 6 +++--- module/item.js | 11 +++++++++-- module/rdd-tmr-rencontre-dialog.js | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/module/actor.js b/module/actor.js index fadb6bbb..80a3dfbd 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1762,7 +1762,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ isRencontreSpeciale() { // Gestion queue/souffle 'Mauvaise Rencontre en Perpective' let addMsg = ""; - let rencSpecial = this.data.items.find(item => (item.type == 'queue' || item.type == 'souffle') && item.name.toLowerCase().includes('mauvaise rencontre')); + let rencSpecial = this.data.items.find(item => RdDItem.isMauvaiseRencontreEnPerspective(item)); if (rencSpecial) { rencSpecial = duplicate(rencSpecial); // To keep it if (rencSpecial.type == 'queue') { @@ -1805,7 +1805,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ isDoubleResistanceFleuve() { - let resistFleuve = this.data.items.find(item => item.type == 'souffle' && item.name.toLowerCase().includes('résistance du fleuve')); + let resistFleuve = this.data.items.find(item => RdDItem.isDoubleResistanceFleuve(item)); if (resistFleuve) { ChatMessage.create({ content: "Vous êtes sous le coup d'une Double Résistance du Fleuve : vous devez maîtriser 2 fois chaque case humide, un second jet est donc effectué.", @@ -1839,7 +1839,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ isCaseHumideAdditionelle(tmr) { - if (tmr.type == 'pont' && this.data.items.find(it => RdDItem.isSoufflePontImpraticable(it))) { + if (tmr.type == 'pont' && this.data.items.find(it => RdDItem.isPontImpraticable(it))) { ChatMessage.create({ content: tmr.label +": Vous êtes sous le coup d'une Impraticabilité des Ponts : ce pont doit être maîtrisé comme une case humide.", whisper: ChatMessage.getWhisperRecipients(game.user.name) diff --git a/module/item.js b/module/item.js index 988d3ecf..4de0d66a 100644 --- a/module/item.js +++ b/module/item.js @@ -3,16 +3,23 @@ import { Misc } from "./misc.js"; /* -------------------------------------------- */ export class RdDItem { - static isSoufflePontImpraticable(item) { + static isPontImpraticable(item) { return item.type == 'souffle' && item.name.toLowerCase().includes(' des ponts'); } + static isDoubleResistanceFleuve(item) { + return item.type == 'souffle' && item.name.toLowerCase().includes('résistance du fleuve') + } + static isCaseInnondee(item) { return RdDItem.isCaseTMR(item) && item.data.specific == 'debordement'; } - static isCaseTMR(item) { return item.type == 'casetmr'; } + + static isMauvaiseRencontreEnPerspective(item) { + return (item.type == 'queue' || item.type == 'ombre' || item.type == 'souffle') && item.name.toLowerCase().includes('mauvaise rencontre') + } } \ No newline at end of file diff --git a/module/rdd-tmr-rencontre-dialog.js b/module/rdd-tmr-rencontre-dialog.js index dfa9ffb3..ba381889 100644 --- a/module/rdd-tmr-rencontre-dialog.js +++ b/module/rdd-tmr-rencontre-dialog.js @@ -37,7 +37,7 @@ export class RdDTMRRencontreDialog extends Dialog { this.postRencontre(); } - onButtonFuir(action) { + async onButtonFuir(action) { this.toClose = true; await action(); } From 7c54597a20f24a4cb82bc979a505133163da15c4 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 6 Feb 2021 01:34:01 +0100 Subject: [PATCH 05/26] =?UTF-8?q?Ajout=20des=20Oeuvres=20g=C3=A9n=C3=A9riq?= =?UTF-8?q?ues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout de la description au tchat, ajout de la référence/auteur à tous les types d'oeuvres Ajout de l'exotisme à la cuisine Jet de chant (qui ne marchait pas) --- module/actor-sheet.js | 5 + module/actor.js | 97 ++++++++----------- module/item-sheet.js | 2 +- module/rdd-utility.js | 22 ++--- styles/simple.css | 1 + system.json | 2 +- template.json | 16 ++- templates/actor-sheet.html | 55 ++++++----- templates/chat-resultat-chant.html | 17 +++- templates/chat-resultat-cuisine.html | 13 --- templates/chat-resultat-danse.html | 17 +++- templates/chat-resultat-jeu.html | 17 +++- templates/chat-resultat-musique.html | 17 +++- templates/chat-resultat-oeuvre.html | 29 ++++++ templates/chat-resultat-recettecuisine.html | 34 +++++++ templates/dialog-roll-jeu.html | 18 ++-- templates/dialog-roll-oeuvre.html | 37 +++++++ ...e.html => dialog-roll-recettecuisine.html} | 4 +- templates/item-chant-sheet.html | 4 + templates/item-danse-sheet.html | 4 + templates/item-jeu-sheet.html | 4 + templates/item-musique-sheet.html | 4 + templates/item-oeuvre-sheet.html | 45 +++++++++ templates/item-recettecuisine-sheet.html | 18 +++- 24 files changed, 349 insertions(+), 133 deletions(-) delete mode 100644 templates/chat-resultat-cuisine.html create mode 100644 templates/chat-resultat-oeuvre.html create mode 100644 templates/chat-resultat-recettecuisine.html create mode 100644 templates/dialog-roll-oeuvre.html rename templates/{dialog-roll-cuisine.html => dialog-roll-recettecuisine.html} (86%) create mode 100644 templates/item-oeuvre-sheet.html diff --git a/module/actor-sheet.js b/module/actor-sheet.js index ef20bd34..eb2c0bdd 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -304,6 +304,11 @@ export class RdDActorSheet extends ActorSheet { let musiqueId = li.data('item-id'); this.actor.rollMusique(musiqueId); }); + html.find('.oeuvre-label a').click((event) => { + const li = $(event.currentTarget).parents(".item"); + let oeuvreId = li.data('item-id'); + this.actor.rollOeuvre(oeuvreId); + }); html.find('.jeu-label a').click((event) => { const li = $(event.currentTarget).parents(".item"); let jeuId = li.data('item-id'); diff --git a/module/actor.js b/module/actor.js index 80a3dfbd..34bf85ac 100644 --- a/module/actor.js +++ b/module/actor.js @@ -278,6 +278,9 @@ export class RdDActor extends Actor { getMusique(id) { return this.data.items.find(item => item.type == 'musique' && item._id == id); } + getOeuvre(id, type = 'oeuvre') { + return this.data.items.find(item => item.type == type && item._id == id); + } getJeu(id) { return this.data.items.find(item => item.type == 'jeu' && item._id == id); } @@ -2041,20 +2044,21 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async _rollArt(artData, selectedCarac, competence, oeuvre) { + async _rollArt(artData, selectedCarac, oeuvre, callBackResult = r =>this._resultArt(r)) { mergeObject(artData, { oeuvre: oeuvre, - competence: duplicate(competence), - diffLibre: -oeuvre.data.niveau, + art: oeuvre.type, + competence: duplicate(this.getCompetence(oeuvre.data.competence ?? artData.art)), + diffLibre: - (oeuvre.data.niveau ??0), diffConditions: 0, - use: { libre: false, conditions: true, }, + use: { libre: false, conditions: true }, selectedCarac: duplicate(this.data.data.carac[selectedCarac]), forceCarac: {} }); artData.competence.data.defaut_carac = selectedCarac; artData.forceCarac[selectedCarac] = duplicate(this.data.data.carac[selectedCarac]); - console.log("rollArtiste !!!", artData); + console.log("rollArt !!!", artData); const dialog = await RdDRoll.create(this, artData, { html: `systems/foundryvtt-reve-de-dragon/templates/dialog-roll-${artData.art}.html` }, { name: `jet-${artData.art}`, @@ -2077,85 +2081,66 @@ export class RdDActor extends Actor { RdDResolutionTable.displayRollData(artData, this.name, `chat-resultat-${artData.art}.html`); } + /* -------------------------------------------- */ + async rollChant(id) { + const artData = { art: 'chant', verbe: 'Chanter' }; + const oeuvre = duplicate(this.getChant(id)); + await this._rollArt(artData, "ouie", oeuvre); + } /* -------------------------------------------- */ async rollDanse(id) { - const oeuvre = duplicate(this.getDanse(id)); - const competence = this.getCompetence("danse"); - const selectedCarac = this._getCaracDanse(oeuvre, competence); const artData = { art: 'danse', verbe: 'Danser' }; - await this._rollArt(artData, selectedCarac, competence, oeuvre); + const oeuvre = duplicate(this.getOeuvre(id, artData.art)); + const selectedCarac = this._getCaracDanse(oeuvre,); + await this._rollArt(artData, selectedCarac, oeuvre); } - _getCaracDanse(oeuvre, competence) { + _getCaracDanse(oeuvre) { if (oeuvre.data.agilite) { return "agilite"; } else if (oeuvre.data.apparence) { return "apparence"; } + const competence = this.getCompetence(oeuvre.data.competence); return competence.data.defaut_carac; } /* -------------------------------------------- */ async rollMusique(id) { - const oeuvre = duplicate(this.getMusique(id)); - const competence = this.getCompetence("musique"); - const selectedCarac = "ouie"; const artData = { art: 'musique', verbe: 'Jouer' }; - await this._rollArt(artData, selectedCarac, competence, oeuvre); + const oeuvre = duplicate(this.getOeuvre(id, artData.art)); + await this._rollArt(artData, "ouie", oeuvre); } /* -------------------------------------------- */ async rollRecetteCuisine(id) { - const oeuvre = duplicate(this.getRecetteCuisine(id)); - const competence = this.getCompetence("cuisine"); - const selectedCarac = 'odoratgout'; const artData = { art: 'cuisine', verbe: 'Cuisiner' }; - await this._rollArt(artData, selectedCarac, competence, oeuvre); + const oeuvre = duplicate(this.getRecetteCuisine(id)); + await this._rollArt(artData, 'odoratgout', oeuvre, r => this._resultRecetteCuisine(r) ); } - + + /* -------------------------------------------- */ + async _resultRecetteCuisine(artData) { + const baseQualite = (artData.rolled.isSuccess ? artData.oeuvre.data.niveau : artData.competence.data.niveau); + artData.qualiteFinale = Math.min(baseQualite, artData.oeuvre.data.niveau) + artData.rolled.ptQualite; + artData.exotismeFinal = Math.min(Math.min(artData.qualiteFinale, -Math.abs(artData.oeuvre.data.exotisme??0)), 0); + console.log("OEUVRE", artData.art, artData) + RdDResolutionTable.displayRollData(artData, this.name, `chat-resultat-${artData.art}.html`); + } + /* -------------------------------------------- */ async rollJeu(id) { - const oeuvre = duplicate(this.getJeu(id)); - const competence = this.getCompetence("jeu"); - const selectedCarac = competence.data.defaut_carac; const artData = { art: 'jeu', verbe: 'Jeu', use: { libre: true, conditions: true, }, }; - await this._rollArt(artData, selectedCarac, competence, oeuvre); + const oeuvre = duplicate(this.getJeu(id)); + await this._rollArt(artData, oeuvre.data?.caraccomp.toLowerCase() ?? 'chance', oeuvre); } - - /* -------------------------------------------- */ - async rollJeu( id ) { - let jeu = duplicate(this.getJeu(id)); - let competence = duplicate(this.getCompetence("jeu")); - let jeuData = { - competence: competence, - jeu: jeu, - diffLibre: 0, - diffConditions: 0, - use: { libre: true, conditions: true, }, - carac: {} - }; - - console.log("rollJeu !!!", jeuData); + async rollOeuvre(id) { + const artData = { art: 'oeuvre', verbe: 'Interpréter' }; + const oeuvre = duplicate(this.getOeuvre(id)); + await this._rollArt(artData, oeuvre.data.default_carac, oeuvre); + } - const dialog = await RdDRoll.create(this, jeuData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-jeu.html' }, { - name: 'jet-jeu', - label: 'Jeu ' + jeu.name, - height: 600, - callbacks: [ - this.createCallbackExperience(), - { action: r => this._jeuResult(r) } - ] - }); - dialog.render(true); - } - /* -------------------------------------------- */ - async _jeuResult(jeudData) { - console.log("JEU", jeudData) - RdDResolutionTable.displayRollData(jeudData, this.name, 'chat-resultat-jeu.html'); - } - - /* -------------------------------------------- */ async rollMeditation(id) { let meditation = duplicate(this.getMeditation(id)); diff --git a/module/item-sheet.js b/module/item-sheet.js index 5c2dc75c..54931c78 100644 --- a/module/item-sheet.js +++ b/module/item-sheet.js @@ -49,7 +49,7 @@ export class RdDItemSheet extends ItemSheet { async getData() { let data = super.getData(); data.categorieCompetences = RdDUtility.getCategorieCompetences(); - if ( data.item.type == 'tache' || data.item.type == 'livre' || data.item.type == 'meditation') { + if ( data.item.type == 'tache' || data.item.type == 'livre' || data.item.type == 'meditation' || data.item.type == 'oeuvre') { data.caracList = duplicate(game.system.model.Actor.personnage.carac); data.competences = await RdDUtility.loadCompendiumNames( 'foundryvtt-reve-de-dragon.competences' ); } diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 7a05c7a3..9d892c9f 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -7,6 +7,7 @@ import { RdDRollResolutionTable } from "./rdd-roll-resolution-table.js"; import { RdDItemCompetenceCreature } from "./item-competencecreature.js"; import { RdDItemArme } from "./item-arme.js"; import { RdDItemCompetence } from "./item-competence.js"; +import { Misc } from "./misc.js"; /* -------------------------------------------- */ const categorieCompetences = { @@ -128,18 +129,6 @@ const fatigueMarche = { "tresdifficile": { "4": 4, "6": 6 } } -/* -------------------------------------------- */ -/* Static tables for commands /table */ -const table2func = { - "rdd": { descr: "rdd: Ouvre la table de résolution", func: RdDRollResolutionTable.open }, - "queues": { descr: "queues: Tire une queue de Dragon", func: RdDRollTables.getQueue }, - "ombre": { descr: "ombre: Tire une Ombre de Dragon", func: RdDRollTables.getOmbre }, - "tetehr": { descr: "tetehr: Tire une Tête de Dragon pour Hauts Revants", fund: RdDRollTables.getTeteHR }, - "tete": { descr: "tete: Tire une Tête de Dragon", func: RdDRollTables.getTete }, - "souffle": { descr: "souffle: Tire un Souffle de Dragon", func: RdDRollTables.getSouffle }, - "tarot": { descr: "tarot: Tire une carte de Tarot Dracnique", func: RdDRollTables.getTarot } -}; - /* -------------------------------------------- */ const definitionsBlessures = [ { type: "legere", facteur: 2 }, @@ -264,6 +253,14 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.html' ]; + Handlebars.registerHelper('upperFirst', function (str) { + return Misc.upperFirst(str ?? 'null') + }) + + Handlebars.registerHelper('upper', function (str) { + return str?.toUpperCase() ?? 'NULL' + }) + return loadTemplates(templatePaths); } @@ -319,6 +316,7 @@ export class RdDUtility { data.data.chants = this.checkNull(data.itemsByType['chant']); data.data.danses = this.checkNull(data.itemsByType['danse']); data.data.musiques = this.checkNull(data.itemsByType['musique']); + data.data.oeuvres = this.checkNull(data.itemsByType['oeuvre']); data.data.jeux = this.checkNull(data.itemsByType['jeu']); data.data.recettescuisine = this.checkNull(data.itemsByType['recettecuisine']); data.data.recettesAlchimiques = this.checkNull(data.itemsByType['recettealchimique']); diff --git a/styles/simple.css b/styles/simple.css index dbfe89da..56e0bbc8 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -675,6 +675,7 @@ ul, li { .subacteur-label, .chant-label, .musique-label, +.oeuvre-label, .chant-label, .danse-label, .recette-label, diff --git a/system.json b/system.json index 51b740bd..9cf8a6e1 100644 --- a/system.json +++ b/system.json @@ -6,7 +6,7 @@ "manifestPlusVersion": "1.0.0", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.9", - "templateVersion": 90, + "templateVersion": 91, "author": "LeRatierBretonnien", "authors": [ { diff --git a/template.json b/template.json index 79ce365f..8c42ea59 100644 --- a/template.json +++ b/template.json @@ -563,7 +563,7 @@ "Item": { "types": ["objet", "arme", "armure", "conteneur", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition", "rencontresTMR", "queue", "ombre", "souffle", "tete", "competencecreature", "tarot", "monnaie", "nombreastral", "tache", "meditation", "casetmr", "recettealchimique", - "musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison" ], + "musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre" ], "objet": { "description": "", "quantite": 1, @@ -775,6 +775,7 @@ }, "musique": { "niveau": "", + "reference": "", "description": "" }, "danse": { @@ -782,16 +783,19 @@ "agilite": false, "apparence": false, "niveau": "", + "reference": "", "description": "" }, "chant": { "niveau": "", + "reference": "", "description": "" }, "jeu": { "type": "", "base": "", "caraccomp": "", + "reference": "", "description": "" }, "recettecuisine": { @@ -799,6 +803,15 @@ "ingredients": "", "duree": "", "sust": 0, + "exotisme": 0, + "reference": "", + "description": "" + }, + "oeuvre": { + "default_carac": "", + "competence": "", + "niveau": 0, + "reference": "", "description": "" }, "maladie": { @@ -815,7 +828,6 @@ "dommages":"", "description": "" } - } } diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 2e8873d4..fddb959a 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -650,32 +650,42 @@ {{!-- Connaissances Tab --}}
-

Chants :

+

Oeuvres diverses :

-

Danses :

- -

Musiques :

- -

Recettes de Cuisine :

-

Recettes Alchimiques

    {{#each data.recettesAlchimiques as |recette id|}} diff --git a/templates/chat-resultat-chant.html b/templates/chat-resultat-chant.html index 13491202..4143eb70 100644 --- a/templates/chat-resultat-chant.html +++ b/templates/chat-resultat-chant.html @@ -1,4 +1,4 @@ -chant +{{oeuvre.data.competence}}

    {{alias}} tente de chanter la chanson : {{oeuvre.name}} (niveau {{oeuvre.data.niveau}})

    @@ -11,3 +11,18 @@ {{alias}} est peu inspiré(e) et son interprétation a une qualité de {{qualiteFinale}}. {{/if}}
+{{#if oeuvre.data.description}} +
+ + {{{oeuvre.data.description}}} + {{#if oeuvre.data.reference}} +

{{oeuvre.data.reference}}

+ {{/if}} +
+{{else if oeuvre.data.reference}} +
+ +

{{oeuvre.data.reference}}

+
+{{/if}} + diff --git a/templates/chat-resultat-cuisine.html b/templates/chat-resultat-cuisine.html deleted file mode 100644 index 9a184f50..00000000 --- a/templates/chat-resultat-cuisine.html +++ /dev/null @@ -1,13 +0,0 @@ -cuisine -

- {{alias}} tente de cuisiner la recette : {{oeuvre.name}} (niveau {{oeuvre.data.niveau}}) -

-{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}} -
-
- {{#if rolled.isSuccess}} - {{alias}} réussit sa recette, avec un plat de {{qualiteFinale}} pour {{oeuvre.data.sust}} Points de Sustentation. - {{else}} - {{alias}} fait un pière cuisinier(e), et obtient une qualité de {{qualiteFinale}}. Selon la décision du MJ, le plat peut fournir {{oeuvre.data.sust}} Points de Sustentation - {{/if}} -
diff --git a/templates/chat-resultat-danse.html b/templates/chat-resultat-danse.html index 21d03a95..abe93ba7 100644 --- a/templates/chat-resultat-danse.html +++ b/templates/chat-resultat-danse.html @@ -1,4 +1,4 @@ -danse +{{oeuvre.data.competence}}

{{alias}} tente de danser : {{oeuvre.name}} (niveau {{oeuvre.data.niveau}})

@@ -11,3 +11,18 @@ {{alias}} est peu inspiré(e) et son interprétation a une qualité de {{qualiteFinale}}. {{/if}} +{{#if oeuvre.data.description}} +
+ + {{{oeuvre.data.description}}} + {{#if oeuvre.data.reference}} +

{{oeuvre.data.reference}}

+ {{/if}} +
+{{else if oeuvre.data.reference}} +
+ +

{{oeuvre.data.reference}}

+
+{{/if}} + diff --git a/templates/chat-resultat-jeu.html b/templates/chat-resultat-jeu.html index d1af862c..c8e1736c 100644 --- a/templates/chat-resultat-jeu.html +++ b/templates/chat-resultat-jeu.html @@ -1,4 +1,4 @@ -jeu +{{oeuvre.data.competence}}

{{alias}} joue à : {{oeuvre.name}}

@@ -11,3 +11,18 @@ {{alias}} a perdu ... {{/if}} +{{#if oeuvre.data.description}} +
+ + {{{oeuvre.data.description}}} + {{#if oeuvre.data.reference}} +

{{oeuvre.data.reference}}

+ {{/if}} +
+{{else if oeuvre.data.reference}} +
+ +

{{oeuvre.data.reference}}

+
+{{/if}} + diff --git a/templates/chat-resultat-musique.html b/templates/chat-resultat-musique.html index f39253e0..ffea62b6 100644 --- a/templates/chat-resultat-musique.html +++ b/templates/chat-resultat-musique.html @@ -1,4 +1,4 @@ -musique +{{oeuvre.data.competence}}

{{alias}} tente de jouer le morceau : {{oeuvre.name}} (niveau {{oeuvre.data.niveau}})

@@ -11,3 +11,18 @@ {{alias}} est peu inspiré(e) et son interprétation a une qualité de {{qualiteFinale}}. {{/if}} +{{#if oeuvre.data.description}} +
+ + {{{oeuvre.data.description}}} + {{#if oeuvre.data.reference}} +

{{oeuvre.data.reference}}

+ {{/if}} +
+{{else if oeuvre.data.reference}} +
+ +

{{oeuvre.data.reference}}

+
+{{/if}} + diff --git a/templates/chat-resultat-oeuvre.html b/templates/chat-resultat-oeuvre.html new file mode 100644 index 00000000..84141952 --- /dev/null +++ b/templates/chat-resultat-oeuvre.html @@ -0,0 +1,29 @@ +

{{oeuvre.data.competence}} + + {{alias}} tente d'interpréter {{oeuvre.name}} (niveau {{oeuvre.data.niveau}}) +

+
{{upperFirst oeuvre.data.default_carac}} / {{oeuvre.data.competence}} +{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}} +
+
+ {{#if rolled.isSuccess}} + {{alias}} réussi son interprétation avec une qualité de {{qualiteFinale}} . + {{else}} + {{alias}} est peu inspiré(e) et son interprétation a une qualité de {{qualiteFinale}}. + {{/if}} +
+{{#if oeuvre.data.description}} +
+ + {{{oeuvre.data.description}}} + {{#if oeuvre.data.reference}} +

{{oeuvre.data.reference}}

+ {{/if}} +
+{{else if oeuvre.data.reference}} +
+ +

{{oeuvre.data.reference}}

+
+{{/if}} + diff --git a/templates/chat-resultat-recettecuisine.html b/templates/chat-resultat-recettecuisine.html new file mode 100644 index 00000000..fa75d72d --- /dev/null +++ b/templates/chat-resultat-recettecuisine.html @@ -0,0 +1,34 @@ +{{oeuvre.data.competence}} +

+ {{alias}} tente de cuisiner la recette : {{oeuvre.name}} (niveau {{oeuvre.data.niveau}}) +

+{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}} +
+ +{{#if rolled.isSuccess}} + {{alias}} réussit sa recette, avec un plat de {{qualiteFinale}} pour {{oeuvre.data.sust}} Points de Sustentation. +{{else}} + {{alias}} fait un pière cuisinier(e), et obtient {{#if (lt qualiteFinale 0)}}un plat à l'exotisme certain{{else}}un plat de qualité {{qualiteFinale}}{{/if}}. + Selon la décision du MJ, le plat peut fournir {{oeuvre.data.sust}} Points de Sustentation +{{/if}} + +{{#if (lt exotismeFinal 0)}} +
Au vu de l'exotisme du plat, les convives devront réussir un jet de Volonté / Cuisine à {{exotismeFinal}}. +En cas d'échec, ils peuvent se forcer pour faire plaisir au Maître Queux, mais devront faire un jet de moral Malheureux. +{{/if}} + +{{#if oeuvre.data.description}} +
+ + {{{oeuvre.data.description}}} + {{#if oeuvre.data.reference}} +

{{oeuvre.data.reference}}

+ {{/if}} +
+{{else if oeuvre.data.reference}} +
+ +

{{oeuvre.data.reference}}

+
+{{/if}} + diff --git a/templates/dialog-roll-jeu.html b/templates/dialog-roll-jeu.html index 0d062344..0ccf3b77 100644 --- a/templates/dialog-roll-jeu.html +++ b/templates/dialog-roll-jeu.html @@ -1,23 +1,21 @@
    -
  • -
  • -
  • -
  • +
  • +
  • +
  • +
- - - {{#select carac}} {{#each carac as |caracitem key|}} {{/each}} {{/select}} - - -
+ + {{#select diffConditions}} + {{#each ajustementsConditions as |key|}} + + {{/each}} + {{/select}} + + + +
+ +
+
+
+
+
+
+
+ + diff --git a/templates/dialog-roll-cuisine.html b/templates/dialog-roll-recettecuisine.html similarity index 86% rename from templates/dialog-roll-cuisine.html rename to templates/dialog-roll-recettecuisine.html index d6bdcb32..ef52543e 100644 --- a/templates/dialog-roll-cuisine.html +++ b/templates/dialog-roll-recettecuisine.html @@ -1,8 +1,10 @@
+
    -
  • +
  • +
diff --git a/templates/item-chant-sheet.html b/templates/item-chant-sheet.html index a198761b..1d9af9ff 100644 --- a/templates/item-chant-sheet.html +++ b/templates/item-chant-sheet.html @@ -12,6 +12,10 @@ +
+ + +
diff --git a/templates/item-danse-sheet.html b/templates/item-danse-sheet.html index 450de001..ea410cf4 100644 --- a/templates/item-danse-sheet.html +++ b/templates/item-danse-sheet.html @@ -29,6 +29,10 @@
+
+ + +
diff --git a/templates/item-jeu-sheet.html b/templates/item-jeu-sheet.html index 56ad2d67..11649435 100644 --- a/templates/item-jeu-sheet.html +++ b/templates/item-jeu-sheet.html @@ -27,6 +27,10 @@
+
+ + +
diff --git a/templates/item-musique-sheet.html b/templates/item-musique-sheet.html index a198761b..1d9af9ff 100644 --- a/templates/item-musique-sheet.html +++ b/templates/item-musique-sheet.html @@ -12,6 +12,10 @@
+
+ + +
diff --git a/templates/item-oeuvre-sheet.html b/templates/item-oeuvre-sheet.html new file mode 100644 index 00000000..82f2c2b0 --- /dev/null +++ b/templates/item-oeuvre-sheet.html @@ -0,0 +1,45 @@ + +
+ +
+

+
+
+ + {{!-- Sheet Body --}} +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
+
+
+ + diff --git a/templates/item-recettecuisine-sheet.html b/templates/item-recettecuisine-sheet.html index b82e08d1..2d64730c 100644 --- a/templates/item-recettecuisine-sheet.html +++ b/templates/item-recettecuisine-sheet.html @@ -9,25 +9,33 @@ {{!-- Sheet Body --}}
- +
- +
- +
+
+ + +
- +
{{editor content=data.ingredients target="data.ingredients" button=true owner=owner editable=editable}}
+
+ + +
- +
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
From fe73e5b984f3e60cf4b9913126d42c4d447672cc Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 6 Feb 2021 01:34:49 +0100 Subject: [PATCH 06/26] Travail sur queues/souffles --- module/actor.js | 23 +++++++++++------------ module/item.js | 32 ++++++++++++++++++++++++-------- module/rdd-tmr-dialog.js | 13 +++++++------ 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/module/actor.js b/module/actor.js index 34bf85ac..af1cc5ba 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1765,10 +1765,10 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ isRencontreSpeciale() { // Gestion queue/souffle 'Mauvaise Rencontre en Perpective' let addMsg = ""; - let rencSpecial = this.data.items.find(item => RdDItem.isMauvaiseRencontreEnPerspective(item)); + let rencSpecial = this.data.items.find(item => RdDItem.isHRMauvaiseRencontreEnPerspective(item)); if (rencSpecial) { rencSpecial = duplicate(rencSpecial); // To keep it - if (rencSpecial.type == 'queue') { + if (rencSpecial.type != 'souffle') { this.deleteOwnedItem(rencSpecial._id); // Suppression dans la liste des queues addMsg = " La queue a été supprimée de votre fiche automatiquement"; } else { @@ -1784,15 +1784,14 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ getTMRFatigue() { // Pour l'instant uniquement Inertie Draconique - let inertieDraconique = this.data.items.find(item => item.type == 'queue' && item.name.toLowerCase().includes('inertie draconique')); - if (inertieDraconique) { + let countInertieDraconique = this.data.items.filter(item => RdDItem.isHRInertieDraconique(item)).length; + if (countInertieDraconique>0) { ChatMessage.create({ - content: "Vous êtes sous le coup d'une Inertie Draconique : vous perdez 2 cases de Fatigue par déplacement au lieu d'1.", + content: `Vous êtes sous le coup d'une Inertie Draconique : vous perdez ${countInertieDraconique+1} cases de Fatigue par déplacement au lieu d'une.`, whisper: ChatMessage.getWhisperRecipients(game.user.name) }); - return 2; } - return 1; + return countInertieDraconique + 1; } /* -------------------------------------------- */ @@ -1808,7 +1807,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ isDoubleResistanceFleuve() { - let resistFleuve = this.data.items.find(item => RdDItem.isDoubleResistanceFleuve(item)); + let resistFleuve = this.data.items.find(item => RdDItem.isHRDoubleResistanceFleuve(item)); if (resistFleuve) { ChatMessage.create({ content: "Vous êtes sous le coup d'une Double Résistance du Fleuve : vous devez maîtriser 2 fois chaque case humide, un second jet est donc effectué.", @@ -1821,7 +1820,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async checkSoufflePeage(cellDescr) { - let peage = this.data.items.find(item => item.type == 'souffle' && item.name.toLowerCase().includes('péage')); + let peage = this.data.items.find(item => RdDItem.isHRPeage(item)); if (peage && (cellDescr.type == 'pont' || cellDescr.type == 'cite')) { await this.reveActuelIncDec(-1); ChatMessage.create({ @@ -1842,7 +1841,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ isCaseHumideAdditionelle(tmr) { - if (tmr.type == 'pont' && this.data.items.find(it => RdDItem.isPontImpraticable(it))) { + if (tmr.type == 'pont' && this.data.items.find(it => RdDItem.isHRPontImpraticable(it))) { ChatMessage.create({ content: tmr.label +": Vous êtes sous le coup d'une Impraticabilité des Ponts : ce pont doit être maîtrisé comme une case humide.", whisper: ChatMessage.getWhisperRecipients(game.user.name) @@ -1852,7 +1851,7 @@ export class RdDActor extends Actor { // Débordement ? let isTmrInondee = this.data.items.filter(it => RdDItem.isCaseTMR(it)) .filter(it => it.data.coord == tmr.coord) - .find(it => RdDItem.isCaseInnondee(it)); + .find(it => RdDItem.isHRCaseInnondee(it)); if (isTmrInondee) { ChatMessage.create({ content: tmr.label +": cette case est inondée, elle doit être maîtrisée comme une case humide.", @@ -2066,7 +2065,7 @@ export class RdDActor extends Actor { height: 600, callbacks: [ this.createCallbackExperience(), - { action: r => this._resultArt(r) } + { action: r => callBackResult(r) } ] }); dialog.render(true); diff --git a/module/item.js b/module/item.js index 4de0d66a..a7d43f62 100644 --- a/module/item.js +++ b/module/item.js @@ -3,23 +3,39 @@ import { Misc } from "./misc.js"; /* -------------------------------------------- */ export class RdDItem { - static isPontImpraticable(item) { - return item.type == 'souffle' && item.name.toLowerCase().includes(' des ponts'); + static isQueueDragon(item) { + return item.type == 'queue' || item.type == 'ombre'; } - static isDoubleResistanceFleuve(item) { - return item.type == 'souffle' && item.name.toLowerCase().includes('résistance du fleuve') + static isSouffleDragon(item) { + return item.type == 'souffle'; } - static isCaseInnondee(item) { - return RdDItem.isCaseTMR(item) && item.data.specific == 'debordement'; + static isHRPontImpraticable(item) { + return RdDItem.isSouffleDragon(item) && item.name.toLowerCase().includes(' des ponts'); + } + + static isHRDoubleResistanceFleuve(item) { + return RdDItem.isSouffleDragon(item) && item.name.toLowerCase().includes('résistance du fleuve') + } + static isHRPeage(item) { + return RdDItem.isSouffleDragon(item) && item.name.toLowerCase().includes('péage') + } + + static isHRMauvaiseRencontreEnPerspective(item) { + return (RdDItem.isQueueDragon(item) || RdDItem.isSouffleDragon(item)) && item.name.toLowerCase().includes('mauvaise rencontre') + } + + static isHRInertieDraconique(item) { + return RdDItem.isQueueDragon(item) && item.name.toLowerCase().includes('inertie draconique') } static isCaseTMR(item) { return item.type == 'casetmr'; } - static isMauvaiseRencontreEnPerspective(item) { - return (item.type == 'queue' || item.type == 'ombre' || item.type == 'souffle') && item.name.toLowerCase().includes('mauvaise rencontre') + static isHRCaseInnondee(item) { + return RdDItem.isCaseTMR(item) && item.data.specific == 'debordement'; } + } \ No newline at end of file diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 9745a5f6..ac36b550 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -36,7 +36,8 @@ export class RdDTMRDialog extends Dialog { this.actor = actor; this.actor.tmrApp = this; // reference this app in the actor structure this.viewOnly = mode == "visu" - this.nbFatigue = this.viewOnly ? 0 : 1; // 1 premier point de fatigue du à la montée + this.fatigueParCase = this.viewOnly ? 0 : this.actor.getTMRFatigue(); + this.cumulFatigue = 0; this.rencontresExistantes = duplicate(this.actor.data.data.reve.rencontre.list); this.sortReserves = duplicate(this.actor.data.data.reve.reserve.list); this.casesSpeciales = this.actor.data.items.filter(item => item.type == 'casetmr'); @@ -51,7 +52,7 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ close() { - this.actor.santeIncDec("fatigue", this.nbFatigue).then(super.close()); // moving 1 cell costs 1 fatigue + this.actor.santeIncDec("fatigue", this.cumulFatigue).then(super.close()); // moving 1 cell costs 1 fatigue this.actor.tmrApp = undefined; // Cleanup reference this.actor.setStatusDemiReve(false); if (!this.viewOnly) { @@ -174,7 +175,7 @@ export class RdDTMRDialog extends Dialog { this.close(); return true; } - const resteAvantInconscience = this.actor.getFatigueMax() - this.actor.getFatigueActuelle() - this.nbFatigue; + const resteAvantInconscience = this.actor.getFatigueMax() - this.actor.getFatigueActuelle() - this.cumulFatigue; if (resteAvantInconscience <= 0) { this._tellToGM("Vous vous écroulez de fatigue : vous quittez les Terres médianes !"); this.quitterLesTMRInconscient(); @@ -245,7 +246,7 @@ export class RdDTMRDialog extends Dialog { else if (rencontreData.rolled.isEchec && rencontreData.rencontre.isPersistant) { setTimeout(() => { rencontreData.nbRounds++; - this.nbFatigue += 1; + this.cumulFatigue += this.fatigueParCase; this._tentativeMaitrise(rencontreData); this._deleteTmrMessages(rencontreData.actor, rencontreData.nbRounds); }, 2000); @@ -609,7 +610,7 @@ export class RdDTMRDialog extends Dialog { await this.actor.update({ "data.reve.tmrpos": tmrPos }); this._updateDemiReve(); - this.nbFatigue += 1; + this.cumulFatigue += this.fatigueParCase; this.updateValuesDisplay(); game.socket.emit("system.foundryvtt-reve-de-dragon", { msg: "msg_tmr_move", data: { @@ -700,6 +701,7 @@ export class RdDTMRDialog extends Dialog { // Gestion du cout de montée en points de rêve let reveCout = (this.tmrdata.isRapide && !this.actor.checkTeteDeplacementAccelere()) ? -2 : -1; + this.cumulFatigue += this.fatigueParCase; reveCout -= this.actor.checkMonteeLaborieuse(); await this.actor.reveActuelIncDec(reveCout); // Le reste... @@ -707,7 +709,6 @@ export class RdDTMRDialog extends Dialog { let tmr = TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord); await this.manageRencontre(tmr, () => { this.postRencontre(tmr); - this.nbFatigue = this.actor.getTMRFatigue(); this.actor.displayTMRQueueSouffleInformation(); }); } From cfef9a559d5aad3708ec482bb71b8a99de13ebc2 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 6 Feb 2021 01:36:02 +0100 Subject: [PATCH 07/26] =?UTF-8?q?simplification=20ajust.=20=C3=A9caille?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/rolldata-ajustements.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/rolldata-ajustements.js b/module/rolldata-ajustements.js index d1c6692a..67dd2c78 100644 --- a/module/rolldata-ajustements.js +++ b/module/rolldata-ajustements.js @@ -94,10 +94,10 @@ export const referenceAjustements = { getDescr: (rollData, actor) => rollData.diviseurSignificative > 1 ? `Facteur significative ×${Misc.getFractionHtml(rollData.diviseurSignificative)}` : '' }, isEcaille: { - isVisible: (rollData, actor) => rollData.arme && rollData.arme.data.magique && Number(rollData.arme.data.ecaille_efficacite) > 0, - isUsed: (rollData, actor) => rollData.arme && rollData.arme.data.magique && Number(rollData.arme.data.ecaille_efficacite) > 0, + isVisible: (rollData, actor) => rollData.arme?.data.magique && Number(rollData.arme?.data.ecaille_efficacite) > 0, + isUsed: (rollData, actor) => rollData.arme?.data.magique && Number(rollData.arme?.data.ecaille_efficacite) > 0, getLabel: (rollData, actor) => "Ecaille d'Efficacité: ", - getValue: (rollData, actor) => (rollData.arme && rollData.arme.data.magique && Number(rollData.arme.data.ecaille_efficacite) > 0) ? rollData.arme.data.ecaille_efficacite : 0, + getValue: (rollData, actor) => (rollData.arme?.data.magique && Number(rollData.arme.data.ecaille_efficacite) > 0) ? rollData.arme.data.ecaille_efficacite : 0, }, finesse: { isUsed: (rollData, actor) => RdDBonus.isDefenseAttaqueFinesse(rollData), From 0e037b0c34037092969e50abca6d75b32bd25ada Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 6 Feb 2021 02:04:33 +0100 Subject: [PATCH 08/26] Correction texte enchantement --- packs/sorts-narcos.db | 52 +++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/packs/sorts-narcos.db b/packs/sorts-narcos.db index 4a07ee81..3fd33b85 100644 --- a/packs/sorts-narcos.db +++ b/packs/sorts-narcos.db @@ -1,26 +1,26 @@ -{"_id":"0N6ILL5RMgmShyM8","name":"Dague de Force","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Même principe que la @Item[r9onPANmiK5E5Jnw]{Flèche de Feu}. Une dague ainsi modifiée a un +dom de +4.

\n

La dague de force a une résistance absolue tant que dure l’effet du sort et ne peut être brisée. Les dommages éventuellement reçus sont néanmoins comptabilisés et appliqués au double à l’expiration du sort. Par ailleurs, si la dague modifiée a touché ou été touchée (qu’elle ait blessé, paré, ou été parée), elle perd automatiquement 1 point de résistance à expiration du sort.

","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Une dague","difficulte":"-5","portée":"","caseTMR":"monts","caseTMRspeciale":"","ptreve":"3","xp":0,"portee":"","isrituel":false},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/competence_narcos.svg","effects":[]} -{"_id":"1KMBCeC1qPZTfxle","name":"Gourdin-Dragon","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Il s’agit d’une transformation radicale. Sous l’effet du sort, le gourdin devient une véritable épée dragonne, d’une résistance normale (12), d’un +dom de +3 et d’un encombrement standard de 2. Utilisée ou non, l’arme devient un tas de copeaux  déchiquetés à l’expiration du sort.

","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Un gourdin, morceau de bois, branche ou autre, de la taille et du diamètre approximatifs d’une épée dragonne","difficulte":"-7","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"7","xp":0,"isrituel":false,"portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/competence_narcos.svg","effects":[]} -{"_id":"4ShhmXKmsIbwoZcG","name":"Maîtrise","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Ce rituel établit le lien qui unira l'objet à son utilisateur, permettant à ce dernier d'en établir la maîtrise. Antinomique du rituel d'Autonomie, réservé à de très spécifiques Grandes Écailles de Narcos, le rituel de Maîtrise est obligatoire pour toutes les écailles courantes : efficacité, activité, protection.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-7","portée":"","caseTMR":"fleuve","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"5NZnTt0mvfPorSHG","name":"Écailles de Protection contre le venin *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection confère un bons de +1 au jet de CONSTITUTION contre toutes les sortes de venin et de poison, augmentant ainsi les chances de leur résister.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"74XSU8DqNBXGFn3R","name":"Dragonne Lame","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Même principe que la@Item[r9onPANmiK5E5Jnw]{Flèche de Feu} et la @Item[8BJ9kn3AWLFDwvez]{Dague de Force}, y compris la détérioration automatique de 1 point de résistance. Une épée dragonne ainsi modi$ée a un +dom de +6.

","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Une épée Dragonne (exclusivement)","difficulte":"6","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"4","xp":0,"isrituel":false,"portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/competence_narcos.svg","effects":[]} -{"_id":"AIBLH8EduhfUQscn","name":"Écaille d'Efficacité *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Les écailles d'efficacité servent à rendre un objet plus efficace, mais uniquement dans sa fonction normale. Une arme magiquement efficace permettra de toucher plus facilement un adversaire ; un bouclier de mieux parer ; un instrument de musique de jouer mieux à moindre effort ; mais un balai magique permettre de mieux balayer et non de voler. Les écailles d'efficacité n'ont de pertinence que sur les objets pouvant être utilisés activement, armes, instruments, outils. Les objets passifs, meubles, contenants, vêtements, armures, ne peuvent pas être rendus plus efficaces.

\n

En terme de jeu, chaque écaille d'efficacité possédée par l'objet confère un bonus de +1 sur la table de Résolution lors de son utilisation. S'il s'agit d'une arme, chaque écaille d'efficacité augmente également de 1 le facteur d'initiative, ainsi que le +dom de l'arme, mais jusqu'au maximum du double normal de ce dernier. Soit une épée dragonne (+dom +3) possédant 5 écailles d'efficacité. Son utilisateur bénéficie d'un bonus de +5 à l'initiative, de +5 à l'attaque et à la parade, mais d'un +dom de +6 seulement (le double du +dom normal) et non pas de +8. Ne pas oublier néanmoins de rajouter le +dom personnel dû à la taille et à la force. Cette règle s'applique également aux armes de jet (dague, javelot, fouet). En ce qui concerne les armes de tir (arbalète, arc et fronde), l'efficacité ne s'applique qu'aux dommages  (toujours pour un maximum du double du +dom normal) et non au toucher. Pour qu'un archer bénéficie d'un bonus d'efficacité au toucher et aux dommages, il doit avoir à la fois un arc magique et une flèche magique.

\n

Le nombre maximum d'écailles d'efficacité pouvant être posées sur un objet est égal à l'enchantabilité de sa gemme, mais avec un maximum de 7 quelle que soit cette dernière. Pour obtenir des armes magiques d'un bonus supérieur à +7, il faut avoir recours à une éventuelle Grande Écaille de Narcos spécifique.

\n

La pose de chaque écaille d'efficacité coûte un point de seuil. Mais il n'y a aucune limite de temps entre la pose de chacune, l'objet pouvant être utilisé dans l'intervalle. Par exemple, on peut se contenter provisoirement d'une épée +1 (une écaille), s'en servir plusieurs fois en combat, et plus tard, rajouter une se conde écaille pour obtenir une épée +2. Toutefois, si entretemps l'objet a été maîtrisé par quelqu'un d'autre, il faut effectuer une Lecture d'Aura complète avant de pouvoir reposer une écaille. Si cette précaution est négligée, on aboutit à un cas de magie impossible. L'utilisation d'un objet magiquement efficace coûte un point de rêve par heure quel que soit le nombre d'écailles.

\n

Si plusieurs gemmes sont alliées à un même objet grâce à Individualité et reçoivent toutes des écailles d'efficacité, leurs bonus ne s'ajoutent pas, on ne considère que le meilleur. Des gemmes différentes sont faites pour des pouvoirs entièrement différents.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"monts","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"BibuJdKmaQJm3kFw","name":"Annulation de magie","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Ce rituel permet d’annuler un effet magique, que celui-ci ait été accompli par soi-même ou par un autre haut-rêvant. On peut annuler l’effet d’un sort, de zone ou individuel, d’un rituel d’enchantement, d’une invocation, etc.

\n

Le haut-rêvant doit se trouver dans la case spécifique des TMR d’où la magie a été accomplie. Le jet de RÊVE qu’il doit réussir a alors la même difficulté que celui ayant permis la magie, avec une dépense de points de rêve pareillement identique.

\n

Pour annuler une invocation, le rituel d’Annulation doit être ciblé sur la créature invoquée. Quand la magie est le résultat conjoint de plusieurs rituels, ce qui est notamment le cas des objets magiques, chacun doit être annulé tour à tour, en commençant toujours par le dernier à avoir été accompli chronologiquement. D’une manière générale, ce sont les mêmes opérations qui doivent être répétées à l’envers. Quand un rituel coûte des points de seuil, son annulation en coûte également (le même nombre). Annulation de Magie sert également à exorciser les entités de cauchemar non incarnées. La difficulté d’un exorcisme est toujours R-7, et le coût en points de rêve égal au RÊVE de l’entité. Le ciblage doit être fait sur la créature possédée.

\n

Avant d’accomplir une Annulation de Magie, les paramètres de la magie à annuler (case des TMR, R-, r) peuvent être découverts au moyen du rituel Lecture d’Aura.

\n

Pour la synthèse d’Annulation de Magie, considérer que ce rituel est de difficulté R-7. Il peut être utilisé indifféremment par Oniros, Hypnos ou Narcos (mais jamais Thanatos), quelle que soit la voie ayant servi à accomplir la magie à annuler.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"Effet magique","difficulte":"variable","portée":"","caseTMR":"special","caseTMRspeciale":"variable","ptreve":"variable","xp":0,"isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]} -{"_id":"FpwaK1qJxKGs9HgS","name":"Permanence *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

C'est par ce rituel que le haut-rêvant stabilise les points de rêve d'une potion ou d'un objet, afin d'en prévenir l'évaporation quotidienne. Facultatif pour les potions, le rituel de Permanence est obligatoire pour tous les autres objets magiques.  Son accomplissement diminue de 1 point le seuil de rêve du haut-rêvant.

","draconic":"narcos","duree":"Instantanée","JR":"","cible":"","difficulte":"-5","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"5","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"KW2VZhuEGJGglGcW","name":"Restauration *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Restauration est un rituel secondaire nullement obligatoire. Son seul usage est de redonner des points de rêve actifs à une amulette de protection. Il est en effet impossible d'utiliser le simple Enchantement une fois le rituel de Permanence accompli. Restauration fonctionne de façon semblable à un Enchantement, sauf que son accomplissement coûte chaque fois un point de seuil. On peut  restaurer les points de rêve d'une amulette en plusieurs fois en intercalant un rituel de Purifcation entre chaque rituel de Restauration (qui coûte chaque fois un point de seuil). Il est possible de redonner plus de points de rêve actifs à l'objet qu'il n'en avait au départ, jusqu'à concurrence du maximum possible. Le nombre maximum de points de rêve actifs qu'un objet puisse posséder est égal à 7 fois l'enchantabilité de sa gemme.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"P9jMT8pl4pgKEoEW","name":"Écailles de Protection contre le feu *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû au feu, jouant le rôle d'une \"armure ignifugée\". Soit un personnage possédant une telle amulette dotée de 5 écailles, et se retrouvant dans une zone d'Air en Feu. Au lieu de jouer un jet d'encaissement à +10, il ne la joue qu'à +5. La protection de l'amulette est en plus de la protection physique qu'il peut avoir, laquelle ne peut être - rappelons-le - que d'un maximum de 2 points.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"SUrdOuvvelLtiZMy","name":"Écailles de Protection contre les projectiles *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû à un projectile, flèche, carreau, pierre de fronde, dague, javelot, fouet. La protection de l'amulette est en plus de l'armure véritable du personnage. Soit un personnage vêtu de cuir épais (prot. 3), possédant une amulette de 3 écailles, et recevant une flèche (+dom +2). Face à une flèche, le cuir épais ne vaut plus que 1, mais on y rajoute les 3 écailles de l'amulette, pour un jet d'encaissement final de -2 au lieu de +1.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"gouffre","caseTMRspeciale":"","ptreve":"6","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"TSDY6o00ri2ktlVM","name":"Puits de rêve *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Le Puits de rêve permet de stocker des points de rêve et de les y puiser à volonté, c'est en quelque sorte une tirelire de points de rêve. Le Puits de rêve peut avoir la forme de n'importe quel objet et même se contenter d'être une gemme seule. Pour y stocker des points de rêve, l'utilisateur doit le tenir dans sa main nue et se concentrer pendant un round. Il perd autant de points de rêve que souhaité, points qui sont instantanément transvasés dans le Puits de rêve. Aucune montée en TMR ni jets de dés ne sont nécessaires. Pareillement, pour puiser des points de rêve dans le Puits, il suffit de le tenir dans sa main nue au moment de lancer un sort. Au lieu de dépenser ses propres points, l'utilisateur les puise dans le Puits de rêve. Les points puisés ne peuvent avoir qu'un seul usage : alimenter un sort, lancé naturellement ou via une écaille d'activité, ou alimenter un rituel. Rien d'autre. Il ne peuvent pas servir à payer un coût de maîtrise ni un coût d'objet efficace, ni un coût d'amulette de protection. La dépense de points de rêve doit provenir intégralement de l'une ou l'autre source, utilisateur ou Puits de rêve, on ne peut pas partager. On ne peut pas non plus les récupérer pour les \"remettre dans sa tête\".

\n

La gemme destinée à recevoir un Puits de rêve n'a pas besoin de points actifs ; si elle en a lors de l'accomplissement de Permanence, ils sont purement et simplement ignorés (annulés). La gemme peut recevoir autant de Grandes Écailles de Puits de rêve que son enchantibilité jusqu'à un maximum de 7. Chaque Grande Écaille permet de stocker jusqu'à 7 points de rêve. Soit une gemme d'enchantabilité 6 possédant 6 Grandes Écailles de Puits de rêve, on peut y stocker jusqu'à 42 points de rêve. Un Puits de rêve n'a jamais besoin d'être entièrement plein et peut pareillement rester vide sans en souffrir. Face à une grosse dépense, on peut le vider entièrement d'un seul coup.

\n

Un Puits de rêve peut être posé (avec Individualité) sur une seconde gemme d'un objet possédant une écaille d'activité. Lors de l'utilisation de l'objet, les points de rêve de coût de sort pourront être dépensés par le Puits de rêve ou par l'utilisateur au choix de ce dernier. Un Puits de rêve changeant de main doit être maîtrisé selon la règle normale. La maîtrise a lieu soit au moment où l'on stocke, soit où l'on puise, le premier des deux, et coûte 1 point de rêve par Grande Écaille. Note  : les points dépensés pour la maîtrise ne vont pas dans le Puis de rêve, sils ont perdus.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"TjhnUMh6UL04k0k8","name":"Purification","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Purification est un rituel secondaire, mais néanmoins obligatoire. A moins de disposer d'une énorme quantité de points de rêve, il est vain d'espérer enchanter l'objet en une seule fois. Purifcation doit toujours s'intercaler entre deux rituels identiques : entre deux Enchantements, mais également entre deux écailles, d'activité ou de protection. Sauter cette étape aboutit à un cas de magie impossible.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"WUYaL4yvr0wFRLjk","name":"Enchantement","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

C'est le rituel de base e tout enchantement, c'est par lui que le haut-rêvant confère des points de rêve à la gemme ou à la potion. Le nombre de points conférés, paramétré au lancer du sort, est à son entière discrétion. Entre deux Enchantements de la même potion ou de la même gemme doit être accompli un rituel de Purificiation.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"X8yMNrnbFIwTB6oL","name":"Écailles de Protection contre griffes et crocs *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû aux armes naturelles des animaux, griffes, crocs, mais également piétinement, cornes, tentacules, etc. Elle protège également des dommages au corps à corps de pugilat, coups de poing, coups de pied, mais ne s'applique pas à l'empoignade. La protection est en plus de l'armure véritable du personnage. 

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.

\n

Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a a!aire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.

\n

Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a a!aire à une créature vivante et douée de rêve.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]} -{"_id":"asVUMvyZ0OocReY6","name":"Individualité","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Rituel secondaire, Individualité est néanmoins obligatoire pour les objets possédant plusieurs pouvoirs distincts. Il doit être accompli sur toute nouvelle gemme, enchantée d’au moins un point de rêve actif, avant le rituel d’Alliance. Lors, c’est uniquement à cette nouvelle gemme que s’adresseront les points de rêve et les écailles. Vis à vis d’une nouvelle gemme, le matériau re-possède toute son inertie et doit à nouveau être saturé. Quand un objet a plusieurs gemmes, toutes ont dû recevoir Individualité sauf la première. Les pouvoirs d’un objet doivent être élaborés l’un après l’autre. Dès que l’on a commencé une nouvelle gemme, on ne peut plus revenir sur les précédentes.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","xp":0,"isrituel":true,"portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/competence_narcos.svg","effects":[]} -{"_id":"ckH9xONcfsffpRVr","name":"Écailles de Protection contre la magie *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection rajoute un +1 à tous les jets de résistance contre les sorts d'illusion-suggestion d'Hypnos ainsi que les rituels de Possession et les sorts et griffes de Thanatos. L'amulette n'est pas spécifique à un sort, elle protège de tous. Soit un personnage possédant une amulette de 4 écailles et devant jouer une JR r-8, il ne joue en réalité qu'un JR r-4, augmentant considérablement ses chances de résister à la magie. La protection ne s'applique qu'à la magie autorisant un JR.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"6","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"hWAoVheMfyLIMKZy","name":"Alliance","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"sort","data":{"description":"

Ce rituel unit magiquement la gemme, seul véritable réceptacle du rêve,au reste de l’objet, en sorte que son pouvoir puisse s’étendre à lui. Ce qui s’applique à la gemme s’applique désormais à l’objet, et inversement. La forme de l’objet participe maintenant à la magie. C’est pourquoi il doit être utilisé comme l’exige sa fonction normale (bague au doigt, etc.) et pourquoi sa forme doit être en analogie avec le ciblage. Pratiquement, une gemme seule ne peut être utilisée que pour une écaille d’activité lançant un sort sur l’utilisateur lui-même (la gemme ne lui permettant pas d’autre ciblage). Une gemme seule pourrait être une amulette de protection, mais il faudrait la tenir sans cesse dans le creux de la main (seule façon d’utiliser une gemme seule). En revanche, on peut s’en contenter pour la Grande Écaille de Narcos Puits de rêve.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"pont","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true},"flags":{"core":{"sourceId":"Item.5UQMurs8lNa8eBr0"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"hunCnz9KW1gc5ab7","name":"Autonomie **","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Le rituel d'Autonomie doit obligatoirement être utilisé à la place du rituel de Maîtrise pour les objets autonomes, c'est-à-dire fonctionnant uniquement à partir d'une certaine programmation, sans l'intervention d'un utilisateur. Chaque cas d'objet autonome correspond à une Grande Écaille de Narcos spécifique. Il s'agit  usuellement de dispositifs se mettant automatiquement à fonctionner en présence d'un signal prévu dans leur programmation : piège magique qui se déclenche au moindre bruit, statue qui répète un message quand on passe devant elle, feu ou torche qui s'allume dès qu'on frappe dans ses mains, etc. Les objets autonomes étaient la grande passion des hauts-rêvants du Second Âge, qui les agençaient souvent en de grandioses mises en scène. Pratiquement, un objet autonome dépense ses points de rêve actifs pour obtenir son effet, tout comme un haut-rêvant dépense les siens. Autonomie permet de les récupérer tout seul, à raison de 3 points par heure complète de non-utilisation, sans pouvoir dépasser le nombre de points actifs initial. L'accomplissement du rituel d'Autonomie coûte 2 points de seuil.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"10","portee":"","isrituel":true,"coutseuil":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"lq3jQDJsAflJ2PEy","name":"Flèche de Feu","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

L’intitulé de ce sort n’est que métaphorique. Le sort ne rend pas la flèche ignée, mais augmente son tranchant et son pouvoir de pénétration. Un projectile ainsi modifié (quelle que soit l’arme, flèche ou carreau) a un +dom de +5 et annule 5 points d’armure au lieu de 2 (armure véritable et non pas protection naturelle).

\n

Si le projectile n’est pas utilisé, il est retrouvé intact à expiration du sort. Inversement, qu’il ait atteint ou non une cible, sa pointe devient inutilisable, le métal ayant fondu et coulé comme sous l’effet d’une intense chaleur.

","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Une flèche d'arc ou un carreau d'arbalète","difficulte":"-4","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"2","xp":0,"isrituel":false,"portee":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/competence_narcos.svg","effects":[]} -{"_id":"mh9JjaKckzz1eAoe","name":"Écailles de Protection contre la maladie* ","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection confère un bons de +1 au jet de CONSTITUTION contre toutes les maladies, augmentant ainsi les chances de leur résister.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"mzAV6EdQlGkVkWEN","name":"Écailles de Protection contre les lames *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû à une arme de mêlée (dague, épée, hache, lance, masse, fléeau, arme d'hast), mais ni les projectiles ni les dommages au corps à corps. La protection est en plus de l'armure véritable du personnage. 

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"sEBhR48HagKNbkob","name":"Écaille d'activité *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Le rituel d'Écaille d'Activité confère à l'objet magique le pouvoir de lancer un sort. Ce peut être un sort de zone d'Oniros, un sort d'illusion-suggestion ou d'illusion sensorielle d'Hypnos, ou un sort de Thanatos, mais ne peut en aucun cas être un rituel d'aucune des quatre voies. Ayant posé l'écaille d'activité sur l'objet (\"poser\" est le terme consacré à l'accomplissement des rituels d'Écaille), le Haut-Rêvant y lance le sort de son choix et l'objet devient capable de le lancer à son tour. Pratiquement, le haut-rêvant effectue toutes les opérations nécessaires au lancer d'un sort, y compris son paramétrage précis, puis le lance normalement en dépensant les points de rêve du coût. Toutefois, au lieu de cibler comme l'exige le ciblage normal du sort, il touche l'objet possédant l'écaille d'activité. En résultat, aucun effet ne se produit, mais le sort est maintenant enregistré dans la \"mémoire\" de la gemme. Il suffit ensuite à l'utilisateur de se concentrer mentalement sur l'effet voulu (dont il doit avoir une idée) pour que l'objet lance le sort. Il pourra le lancer indéfiniment.

\n

A la fin du round de concentration, l'utilisateur doit être capable de dépenser les points de rêve exigés par le coût du sort tel qu'il est paramétéré. S'il n'en a pas assez, il ne dépense rien, mais l'objet ne fonctionne pas. Puis cela étant fait, le sort opère au tout début du round suivant, selon le ciblage voulu par l'utilisateur, fonction de la forme de l'objet et de la façon dont il est utilisé. Pour que le sort puisse être ciblé ailleurs que sur l'utilisateur lui-même, l'objet doit avoir une forme oblongue, analogue au doigt pointé d'un haut-rêvant. Le sort enregistré dans la gemme est paramétré une fois pour toutes. Un objet lançant un sort de Sommeil de 5 rounds lancera toujours un sort de Sommeil de 5 rounds, ni plus ni moins. Un objet lançant une illusion visuelle ne lancera toujours que la même illusion au moindre détail près. La portée est celle de l'EMPATHIE du créateur de l'objet et non de l'utilisateur, et quand le sort a une durée HN, c'est également l'heure de naissance du créateur. Le seul paramétrage inutile est l'heure de naissance de la cible en prévision du jet de résistance. Quand un JR est possible, il est toujours r-8, quelle que soit la cible. S'il réussit, le sort se dissipe aussitôt sans revenir vers l'utilisateur.

\n

L'objet réussit son lancer, sans jet de dés. Lancer un sort via un objet magique n'est pas plus économique en points de rêve que de la lancer soi-même, mais évite la montée en TMR, les rencontres, et confère la certitude que le sort partira à coup sûr. L'effet d'un sort lancé par un objet peut être annulé par Annulatrion de Magie, mais pas par Annulation de ses Propres Zones ni Annulation de ses Propres Illusions.

\n

Chaque gemme d'un objet ne peut recevoir qu'une seule écaille d'activité, et la pose de cette dernière coûte un point de seuil. Une écaille d'activité ne peut enregistrer et lancer q'un seul sort. Mais un même objet peut avoir plusieurs gemmes, grâce à Individualité, chacune possédant une écaille d'activité pour lancer un sort différent.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-9","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} -{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.

\n

L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]} -{"_id":"zT72qy3Xb8ye9YKb","name":"Bouilloire de Mélimnod *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

La Grande Écaille Bouilloire de Mélimnod, du nom d'un célèbre haut-rêvant du Second Âge, est un exemple abordable d'objet autonome. Elle doit être posée sur une bouilloire ou un petit chaudron intégralement fait d'argent, de cuivre ou d'étain, à l'exclusion de tout autre métal, d'une capacité de 2 mesures (40 centilitres). La gemme peut être incrustée dans le fond du récipient ou participer à son alliage. A la fin de l'enchantement, avant l'accomplissement de Permanence, elle doit posséder au minimum 1 point de rêve actif. (Le maximum étant comme toujours 7 fois son enchantabilité.) Puis, à la place de Maîtrise, il est obligatoire d'accomplir le rituel d'Autonomie (qui coûte 2 points de seuil). La Grande Écaille peut alors être posée. Il n'en est besoin que d'une seule.

\n

Dès que la bouilloire se retrouve pleine d'eau (2 mesures), ou d'un liquide appartenant à l'élément Eau, elle se met à chauffer spontanément et porte le liquide à ébullition ern l'espace d'un seul round. Au bout d'un second round, le liquide est réduit de moitié (une mesure). Puis la bouilloire le fait refroidir, et il se retrouve tout juste tiède au bout d'un troisième round. Il peut alors demeurer indéfiniment dans la bouilloire ou être transvasé, mais dès que la bouilloire se retrouve intégralement pleine, le processus recommence. Chaque chauffe lui coûte un de ses points de rêve actifs. Le rituel d'Autonomie les lui fait récupérer à raison de 3 par heure de complète non-utilisation.

\n

Il est bien entendu possible de mettre des herbes de soin dans la bouilloire avant d'y verser l'eau, de façon à obtenir une décoction en un temps record. Etant autonome, la Bouilloire de Mélimnod n'a pas être maîtrisée. La pose de la Grande Écaille coûte 1 point de seuil.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-9","portée":"","caseTMR":"special","caseTMRspeciale":"Monts Brûlants E5","ptreve":"9","portee":"","isrituel":true,"coutseuil":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"0N6ILL5RMgmShyM8","name":"Dague de Force","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Même principe que la @Item[r9onPANmiK5E5Jnw]{Flèche de Feu}. Une dague ainsi modifiée a un +dom de +4.

\n

La dague de force a une résistance absolue tant que dure l’effet du sort et ne peut être brisée. Les dommages éventuellement reçus sont néanmoins comptabilisés et appliqués au double à l’expiration du sort. Par ailleurs, si la dague modifiée a touché ou été touchée (qu’elle ait blessé, paré, ou été parée), elle perd automatiquement 1 point de résistance à expiration du sort.

","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Une dague","difficulte":"-5","portée":"","caseTMR":"monts","caseTMRspeciale":"","ptreve":"3","xp":0,"portee":"","isrituel":false,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/competence_narcos.svg","effects":[]} +{"_id":"1KMBCeC1qPZTfxle","name":"Gourdin-Dragon","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Il s’agit d’une transformation radicale. Sous l’effet du sort, le gourdin devient une véritable épée dragonne, d’une résistance normale (12), d’un +dom de +3 et d’un encombrement standard de 2. Utilisée ou non, l’arme devient un tas de copeaux  déchiquetés à l’expiration du sort.

","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Un gourdin, morceau de bois, branche ou autre, de la taille et du diamètre approximatifs d’une épée dragonne","difficulte":"-7","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"7","xp":0,"isrituel":false,"portee":"","bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/competence_narcos.svg","effects":[]} +{"_id":"4ShhmXKmsIbwoZcG","name":"Maîtrise","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Ce rituel établit le lien qui unira l'objet à son utilisateur, permettant à ce dernier d'en établir la maîtrise. Antinomique du rituel d'Autonomie, réservé à de très spécifiques Grandes Écailles de Narcos, le rituel de Maîtrise est obligatoire pour toutes les écailles courantes : efficacité, activité, protection.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-7","portée":"","caseTMR":"fleuve","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"5NZnTt0mvfPorSHG","name":"Écailles de Protection contre le venin *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection confère un bons de +1 au jet de CONSTITUTION contre toutes les sortes de venin et de poison, augmentant ainsi les chances de leur résister.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"74XSU8DqNBXGFn3R","name":"Dragonne Lame","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Même principe que la@Item[r9onPANmiK5E5Jnw]{Flèche de Feu} et la @Item[8BJ9kn3AWLFDwvez]{Dague de Force}, y compris la détérioration automatique de 1 point de résistance. Une épée dragonne ainsi modi$ée a un +dom de +6.

","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Une épée Dragonne (exclusivement)","difficulte":"6","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"4","xp":0,"isrituel":false,"portee":"","bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/competence_narcos.svg","effects":[]} +{"_id":"AIBLH8EduhfUQscn","name":"Écaille d'Efficacité *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Les écailles d'efficacité servent à rendre un objet plus efficace, mais uniquement dans sa fonction normale. Une arme magiquement efficace permettra de toucher plus facilement un adversaire ; un bouclier de mieux parer ; un instrument de musique de jouer mieux à moindre effort ; mais un balai magique permettre de mieux balayer et non de voler. Les écailles d'efficacité n'ont de pertinence que sur les objets pouvant être utilisés activement, armes, instruments, outils. Les objets passifs, meubles, contenants, vêtements, armures, ne peuvent pas être rendus plus efficaces.

\n

En terme de jeu, chaque écaille d'efficacité possédée par l'objet confère un bonus de +1 sur la table de Résolution lors de son utilisation. S'il s'agit d'une arme, chaque écaille d'efficacité augmente également de 1 le facteur d'initiative, ainsi que le +dom de l'arme, mais jusqu'au maximum du double normal de ce dernier. Soit une épée dragonne (+dom +3) possédant 5 écailles d'efficacité. Son utilisateur bénéficie d'un bonus de +5 à l'initiative, de +5 à l'attaque et à la parade, mais d'un +dom de +6 seulement (le double du +dom normal) et non pas de +8. Ne pas oublier néanmoins de rajouter le +dom personnel dû à la taille et à la force. Cette règle s'applique également aux armes de jet (dague, javelot, fouet). En ce qui concerne les armes de tir (arbalète, arc et fronde), l'efficacité ne s'applique qu'aux dommages  (toujours pour un maximum du double du +dom normal) et non au toucher. Pour qu'un archer bénéficie d'un bonus d'efficacité au toucher et aux dommages, il doit avoir à la fois un arc magique et une flèche magique.

\n

Le nombre maximum d'écailles d'efficacité pouvant être posées sur un objet est égal à l'enchantabilité de sa gemme, mais avec un maximum de 7 quelle que soit cette dernière. Pour obtenir des armes magiques d'un bonus supérieur à +7, il faut avoir recours à une éventuelle Grande Écaille de Narcos spécifique.

\n

La pose de chaque écaille d'efficacité coûte un point de seuil. Mais il n'y a aucune limite de temps entre la pose de chacune, l'objet pouvant être utilisé dans l'intervalle. Par exemple, on peut se contenter provisoirement d'une épée +1 (une écaille), s'en servir plusieurs fois en combat, et plus tard, rajouter une se conde écaille pour obtenir une épée +2. Toutefois, si entretemps l'objet a été maîtrisé par quelqu'un d'autre, il faut effectuer une Lecture d'Aura complète avant de pouvoir reposer une écaille. Si cette précaution est négligée, on aboutit à un cas de magie impossible. L'utilisation d'un objet magiquement efficace coûte un point de rêve par heure quel que soit le nombre d'écailles.

\n

Si plusieurs gemmes sont alliées à un même objet grâce à Individualité et reçoivent toutes des écailles d'efficacité, leurs bonus ne s'ajoutent pas, on ne considère que le meilleur. Des gemmes différentes sont faites pour des pouvoirs entièrement différents.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"monts","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"BibuJdKmaQJm3kFw","name":"Annulation de magie","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Ce rituel permet d’annuler un effet magique, que celui-ci ait été accompli par soi-même ou par un autre haut-rêvant. On peut annuler l’effet d’un sort, de zone ou individuel, d’un rituel d’enchantement, d’une invocation, etc.

\n

Le haut-rêvant doit se trouver dans la case spécifique des TMR d’où la magie a été accomplie. Le jet de RÊVE qu’il doit réussir a alors la même difficulté que celui ayant permis la magie, avec une dépense de points de rêve pareillement identique.

\n

Pour annuler une invocation, le rituel d’Annulation doit être ciblé sur la créature invoquée. Quand la magie est le résultat conjoint de plusieurs rituels, ce qui est notamment le cas des objets magiques, chacun doit être annulé tour à tour, en commençant toujours par le dernier à avoir été accompli chronologiquement. D’une manière générale, ce sont les mêmes opérations qui doivent être répétées à l’envers. Quand un rituel coûte des points de seuil, son annulation en coûte également (le même nombre). Annulation de Magie sert également à exorciser les entités de cauchemar non incarnées. La difficulté d’un exorcisme est toujours R-7, et le coût en points de rêve égal au RÊVE de l’entité. Le ciblage doit être fait sur la créature possédée.

\n

Avant d’accomplir une Annulation de Magie, les paramètres de la magie à annuler (case des TMR, R-, r) peuvent être découverts au moyen du rituel Lecture d’Aura.

\n

Pour la synthèse d’Annulation de Magie, considérer que ce rituel est de difficulté R-7. Il peut être utilisé indifféremment par Oniros, Hypnos ou Narcos (mais jamais Thanatos), quelle que soit la voie ayant servi à accomplir la magie à annuler.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"Effet magique","difficulte":"variable","portée":"","caseTMR":"special","caseTMRspeciale":"variable","ptreve":"variable","xp":0,"isrituel":true,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]} +{"_id":"FpwaK1qJxKGs9HgS","name":"Permanence *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

C'est par ce rituel que le haut-rêvant stabilise les points de rêve d'une potion ou d'un objet, afin d'en prévenir l'évaporation quotidienne. Facultatif pour les potions, le rituel de Permanence est obligatoire pour tous les autres objets magiques.  Son accomplissement diminue de 1 point le seuil de rêve du haut-rêvant.

","draconic":"narcos","duree":"Instantanée","JR":"","cible":"","difficulte":"-5","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"5","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"KW2VZhuEGJGglGcW","name":"Restauration *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Restauration est un rituel secondaire nullement obligatoire. Son seul usage est de redonner des points de rêve actifs à une amulette de protection. Il est en effet impossible d'utiliser le simple Enchantement une fois le rituel de Permanence accompli. Restauration fonctionne de façon semblable à un Enchantement, sauf que son accomplissement coûte chaque fois un point de seuil. On peut  restaurer les points de rêve d'une amulette en plusieurs fois en intercalant un rituel de Purifcation entre chaque rituel de Restauration (qui coûte chaque fois un point de seuil). Il est possible de redonner plus de points de rêve actifs à l'objet qu'il n'en avait au départ, jusqu'à concurrence du maximum possible. Le nombre maximum de points de rêve actifs qu'un objet puisse posséder est égal à 7 fois l'enchantabilité de sa gemme.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"P9jMT8pl4pgKEoEW","name":"Écailles de Protection contre le feu *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû au feu, jouant le rôle d'une \"armure ignifugée\". Soit un personnage possédant une telle amulette dotée de 5 écailles, et se retrouvant dans une zone d'Air en Feu. Au lieu de jouer un jet d'encaissement à +10, il ne la joue qu'à +5. La protection de l'amulette est en plus de la protection physique qu'il peut avoir, laquelle ne peut être - rappelons-le - que d'un maximum de 2 points.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"SUrdOuvvelLtiZMy","name":"Écailles de Protection contre les projectiles *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû à un projectile, flèche, carreau, pierre de fronde, dague, javelot, fouet. La protection de l'amulette est en plus de l'armure véritable du personnage. Soit un personnage vêtu de cuir épais (prot. 3), possédant une amulette de 3 écailles, et recevant une flèche (+dom +2). Face à une flèche, le cuir épais ne vaut plus que 1, mais on y rajoute les 3 écailles de l'amulette, pour un jet d'encaissement final de -2 au lieu de +1.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"gouffre","caseTMRspeciale":"","ptreve":"6","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"TSDY6o00ri2ktlVM","name":"Puits de rêve *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Le Puits de rêve permet de stocker des points de rêve et de les y puiser à volonté, c'est en quelque sorte une tirelire de points de rêve. Le Puits de rêve peut avoir la forme de n'importe quel objet et même se contenter d'être une gemme seule. Pour y stocker des points de rêve, l'utilisateur doit le tenir dans sa main nue et se concentrer pendant un round. Il perd autant de points de rêve que souhaité, points qui sont instantanément transvasés dans le Puits de rêve. Aucune montée en TMR ni jets de dés ne sont nécessaires. Pareillement, pour puiser des points de rêve dans le Puits, il suffit de le tenir dans sa main nue au moment de lancer un sort. Au lieu de dépenser ses propres points, l'utilisateur les puise dans le Puits de rêve. Les points puisés ne peuvent avoir qu'un seul usage : alimenter un sort, lancé naturellement ou via une écaille d'activité, ou alimenter un rituel. Rien d'autre. Il ne peuvent pas servir à payer un coût de maîtrise ni un coût d'objet efficace, ni un coût d'amulette de protection. La dépense de points de rêve doit provenir intégralement de l'une ou l'autre source, utilisateur ou Puits de rêve, on ne peut pas partager. On ne peut pas non plus les récupérer pour les \"remettre dans sa tête\".

\n

La gemme destinée à recevoir un Puits de rêve n'a pas besoin de points actifs ; si elle en a lors de l'accomplissement de Permanence, ils sont purement et simplement ignorés (annulés). La gemme peut recevoir autant de Grandes Écailles de Puits de rêve que son enchantibilité jusqu'à un maximum de 7. Chaque Grande Écaille permet de stocker jusqu'à 7 points de rêve. Soit une gemme d'enchantabilité 6 possédant 6 Grandes Écailles de Puits de rêve, on peut y stocker jusqu'à 42 points de rêve. Un Puits de rêve n'a jamais besoin d'être entièrement plein et peut pareillement rester vide sans en souffrir. Face à une grosse dépense, on peut le vider entièrement d'un seul coup.

\n

Un Puits de rêve peut être posé (avec Individualité) sur une seconde gemme d'un objet possédant une écaille d'activité. Lors de l'utilisation de l'objet, les points de rêve de coût de sort pourront être dépensés par le Puits de rêve ou par l'utilisateur au choix de ce dernier. Un Puits de rêve changeant de main doit être maîtrisé selon la règle normale. La maîtrise a lieu soit au moment où l'on stocke, soit où l'on puise, le premier des deux, et coûte 1 point de rêve par Grande Écaille. Note  : les points dépensés pour la maîtrise ne vont pas dans le Puis de rêve, sils ont perdus.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"TjhnUMh6UL04k0k8","name":"Purification","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Purification est un rituel secondaire, mais néanmoins obligatoire. A moins de disposer d'une énorme quantité de points de rêve, il est vain d'espérer enchanter l'objet en une seule fois. Purifcation doit toujours s'intercaler entre deux rituels identiques : entre deux Enchantements, mais également entre deux écailles, d'activité ou de protection. Sauter cette étape aboutit à un cas de magie impossible.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"necropole","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"WUYaL4yvr0wFRLjk","name":"Enchantement","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

C'est le rituel de base de tout enchantement, c'est par lui que le haut-rêvant confère des points de rêve à la gemme ou à la potion. Le nombre de points conférés, paramétré au lancer du sort, est à son entière discrétion. Entre deux Enchantements de la même potion ou de la même gemme doit être accompli un rituel de Purificiation.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"1+","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"X8yMNrnbFIwTB6oL","name":"Écailles de Protection contre griffes et crocs *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû aux armes naturelles des animaux, griffes, crocs, mais également piétinement, cornes, tentacules, etc. Elle protège également des dommages au corps à corps de pugilat, coups de poing, coups de pied, mais ne s'applique pas à l'empoignade. La protection est en plus de l'armure véritable du personnage. 

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"marais","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"Y4r9kTN2brWC2N0n","name":"Lecture d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Lecture d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Ce rituel permet d’approfondir les informations fournies par Détection d’Aura. Pratiquer Lecture d’Aura quand il n’y a pas d’aura revient à demander une magie impossible et crée immédiatement une déchirure du rêve.

\n

Lecture d’Aura est effectuée en plusieurs étapes, toutes étant de difficulté R-3 et coûtant 3 points de rêve. La première a toujours lieu dans un sanctuaire et ne fait que révéler dans quel(s) autre(s) genre(s) de case(s) le haut-rêvant doit se rendre pour continuer sa lecture. Là, il apprend quel genre de magie a été produit ou à quel type de rêve il a a!aire, de même que les cases spécifiques concernées. Enfin dans les cases spécifiques, le haut-rêvant peut apprendre la force du rêve ou de la magie en cours, c’est-à-dire pratiquement la difficulté et le nombre de points de rêve impliqués, information indispensable dans l’optique d’une annulation de magie.

\n

Lecture d’Aura révèle également la couleur de l’aura (fixe ou pulsative) comme Détection d’Aura. Pour les créatures vivantes, on peut donc sauter l’étape de Détection d’Aura et commencer directement par la lecture, puisqu’on est sûr de trouver une aura. Dans les autres cas, il est plus prudent de commencer par la détection si, en l’absence finale d’une aura, on ne veut pas créer de magie impossible. Effectuée sur une créature non soumise à un effet magique ni sous l’emprise d’une entité, Lecture d’Aura indique toujours le Fleuve. Là, dans n’importe quelle case du Fleuve, le haut-rêvant se contente d’apprendre qu’il a a!aire à une créature vivante et douée de rêve.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"special","caseTMRspeciale":"Sanctuaire / variable","ptreve":"3","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]} +{"_id":"asVUMvyZ0OocReY6","name":"Individualité","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Rituel secondaire, Individualité est néanmoins obligatoire pour les objets possédant plusieurs pouvoirs distincts. Il doit être accompli sur toute nouvelle gemme, enchantée d’au moins un point de rêve actif, avant le rituel d’Alliance. Lors, c’est uniquement à cette nouvelle gemme que s’adresseront les points de rêve et les écailles. Vis à vis d’une nouvelle gemme, le matériau re-possède toute son inertie et doit à nouveau être saturé. Quand un objet a plusieurs gemmes, toutes ont dû recevoir Individualité sauf la première. Les pouvoirs d’un objet doivent être élaborés l’un après l’autre. Dès que l’on a commencé une nouvelle gemme, on ne peut plus revenir sur les précédentes.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"desert","caseTMRspeciale":"","ptreve":"4","xp":0,"isrituel":true,"portee":"","bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/competence_narcos.svg","effects":[]} +{"_id":"ckH9xONcfsffpRVr","name":"Écailles de Protection contre la magie *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection rajoute un +1 à tous les jets de résistance contre les sorts d'illusion-suggestion d'Hypnos ainsi que les rituels de Possession et les sorts et griffes de Thanatos. L'amulette n'est pas spécifique à un sort, elle protège de tous. Soit un personnage possédant une amulette de 4 écailles et devant jouer une JR r-8, il ne joue en réalité qu'un JR r-4, augmentant considérablement ses chances de résister à la magie. La protection ne s'applique qu'à la magie autorisant un JR.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-8","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"6","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"hWAoVheMfyLIMKZy","name":"Alliance","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"sort","data":{"description":"

Ce rituel unit magiquement la gemme, seul véritable réceptacle du rêve,au reste de l’objet, en sorte que son pouvoir puisse s’étendre à lui. Ce qui s’applique à la gemme s’applique désormais à l’objet, et inversement. La forme de l’objet participe maintenant à la magie. C’est pourquoi il doit être utilisé comme l’exige sa fonction normale (bague au doigt, etc.) et pourquoi sa forme doit être en analogie avec le ciblage. Pratiquement, une gemme seule ne peut être utilisée que pour une écaille d’activité lançant un sort sur l’utilisateur lui-même (la gemme ne lui permettant pas d’autre ciblage). Une gemme seule pourrait être une amulette de protection, mais il faudrait la tenir sans cesse dans le creux de la main (seule façon d’utiliser une gemme seule). En revanche, on peut s’en contenter pour la Grande Écaille de Narcos Puits de rêve.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-4","portée":"","caseTMR":"pont","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"xp":0,"bonuscase":"","coutseuil":0},"flags":{"core":{"sourceId":"Item.5UQMurs8lNa8eBr0"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"hunCnz9KW1gc5ab7","name":"Autonomie **","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Le rituel d'Autonomie doit obligatoirement être utilisé à la place du rituel de Maîtrise pour les objets autonomes, c'est-à-dire fonctionnant uniquement à partir d'une certaine programmation, sans l'intervention d'un utilisateur. Chaque cas d'objet autonome correspond à une Grande Écaille de Narcos spécifique. Il s'agit  usuellement de dispositifs se mettant automatiquement à fonctionner en présence d'un signal prévu dans leur programmation : piège magique qui se déclenche au moindre bruit, statue qui répète un message quand on passe devant elle, feu ou torche qui s'allume dès qu'on frappe dans ses mains, etc. Les objets autonomes étaient la grande passion des hauts-rêvants du Second Âge, qui les agençaient souvent en de grandioses mises en scène. Pratiquement, un objet autonome dépense ses points de rêve actifs pour obtenir son effet, tout comme un haut-rêvant dépense les siens. Autonomie permet de les récupérer tout seul, à raison de 3 points par heure complète de non-utilisation, sans pouvoir dépasser le nombre de points actifs initial. L'accomplissement du rituel d'Autonomie coûte 2 points de seuil.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"10","portee":"","isrituel":true,"coutseuil":2,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"lq3jQDJsAflJ2PEy","name":"Flèche de Feu","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

L’intitulé de ce sort n’est que métaphorique. Le sort ne rend pas la flèche ignée, mais augmente son tranchant et son pouvoir de pénétration. Un projectile ainsi modifié (quelle que soit l’arme, flèche ou carreau) a un +dom de +5 et annule 5 points d’armure au lieu de 2 (armure véritable et non pas protection naturelle).

\n

Si le projectile n’est pas utilisé, il est retrouvé intact à expiration du sort. Inversement, qu’il ait atteint ou non une cible, sa pointe devient inutilisable, le métal ayant fondu et coulé comme sous l’effet d’une intense chaleur.

","draconic":"narcos","duree":"HN","JR":"Il n’y a aucun JR pour les objets ordinaires. Les objets magiques (enchantés) résistent automatiquement, le sort se dissipant sans effet, les points de rêve étant néanmoins dépensés","cible":"Une flèche d'arc ou un carreau d'arbalète","difficulte":"-4","portée":"","caseTMR":"foret","caseTMRspeciale":"","ptreve":"2","xp":0,"isrituel":false,"portee":"","bonuscase":"","coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/templates/competence_narcos.svg","effects":[]} +{"_id":"mh9JjaKckzz1eAoe","name":"Écailles de Protection contre la maladie* ","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection confère un bons de +1 au jet de CONSTITUTION contre toutes les maladies, augmentant ainsi les chances de leur résister.

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-6","portée":"","caseTMR":"cite","caseTMRspeciale":"","ptreve":"4","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"mzAV6EdQlGkVkWEN","name":"Écailles de Protection contre les lames *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Chaque écaille de protection diminue de 1 point le jet d'encaissement de tout dommage dû à une arme de mêlée (dague, épée, hache, lance, masse, fléeau, arme d'hast), mais ni les projectiles ni les dommages au corps à corps. La protection est en plus de l'armure véritable du personnage. 

\n

Une amulette peut avoir n'importe quelle forme, mais ne fonctionne que si elle est en contact avec la peau nue de son possesseur. Si c'est le cas, elle fonctionne spontanément en face du danger pour lequel elle est conçue, même si le possesseur n'a aucune idée de son pouvoir. Pour fonctionner, l'amulette a besoin de points de rêve actifs. Ces points doivent être des points de rêve conférés par le rituel d'Enchantement en plus des points inertes. Autrement dit, voulant fabriquer une amulette, le haut-rêvant ne s'arrête pas d'enchanter quand il atteint un nombre de points de rêve égal à l'inertie totale de l'objet, mais continue à en rajouter. Le nombre maximum de points actifs qu'une amulette puisse posséder est égal à 7 fois l'enchantabilité de sa gemme ; et, comme pour les écailles d'efficacité, le nombre d'écailles de protection qu'elle puisse posséder est égal à l'enchantabilité de celle-ci avec un maximum de 7. Des amulettes plus puissantes ne pourraient être obtenues que par de spécifiques Grandes Écailles de Narcos.

\n

Soit une gemme de taille 6 et de pureté 5, ayant donc une inertie de 2 et une enchantabilité de 4. Elle peut posséder jusqu'à 4 écailles de protection (=enchantabilité) et un maximum de 28 points de rêve actifs (7   x 4 = 28).

\n

Chaque fois qu'une amulette de protection fonctionne, elle dépense un de ses points de rêve actifs quel que soit le nombre d'écailles. Le possesseur, lui, n'en dépense qu'un par heure, quel que soit le nombre de fonctionnements de l'amulette au cours de cette heure. Quand une amulette n'a plus de points actifs, elle cesse de fonctionner. On ne peut lui en redonner que par le rituel de Restauration. Les écailles de protection peuvent être posées progressivement, comme celles d'efficacité, même si l'amulette fonctionne entre temps. Mêmes règles d'application. Une gemme donnée ne peut recevoir que des écailles de protection d'un même type, mais grâce à Individualité, plusieurs gemmes d'une même amulette peuvent offrir des protections différentes. La pose de chaque écaille de protection coûte un point de seuil.

\n

 

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-10","portée":"","caseTMR":"lac","caseTMRspeciale":"","ptreve":"8","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"sEBhR48HagKNbkob","name":"Écaille d'activité *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

Le rituel d'Écaille d'Activité confère à l'objet magique le pouvoir de lancer un sort. Ce peut être un sort de zone d'Oniros, un sort d'illusion-suggestion ou d'illusion sensorielle d'Hypnos, ou un sort de Thanatos, mais ne peut en aucun cas être un rituel d'aucune des quatre voies. Ayant posé l'écaille d'activité sur l'objet (\"poser\" est le terme consacré à l'accomplissement des rituels d'Écaille), le Haut-Rêvant y lance le sort de son choix et l'objet devient capable de le lancer à son tour. Pratiquement, le haut-rêvant effectue toutes les opérations nécessaires au lancer d'un sort, y compris son paramétrage précis, puis le lance normalement en dépensant les points de rêve du coût. Toutefois, au lieu de cibler comme l'exige le ciblage normal du sort, il touche l'objet possédant l'écaille d'activité. En résultat, aucun effet ne se produit, mais le sort est maintenant enregistré dans la \"mémoire\" de la gemme. Il suffit ensuite à l'utilisateur de se concentrer mentalement sur l'effet voulu (dont il doit avoir une idée) pour que l'objet lance le sort. Il pourra le lancer indéfiniment.

\n

A la fin du round de concentration, l'utilisateur doit être capable de dépenser les points de rêve exigés par le coût du sort tel qu'il est paramétéré. S'il n'en a pas assez, il ne dépense rien, mais l'objet ne fonctionne pas. Puis cela étant fait, le sort opère au tout début du round suivant, selon le ciblage voulu par l'utilisateur, fonction de la forme de l'objet et de la façon dont il est utilisé. Pour que le sort puisse être ciblé ailleurs que sur l'utilisateur lui-même, l'objet doit avoir une forme oblongue, analogue au doigt pointé d'un haut-rêvant. Le sort enregistré dans la gemme est paramétré une fois pour toutes. Un objet lançant un sort de Sommeil de 5 rounds lancera toujours un sort de Sommeil de 5 rounds, ni plus ni moins. Un objet lançant une illusion visuelle ne lancera toujours que la même illusion au moindre détail près. La portée est celle de l'EMPATHIE du créateur de l'objet et non de l'utilisateur, et quand le sort a une durée HN, c'est également l'heure de naissance du créateur. Le seul paramétrage inutile est l'heure de naissance de la cible en prévision du jet de résistance. Quand un JR est possible, il est toujours r-8, quelle que soit la cible. S'il réussit, le sort se dissipe aussitôt sans revenir vers l'utilisateur.

\n

L'objet réussit son lancer, sans jet de dés. Lancer un sort via un objet magique n'est pas plus économique en points de rêve que de la lancer soi-même, mais évite la montée en TMR, les rencontres, et confère la certitude que le sort partira à coup sûr. L'effet d'un sort lancé par un objet peut être annulé par Annulatrion de Magie, mais pas par Annulation de ses Propres Zones ni Annulation de ses Propres Illusions.

\n

Chaque gemme d'un objet ne peut recevoir qu'une seule écaille d'activité, et la pose de cette dernière coûte un point de seuil. Une écaille d'activité ne peut enregistrer et lancer q'un seul sort. Mais un même objet peut avoir plusieurs gemmes, grâce à Individualité, chacune possédant une écaille d'activité pour lancer un sort différent.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-9","portée":"","caseTMR":"desolation","caseTMRspeciale":"","ptreve":"7","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} +{"_id":"xOicgRMCUxJNmVzF","name":"Détection d'aura","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"sort","data":{"description":"

Les rituels de Détection d’Aura peuvent indifféremment être accomplis par n’importe laquelle des quatre voies.

\n

Toutes les créatures vivantes animées (humains, humanoïdes, animaux) ont une caractéristique RÊVE. Les objets enchantés possèdent des points de rêve, de même que les produits de magie naturelle, comme certaines pierres de chance. Les entités de cauchemar, incarnées ou non, en ont également. Quelle qu’elle soit, la présence de rêve émet une aura, laquelle est détectable par Détection d’Aura. Parallèlement, toute cible d’un sort ou d’un rituel, émet une aura propre, quand bien même ladite cible ne possède pas de points de rêve (centre de zone, objet ou plante soumis à une illusion d’Hypnos). Cette aura est également détectable par Détection d’Aura.

\n

L’aura de présence de rêve se traduit par un halo bleuté constant ; l’aura résultant d’un effet magique par un halo parcouru de pulsations. Quand les deux auras sont présentes conjointement, le halo est pulsatif et d’un bleu plus foncé. On peut toujours effectuer Détection d’Aura sans aucun risque, il y a toujours une réponse. Soit une aura est perçue, constante ou pulsative, et l’on peut tenter une Lecture d’Aura pour en savoir plus ; soit aucune aura n’est perçue et il s’agit de matière inerte, sans rêve, non soumise à un sort.

","draconic":"oniros","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-3","portée":"","caseTMR":"sanctuaire","caseTMRspeciale":"","ptreve":"1","xp":0,"bonuscase":"","isrituel":false,"coutseuil":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.png","effects":[]} +{"_id":"zT72qy3Xb8ye9YKb","name":"Bouilloire de Mélimnod *","permission":{"default":0,"6ibmdmaeRSMTjU4c":3},"type":"sort","data":{"description":"

La Grande Écaille Bouilloire de Mélimnod, du nom d'un célèbre haut-rêvant du Second Âge, est un exemple abordable d'objet autonome. Elle doit être posée sur une bouilloire ou un petit chaudron intégralement fait d'argent, de cuivre ou d'étain, à l'exclusion de tout autre métal, d'une capacité de 2 mesures (40 centilitres). La gemme peut être incrustée dans le fond du récipient ou participer à son alliage. A la fin de l'enchantement, avant l'accomplissement de Permanence, elle doit posséder au minimum 1 point de rêve actif. (Le maximum étant comme toujours 7 fois son enchantabilité.) Puis, à la place de Maîtrise, il est obligatoire d'accomplir le rituel d'Autonomie (qui coûte 2 points de seuil). La Grande Écaille peut alors être posée. Il n'en est besoin que d'une seule.

\n

Dès que la bouilloire se retrouve pleine d'eau (2 mesures), ou d'un liquide appartenant à l'élément Eau, elle se met à chauffer spontanément et porte le liquide à ébullition ern l'espace d'un seul round. Au bout d'un second round, le liquide est réduit de moitié (une mesure). Puis la bouilloire le fait refroidir, et il se retrouve tout juste tiède au bout d'un troisième round. Il peut alors demeurer indéfiniment dans la bouilloire ou être transvasé, mais dès que la bouilloire se retrouve intégralement pleine, le processus recommence. Chaque chauffe lui coûte un de ses points de rêve actifs. Le rituel d'Autonomie les lui fait récupérer à raison de 3 par heure de complète non-utilisation.

\n

Il est bien entendu possible de mettre des herbes de soin dans la bouilloire avant d'y verser l'eau, de façon à obtenir une décoction en un temps record. Etant autonome, la Bouilloire de Mélimnod n'a pas être maîtrisée. La pose de la Grande Écaille coûte 1 point de seuil.

","draconic":"narcos","duree":"Instantanée","JR":"Aucun","cible":"","difficulte":"-9","portée":"","caseTMR":"special","caseTMRspeciale":"Monts Brûlants E5","ptreve":"9","portee":"","isrituel":true,"coutseuil":1,"xp":0,"bonuscase":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_narcos.png","effects":[]} From aa1c93ce22afc6cc838a5cb9839b8c7029b9a526 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 6 Feb 2021 02:29:58 +0100 Subject: [PATCH 09/26] =?UTF-8?q?Preparation=20ma=C3=AEtrise=20fleuve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 3 +- module/rdd-roll.js | 53 +++++++++++++++++-------------- module/rdd-tmr-dialog.js | 3 ++ module/rolldata-ajustements.js | 4 +-- templates/chat-resultat-sort.html | 8 +++-- templates/dialog-roll-sort.html | 2 +- 6 files changed, 43 insertions(+), 30 deletions(-) diff --git a/module/actor.js b/module/actor.js index af1cc5ba..e466049d 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1731,8 +1731,7 @@ export class RdDActor extends Actor { sortList: sortList, competence: this.getBestDraconic(), selectedSort: sortList[0], - coord: coord, - coordLabel: TMRUtility.getTMR(coord).label, + tmr: TMRUtility.getTMR(coord), diffLibre: sortList[0].data.difficulte, // Per default at startup coutreve: Array(20).fill().map((item, index) => 1 + index) } diff --git a/module/rdd-roll.js b/module/rdd-roll.js index 4c81ad17..bbde3323 100644 --- a/module/rdd-roll.js +++ b/module/rdd-roll.js @@ -46,15 +46,16 @@ export class RdDRoll extends Dialog { surencMalusFlag: actor.isPersonnage() ? (actor.data.data.compteurs.surenc.value < 0) : false, surencMalusValue: actor.getSurenc(), useMalusSurenc: false, - use: { libre:true, conditions: true, surenc: false, encTotal: false, }, + use: { libre: true, conditions: true, surenc: false, encTotal: false, }, isMalusEncombrementTotal: RdDItemCompetence.isMalusEncombrementTotal(rollData.competence), useMalusEncTotal: false, encTotal: actor.getEncTotal(), ajustementAstrologique: actor.ajustementAstrologique(), surprise: actor.getSurprise(false), + canClose: true } mergeObject(rollData, defaultRollData, { recursive: true, overwrite: false }); - if ( rollData.forceCarac) { + if (rollData.forceCarac) { rollData.carac = rollData.forceCarac; } RollDataAjustements.calcul(rollData, actor); @@ -82,7 +83,12 @@ export class RdDRoll extends Dialog { close: close }; for (let action of actions) { - conf.buttons[action.name] = { label: action.label, callback: html => this.onAction(action, html) }; + conf.buttons[action.name] = { + label: action.label, callback: html => { + this.rollData.canClose = true; + this.onAction(action, html) + } + }; } super(conf, options); @@ -91,6 +97,14 @@ export class RdDRoll extends Dialog { this.rollData = rollData; } + close() { + if (this.rollData.canClose) { + return super.close(); + } + ui.notifications.info("Vous devez faire ce jet de dés!"); + } + + /* -------------------------------------------- */ async onAction(action, html) { await RdDResolutionTable.rollData(this.rollData); @@ -111,7 +125,7 @@ export class RdDRoll extends Dialog { this.bringToTop(); var dialog = this; - + function onLoad() { let rollData = dialog.rollData; // Update html, according to data @@ -121,7 +135,7 @@ export class RdDRoll extends Dialog { $("#carac").val(rollData.competence.data.defaut_carac); } if (rollData.selectedSort) { - $("#draconic").val( rollData.selectedSort.data.listIndex ); // Uniquement a la selection du sort, pour permettre de changer + $("#draconic").val(rollData.selectedSort.data.listIndex); // Uniquement a la selection du sort, pour permettre de changer } RdDItemSort.setCoutReveReel(rollData.selectedSort); $("#diffLibre").val(Misc.toInt(rollData.diffLibre)); @@ -154,9 +168,9 @@ export class RdDRoll extends Dialog { html.find('#sort').change((event) => { let sortKey = Misc.toInt(event.currentTarget.value); this.rollData.selectedSort = this.rollData.sortList[sortKey]; // Update the selectedCarac - this.rollData.bonus = RdDItemSort.getCaseBonus(this.rollData.selectedSort, this.rollData.coord); + this.rollData.bonus = RdDItemSort.getCaseBonus(this.rollData.selectedSort, this.rollData.tmr.coord); RdDItemSort.setCoutReveReel(this.rollData.selectedSort); - $("#draconic").val( this.rollData.selectedSort.data.listIndex ); // Uniquement a la selection du sort, pour permettre de changer + $("#draconic").val(this.rollData.selectedSort.data.listIndex); // Uniquement a la selection du sort, pour permettre de changer this.updateRollResult(); }); html.find('#ptreve-variable').change((event) => { @@ -208,29 +222,22 @@ export class RdDRoll extends Dialog { dmgText = '(' + dmgText + ')'; } if (rollData.selectedSort) { - rollData.bonus = RdDItemSort.getCaseBonus(rollData.selectedSort, rollData.coord); - } - - RollDataAjustements.calcul(rollData, this.actor); - rollData.finalLevel = this._computeFinalLevel(rollData); - - HtmlUtility._showControlWhen($(".diffMoral"), rollData.ajustements.moralTotal.used); - HtmlUtility._showControlWhen($("#etat-general"), !RdDCarac.isIgnoreEtatGeneral(rollData.selectedCarac, rollData.competence)); - HtmlUtility._showControlWhen($("#ajust-astrologique"), RdDResolutionTable.isAjustementAstrologique(rollData)); - - // Sort management - if (rollData.selectedSort) { - rollData.bonus = RdDItemSort.getCaseBonus(rollData.selectedSort, rollData.coord); - //console.log("Toggle show/hide", rollData.selectedSort); + rollData.bonus = RdDItemSort.getCaseBonus(rollData.selectedSort, rollData.tmr.coord); HtmlUtility._showControlWhen($("#div-sort-difficulte"), RdDItemSort.isDifficulteVariable(rollData.selectedSort)) HtmlUtility._showControlWhen($("#div-sort-ptreve"), RdDItemSort.isCoutVariable(rollData.selectedSort)) } + RollDataAjustements.calcul(rollData, this.actor); + rollData.finalLevel = this._computeFinalLevel(rollData); + + HtmlUtility._showControlWhen($(".diffMoral"), rollData.ajustements.moralTotal.used); + HtmlUtility._showControlWhen($("#etat-general"), !RdDCarac.isIgnoreEtatGeneral(rollData.selectedCarac, rollData.competence)); + HtmlUtility._showControlWhen($("#ajust-astrologique"), RdDResolutionTable.isAjustementAstrologique(rollData)); + // Mise à jour valeurs $("#compdialogTitle").text(this._getTitle(rollData)); $('#coupsNonMortels').prop('checked', rollData.coupsNonMortels); $("#dmg-arme-actor").text(dmgText); -// $("#defenseur-surprise").text(RdDBonus.description(rollData.ajustements.attaqueDefenseurSurpris.descr)); $('.table-ajustement').remove(); $(".table-resolution").remove(); $(".table-proba-reussite").remove(); @@ -241,7 +248,7 @@ export class RdDRoll extends Dialog { /* -------------------------------------------- */ - async buildAjustements(rollData){ + async buildAjustements(rollData) { const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-roll-ajustements.html`, rollData); return html; } diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index ac36b550..1018ee18 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -292,6 +292,9 @@ export class RdDTMRDialog extends Dialog { let dialog = new RdDTMRRencontreDialog("", this, this.currentRencontre, postRencontre); dialog.render(true); } + else { + postRencontre(); + } } /* -------------------------------------------- */ diff --git a/module/rolldata-ajustements.js b/module/rolldata-ajustements.js index 67dd2c78..ecc58c77 100644 --- a/module/rolldata-ajustements.js +++ b/module/rolldata-ajustements.js @@ -116,8 +116,8 @@ export const referenceAjustements = { getDescr: (rollData, actor) => rollData.selectedSort && rollData.coord ? `Bonus de case: ${RdDItemSort.getCaseBonus(rollData.selectedSort, rollData.coord)}%` : '' }, rencontreTMR: { - isVisible: (rollData, actor) => rollData.tmr && rollData.rencontre.name, - isUsed: (rollData, actor) => rollData.tmr && rollData.rencontre.name, + isVisible: (rollData, actor) => rollData.tmr && rollData.rencontre?.name, + isUsed: (rollData, actor) => rollData.tmr && rollData.rencontre?.name, getLabel: (rollData, actor) => rollData.rencontre?.name, getValue: (rollData, actor) => - (rollData.rencontre?.force ?? 0) } diff --git a/templates/chat-resultat-sort.html b/templates/chat-resultat-sort.html index c9ed4073..b17920a9 100644 --- a/templates/chat-resultat-sort.html +++ b/templates/chat-resultat-sort.html @@ -4,7 +4,7 @@ le {{#if selectedSort.data.isrituel}}rituel{{else}}sort{{/if}} {{selectedSort.name}}

-
Pour {{selectedSort.data.ptreve_reel}} point{{~#if (gt selectedSort.data.ptreve_reel 1)}}s{{/if}} de rêve en {{coordLabel}} ({{coord}}). +
Pour {{selectedSort.data.ptreve_reel}} point{{~#if (gt selectedSort.data.ptreve_reel 1)}}s{{/if}} de rêve en {{tmr.label}} ({{tmr.coord}}). {{#if show.reveInsuffisant}} Pas assez de rêve! {{/if}} @@ -22,4 +22,8 @@ {{else}}{{depenseReve}} points de rêve ont été dépensés {{~/if}}. -
\ No newline at end of file +
+
+ + {{{selectedSort.data.description}}} + diff --git a/templates/dialog-roll-sort.html b/templates/dialog-roll-sort.html index 3879df15..c32366ef 100644 --- a/templates/dialog-roll-sort.html +++ b/templates/dialog-roll-sort.html @@ -1,7 +1,7 @@
- +
From 6397ba240688ad02d8ada886f9930faa91b3921c Mon Sep 17 00:00:00 2001 From: sladecraven Date: Sat, 6 Feb 2021 22:34:27 +0100 Subject: [PATCH 10/26] Renommage dexterit --- system.json | 4 ++-- template.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system.json b/system.json index 9cf8a6e1..f3659a30 100644 --- a/system.json +++ b/system.json @@ -2,11 +2,11 @@ "name": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", "description": "Rêve de Dragon RPG for FoundryVTT", - "version": "1.3.15", + "version": "1.3.16", "manifestPlusVersion": "1.0.0", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.9", - "templateVersion": 91, + "templateVersion": 92, "author": "LeRatierBretonnien", "authors": [ { diff --git a/template.json b/template.json index 8c42ea59..63e222ae 100644 --- a/template.json +++ b/template.json @@ -261,7 +261,7 @@ "dexterite": { "type": "number", "value": 10, - "label": "Dexterité", + "label": "Dextérité", "xp": 0, "derivee": false }, From 5cd60ca76a90277039df9ccfc8b70d6af8072202 Mon Sep 17 00:00:00 2001 From: sladecraven Date: Sat, 6 Feb 2021 22:49:51 +0100 Subject: [PATCH 11/26] Ajout init premier round dans le compendium --- packs/equipement.db | 52 ++++++++++++++-------------- templates/enum-initpremierround.html | 2 +- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packs/equipement.db b/packs/equipement.db index 59a2070e..8fe186ed 100644 --- a/packs/equipement.db +++ b/packs/equipement.db @@ -1,13 +1,13 @@ {"_id":"0Vgscex1VV4ybSUQ","name":"Bonnet de laine","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.05,"equipe":false,"resistance":0,"qualite":0,"cout":0.06},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bonnet_laine.webp","effects":[]} {"_id":"0ylGrNMzulUaKFP9","name":"Boralm","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"ingredient","data":{"description":"

Poudre brune apparaissant sur les parois des grottes.

\n

VUE/Alchimie à -1.

","niveau":0,"encombrement":0.001,"base":0,"quantite":1,"milieu":"Cavernes","rarete":"","categorie":"Alchimie","cout":0.03},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/boralm.webp","effects":[]} {"_id":"1Dc4KzZageae7lhI","name":"Balles de jongleur","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":4,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.32},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/balle_jongleur.webp","effects":[]} -{"_id":"1O7IJiQSDYxJ5VsD","name":"Bouclier moyen","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":2,"equipe":false,"dommages":"0","force":"11","resistance":15,"competence":"Bouclier","cout":6,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"boucliers","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_moyen.webp","effects":[]} +{"_id":"1O7IJiQSDYxJ5VsD","name":"Bouclier moyen","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":2,"equipe":false,"dommages":"0","force":"11","resistance":15,"competence":"Bouclier","cout":6,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"boucliers","penetration":0,"magique":false,"resistance_magique":null,"ecaille_efficacite":null,"initpremierround":"hast"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_moyen.webp","effects":[]} {"_id":"2y61gBIFbATQaKDl","name":"1 m2 de laine","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/tissu_laine.webp","effects":[]} {"_id":"3DJePXhrDWQxbUeM","name":"Dé à jouer en os","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.01,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/des_en_os.webp","effects":[]} -{"_id":"3Wk5dzp3M7Das6wh","name":"Épée dragonne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

C’est une épée longue, plus robuste que l’esparlongue, pouvant également frapper de taille.

","quantite":1,"encombrement":2,"equipe":false,"dommages":"3","force":"11","resistance":12,"competence":"Epée à 1 main","cout":20,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"categorie_parade":"epees-longues","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_dragonne.webp","effects":[]} {"_id":"3cn9nWtY0Vb1PLTx","name":"Dague de jet","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

Chaque point de force au dessus de 10 augmente les portées de 1m.

\n

Chaque point de force en dessous de 9 diminue les portées de 1m.

","quantite":1,"encombrement":0.5,"equipe":false,"dommages":"1","force":"0","resistance":0,"competence":"Dague de jet","cout":3,"portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/dagues.webp","effects":[]} {"_id":"3mHSocNVPyWkmGBR","name":"Nartha","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"ingredient","data":{"description":"

Poudre noire obtenue par disruption alchimique du minerai appelé narthalide, sorte de marne.

\n

VUE/Alchimie à -3

","niveau":0,"encombrement":0.001,"base":0,"quantite":1,"milieu":"","rarete":"","categorie":"Alchimie","cout":0.4},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/nartha.webp","effects":[]} {"_id":"3t0NhMC0cFQyCZGH","name":"Soufflet","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.4},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/soufflet.webp","effects":[]} +{"name":"Maillet","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"","description":"","quantite":1,"encombrement":0.1,"equipe":false,"dommages":"1","penetration":0,"force":"7","resistance":7,"competence":"Masse à 1 main","cout":0.05,"portee_courte":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"masse"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/maillet.webp","effects":[],"_id":"3uWCDH1NOjHJpVo1"} {"_id":"4GeV81qoJrjHIgzR","name":"Tournegraisse","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"potion","data":{"description":"

Crème sirupeuse blanchâtre.

","quantite":1,"encombrement":0.1,"rarete":"","categorie":"Alchimie","cout":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/tournegraisse.webp","effects":[]} {"_id":"4LFXefT0HFpaXQLx","name":"Briquet à silex","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.08,"equipe":false,"resistance":0,"qualite":0,"cout":0.4},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/briquet.webp","effects":[]} {"_id":"4qPaCKONcrsK6JbQ","name":"Pichet de grès (1 litre)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":0.5,"encombrement":0.3,"equipe":false,"qualite":0,"contenu":[],"cout":0.3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/pichet.webp","effects":[]} @@ -17,21 +17,20 @@ {"_id":"69vN8bRlnCrRHQCm","name":"Obbadion","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"ingredient","data":{"description":"

Poudre bleuâtre obtenue par disruption alchimique du minerai appelé obbadine,  sorte de tourbe.

\n

VUE/Alchimie à -2

","niveau":0,"encombrement":0.001,"base":0,"quantite":1,"milieu":"Lieux humides","rarete":"","categorie":"Alchimie","cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/l_obbadion.webp","effects":[]} {"_id":"6MVWA3DYbpw8122A","name":"Entonnoir de fer","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.15},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/entonnoir.webp","effects":[]} {"_id":"6fW8gPkxgeBCKA59","name":"Premier Chant Dérisoire","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"livre","data":{"description":"

Les Chants Dérisoires de Yester l’Ancien ont été peu retranscrits, probablement à cause de leur ineptie fondamentale. En dénicher un exemplaire n’est donc déjà pas chose aisée. Le premier chant, cependant, peut être source de révélation pour les haut-rêvants. La découverte de ce sens caché demande un minimum de +4 en voie d’Hypnos et permet la synthèse du sort de Dérision. Sans son assimilation préalable, la synthèse de ce sort est totalement inenvisageable. Sa difficulté de lecture est de -5, son assimilation requiert 16 points de tâche, périodicité 1 heure.

","auteur":"Yester l’Ancien","quantite":1,"difficulte":-5,"points_de_tache":16,"encombrement":0,"xp":"","cout":0,"competence":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.png","effects":[]} -{"_id":"6s5QjArwz9w9JIGL","name":"Double dragonne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

Apparue vers la fin du Second Âge, c’était une grande épée à deux mains. Encombrante et prohibant le bouclier, c’était avant tout une épée de duel et de frime.

","quantite":1,"encombrement":4,"equipe":false,"dommages":"5","force":"13","resistance":13,"competence":"Epée à 2 mains","cout":50,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":false,"categorie_parade":"epees-lourdes","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/double_dragonne.webp","effects":[]} -{"_id":"7B9sKLf4ipRyyEjF","name":"Bouclier lourd","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":3,"equipe":false,"dommages":"0","force":"13","resistance":20,"competence":"Bouclier","cout":8,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"boucliers","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_grand.webp","effects":[]} +{"_id":"6s5QjArwz9w9JIGL","name":"Double dragonne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

Apparue vers la fin du Second Âge, c’était une grande épée à deux mains. Encombrante et prohibant le bouclier, c’était avant tout une épée de duel et de frime.

","quantite":1,"encombrement":4,"equipe":false,"dommages":"5","force":"13","resistance":13,"competence":"Epée à 2 mains","cout":50,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":false,"categorie_parade":"epees-lourdes","penetration":0,"magique":false,"resistance_magique":null,"ecaille_efficacite":null,"initpremierround":"hast"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/double_dragonne.webp","effects":[]} +{"_id":"7B9sKLf4ipRyyEjF","name":"Bouclier lourd","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":3,"equipe":false,"dommages":"0","force":"13","resistance":20,"competence":"Bouclier","cout":8,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"boucliers","penetration":0,"magique":false,"resistance_magique":null,"ecaille_efficacite":null,"initpremierround":"hast"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_grand.webp","effects":[]} {"_id":"7YuWWsFIuZgakGUS","name":"Mortier en marbre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.3,"equipe":false,"resistance":0,"qualite":0,"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/mortier.webp","effects":[]} {"_id":"7c7CO626TCo4lg8b","name":"Petite scie cadre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"resistance":0,"qualite":0,"cout":6},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/scie.webp","effects":[]} {"_id":"7u9yAlaFhKcVdEC6","name":"Matériel de chirurgie","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"

(pincettes, lancette, crin, aiguille)

","quantite":1,"encombrement":0.06,"equipe":false,"resistance":0,"qualite":0,"cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/materiel_chirurgie.webp","effects":[]} -{"_id":"7xFe41JZIVNMLv1U","name":"Masse lourde","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":3,"equipe":false,"dommages":"3/4","force":"12/11","resistance":10,"competence":"Masse à 1 main","cout":4,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":true,"categorie_parade":"masses","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/masse_lourde.webp","effects":[]} {"_id":"8bwP6zncdFP0O9ew","name":"Corde (10 m)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"resistance":0,"qualite":0,"cout":0.3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/corde.webp","effects":[]} +{"name":"Massette","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"","description":"","quantite":1,"encombrement":1,"equipe":false,"dommages":"2","penetration":0,"force":"9","resistance":8,"competence":"Masse à 1 main","cout":2,"portee_courte":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"masse"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/massette.webp","effects":[],"_id":"92GDNmNVa2u0gzpx"} {"_id":"9cLkTDugz84gpHUB","name":"Bitume de Camphre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"potion","data":{"description":"

Crème sirupeuse grisâtre.

","quantite":1,"encombrement":0.1,"rarete":"","categorie":"Alchimie","cout":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bitume_de_camphre.webp","effects":[]} -{"_id":"9jbjDpbddL2Ep09s","name":"Hache de bataille","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":2,"equipe":false,"dommages":"3/4","force":"12/11","resistance":8,"competence":"Hache à 1 main","cout":15,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":true,"categorie_parade":"haches","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/hache_bataille.webp","effects":[]} {"_id":"A3jx5dPkk5IeXSXn","name":"Lait de lune","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"potion","data":{"description":"

Fluide.

\n

Lait de laie.

","quantite":1,"encombrement":0.1,"rarete":"","categorie":"Alchimie","cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/lait_de_lune.webp","effects":[]} {"_id":"A9nMgTyEwYzdA0zT","name":"Manteau de velours","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"resistance":0,"qualite":0,"cout":10},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/manteau_velours.webp","effects":[]} {"_id":"AOQsKTjIbcy8NV9t","name":"Pierre à aiguiser","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/pierre_a_aiguiser.webp","effects":[]} {"_id":"As5kYvyOrWrr8KJm","name":"Etui à luth de cuir","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":1,"encombrement":0.2,"equipe":false,"qualite":0,"contenu":[],"cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/etui_luth.webp","effects":[]} {"_id":"B2BhuxveVKMnD8fe","name":"Bottes de cuir souple","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.4,"equipe":false,"resistance":0,"qualite":0,"cout":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bottes_de_cuir.webp","effects":[]} -{"_id":"CGYOJbaKtYvF2qa9","name":"Dague","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":0.5,"equipe":false,"dommages":"1","force":"7","resistance":8,"competence":"Dague","cout":3,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"categorie_parade":"dagues","penetration":0},"flags":{"core":{"sheetClass":""}},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/dague.webp","effects":[]} +{"name":"Couteau de cuisine","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"dagues","description":"","quantite":1,"encombrement":0.2,"equipe":false,"dommages":"1","penetration":0,"force":"0","resistance":6,"competence":"Dague","cout":1,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"dague"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/couteau-cuisine.webp","effects":[],"_id":"BQPhNy9AUCpEGgFg"} {"_id":"CMtQM06J3BZsHHxH","name":"Sandales","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/sandales.webp","effects":[]} {"_id":"CQSxJv1mgmIeMCbM","name":"Grappin","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.5,"equipe":false,"resistance":0,"qualite":0,"cout":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/grappin.webp","effects":[]} {"_id":"D5Z3FaUv91B8eCOP","name":"Obyssum vert","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"ingredient","data":{"description":"

Poudre verdâtre apparaissant sur les tiges de certains roseaux.

\n

VUE/Alchimie à -2

","niveau":0,"encombrement":0.001,"base":0,"quantite":1,"milieu":"Lieux humides","rarete":"","categorie":"Alchimie","cout":0.05},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/l_obyssum_vert.webp","effects":[]} @@ -47,39 +46,38 @@ {"_id":"GGiwmc4sjGW3GS6K","name":"Provisions non-cuites (1 sust)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"

légumes secs, viande salée

","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.01},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/provision_crue.webp","effects":[]} {"_id":"GiquTnEsiVZn7m6Y","name":"Bas de soie","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0,"equipe":false,"resistance":0,"qualite":0,"cout":3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bas_soie.webp","effects":[]} {"_id":"Gp9ZrwXkqZbJoVVT","name":"1 m² de toile de voile","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/voile.webp","effects":[]} -{"_id":"HRLrRhAF4Hkfbqjh","name":"Fléau lourd","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":3,"equipe":false,"dommages":"4","force":"13","resistance":10,"competence":"Fléau","cout":15,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":true,"categorie_parade":"","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/fleau_lourd.webp","effects":[]} +{"_id":"HdciYu5J2SrJO8e3","name":"Épée gnome","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"epees-courtes","description":"

C’est une épée courte, essentiellement fabriquée et portée par les Gnomes au Second Âge.

","quantite":1,"encombrement":1,"equipe":false,"dommages":"2","penetration":0,"force":"8","resistance":12,"competence":"Epée à 1 main","cout":12,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeegnome"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_gnome.webp","effects":[]} +{"name":"Rasoir","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"dagues","description":"","quantite":1,"encombrement":0.1,"equipe":false,"dommages":"1","penetration":0,"force":"0","resistance":0,"competence":"Dague","cout":2,"portee_courte":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"dague"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/rasoir.webp","effects":[],"_id":"HjbB4f1CDz96Hv88"} {"_id":"HsIJSPQ46cec22Y2","name":"Couverture de laine","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.6,"equipe":false,"resistance":0,"qualite":0,"cout":0.3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/couverture_laine.webp","effects":[]} {"_id":"Ig9qIzaZ5SveXLF7","name":"Pelle","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"resistance":0,"qualite":0,"cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/pelle.webp","effects":[]} -{"_id":"IlA16EWR1x5ZBckA","name":"Épée demi-dragonne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":null,"quantite":1,"encombrement":1.5,"equipe":false,"dommages":"2","force":"10","resistance":10,"competence":"Epée à 1 main","cout":15,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"categorie_parade":"epees-longues","penetration":0},"flags":{"core":{"sourceId":"Item.ErwaSLcGryAbYjkm"}},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/demi_dragonne.webp","effects":[]} {"_id":"InTxnjInfBYHsqcR","name":"Poêle à frire (40 cm)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":0.5,"encombrement":0.3,"equipe":false,"qualite":0,"contenu":[],"cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/poele.webp","effects":[]} -{"_id":"J4PpWO4OZ6JPaAUB","name":"Fléau léger","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":2,"equipe":false,"dommages":"3","force":"12","resistance":10,"competence":"Fléau","cout":12,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":true,"categorie_parade":"","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/fleau_leger.webp","effects":[]} {"_id":"JXMef7FXVOG1XYWO","name":"Elixir des gnomes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"potion","data":{"description":"

Fluide.

\n

Liqueur violette.

","quantite":1,"encombrement":0.1,"rarete":"","categorie":"Alchimie","cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/elixir_des_gnomes.webp","effects":[]} {"_id":"JfxFBlokIegRWTDo","name":"Torche 1/2 heure (60 min)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.3,"equipe":false,"resistance":0,"qualite":0,"cout":0.02},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/torche.webp","effects":[]} {"_id":"JhQZDbsmFZBLRcln","name":"Sac en jute (20 litres)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":10,"encombrement":0.05,"equipe":false,"qualite":0,"contenu":[],"cout":0.04},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/sac_jute_20.webp","effects":[]} -{"_id":"K1ssvF9alBaIwrSu","name":"Maillet","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"dommages":"1","force":"7","resistance":7,"competence":"Masse à 1 main","cout":0.05,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"masses","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/maillet.webp","effects":[]} {"_id":"K4n2JuDnoHDUPCZG","name":"Bouilloire de fer (2 litres)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":1,"encombrement":0.5,"equipe":false,"qualite":0,"contenu":[],"cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouilloire.webp","effects":[]} {"_id":"KQZIK8ltQ3sQiDGe","name":"Mailles de Fer","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"armure","data":{"description":"

Grand haubert de mailles avec capuche À enfiler sur une cotte de cuir souple ou de drap matelassé) + bottes de cuir / métal.

\n

 

","quantite":1,"encombrement":6,"equipe":false,"protection":5,"deterioration":null,"malus":-4,"cout":50},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/mailles.webp","effects":[]} {"_id":"KlydiUbayqBgJB6J","name":"Tablette de cire","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/tablette_cire.webp","effects":[]} -{"_id":"KmfftnkUsPQD6fV0","name":"Épée bâtarde","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

Comme son nom l’indique, c’est une bâtarde de l'épée longue et de l'épée sorde, à la fois longue et large, pouvant s’utiliser à une ou deux mains.

","quantite":1,"encombrement":3,"equipe":false,"dommages":"4/5","force":"13/12","resistance":14,"competence":"Epée à 1 main","cout":30,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":true,"categorie_parade":"epees-lourdes","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_batarde.webp","effects":[]} {"_id":"KvzSNxISkWDoilO8","name":"Gemme Inconnue","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":null,"equipe":false,"resistance":0,"qualite":0,"cout":0},"flags":{"core":{"sourceId":"Item.V3V3wUXNCG6gzJFB"}},"img":"systems/foundryvtt-reve-de-dragon/icons/gemmes/seliphane.webp","effects":[]} {"_id":"LZPEdSIv3KywCwdk","name":"Liquide","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"munition","data":{"description":"

1 mesure (20cl) d'un liquide.

\n

(à modifier/compléter)

","quantite":1,"encombrement":0.1,"equipe":false,"qualite":0,"cout":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_neutre.webp","effects":[]} {"_id":"LaAP5tsP1Sc43hKO","name":"Lanterne à huile","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":0.3,"encombrement":1,"equipe":false,"qualite":0,"contenu":[],"cout":5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/lanterne_huile.webp","effects":[]} {"_id":"LkE8EjPfao9m6Rn7","name":"Huile de Sélikanthe","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"potion","data":{"description":"

Fluide.

\n

Liquide légèrement huileux.

","quantite":1,"encombrement":0.1,"rarete":"","categorie":"Alchimie","cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/huile_de_selikanthe.webp","effects":[]} {"_id":"Lz4dA2NwxdSZ3FZK","name":"Lime, Râpe","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/lime.webp","effects":[]} {"_id":"M1RgJDuQUvxjqJVV","name":"Chandelle de suif (1 heure)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.02},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/chandelle.webp","effects":[]} +{"name":"Masse lourde","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"","description":"","quantite":1,"encombrement":3,"equipe":false,"dommages":"3/4","penetration":0,"force":"12/11","resistance":10,"competence":"Masse à 1 main","cout":4,"portee_courte":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"masse"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/masse_lourde.webp","effects":[],"_id":"MGvyXFQJpv6nNynl"} +{"name":"Épée bâtarde","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"epees-lourdes","description":"

Comme son nom l’indique, c’est une bâtarde de l'épée longue et de l'épée sorde, à la fois longue et large, pouvant s’utiliser à une ou deux mains.

","quantite":1,"encombrement":3,"equipe":false,"dommages":"4/5","penetration":0,"force":"13/12","resistance":14,"competence":"Epée à 1 main","cout":30,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"epeebatarde"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_batarde.webp","effects":[],"_id":"MQxgfYTEQEUhG116"} {"_id":"Mbh2M8JS1Rf0vxEX","name":"Harpe","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"resistance":0,"qualite":0,"cout":5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/harpe.webp","effects":[]} +{"name":"Dague","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"dagues","description":"","quantite":1,"encombrement":0.5,"equipe":false,"dommages":"1","penetration":0,"force":"7","resistance":8,"competence":"Dague","cout":3,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"flags":{"core":{"sheetClass":""}},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/dague.webp","effects":[],"_id":"NCp2kdTKmQGyAh1U"} {"_id":"NNLhxjFsoJVdFuit","name":"Bouteille de verre (1 litre)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":0.5,"encombrement":0.2,"equipe":false,"qualite":0,"contenu":[],"cout":0.7},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouteille_verre.webp","effects":[]} {"_id":"OXFFRZOqlhZDJas3","name":"Béret de velours","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.05,"equipe":false,"resistance":0,"qualite":0,"cout":3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/beret_velours.webp","effects":[]} {"_id":"OYWzXiQUFsjU5AF2","name":"Perles de Bjwal","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"potion","data":{"description":"

Petits granulés translucides.

","quantite":1,"encombrement":0.1,"rarete":"","categorie":"Alchimie","cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/perles_bjwal.webp","effects":[]} {"_id":"P0yc6QfgKVmM0fpu","name":"Ecuelle de grès","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/ecuelle_gres.webp","effects":[]} {"_id":"PH2J4zR0hwXSg0vc","name":"Charbon de bois 1 kg","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.04,"equipe":false,"resistance":0,"qualite":0,"cout":0.06},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/charbon.webp","effects":[]} +{"name":"Lance courte","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"lances","description":"","quantite":1,"encombrement":2,"equipe":false,"dommages":"2","penetration":0,"force":"8","resistance":5,"competence":"Lance","cout":3,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"lance"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/lance.webp","effects":[],"_id":"PSc92VlQCdNnbPlg"} {"_id":"PaJoTirnA6h4F3pH","name":"Hameçon","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.01,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/hame%C3%A7on.webp","effects":[]} -{"_id":"PdrW7Zejz8H04zf8","name":"Couteau de cuisine","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"dommages":"1","force":"0","resistance":6,"competence":"Dague","cout":1,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"dagues","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/couteau-cuisine.webp","effects":[]} {"_id":"PkDJ36j7mS3Kfetp","name":"Bouteille de grès (1 litre)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":0.5,"encombrement":0.3,"equipe":false,"qualite":0,"contenu":[],"cout":0.4},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouteille_gres.webp","effects":[]} -{"_id":"PoTI2z0Wr4hxiLpQ","name":"Gourdin","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"dommages":"1","force":"7","resistance":8,"competence":"Masse à 1 main","cout":0,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"categorie_parade":"masses","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/gourdin.webp","effects":[]} {"_id":"PrnJrG50u1UPdlJN","name":"Liqueur de Bagdol","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"potion","data":{"description":"

Fluide. Liquide noir et odorant.

","quantite":1,"encombrement":0.1,"rarete":"","categorie":"Alchimie","cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/liqueur_de_bagdol.webp","effects":[]} {"_id":"PuuPn6WGfU8uBAyb","name":"Robe de soie","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0,"equipe":false,"resistance":0,"qualite":0,"cout":10},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_soie.webp","effects":[]} -{"_id":"Q5jpA4N2vEdh2Qga","name":"Marteau","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":0.3,"equipe":false,"dommages":"2","force":"7","resistance":8,"competence":"Masse à 1 main","cout":1,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"masses","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/marteau.webp","effects":[]} +{"name":"Bâton","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"","description":"","quantite":1,"encombrement":2,"equipe":false,"dommages":"1","penetration":0,"force":"9","resistance":8,"competence":"Masse à 2 mains","cout":0.5,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":false,"initpremierround":"baton"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/baton.webp","effects":[],"_id":"Qh4Tp7lZ6wLnX4w0"} {"_id":"RC1co7jmHMDqlJGy","name":"Deniers (pièces d'étain)","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.005,"equipe":false,"resistance":0,"qualite":0,"cout":0.01},"flags":{},"img":"icons/commodities/currency/coins-assorted-mix-platinum.webp","effects":[]} {"_id":"RGdDQ3yJYMkSuA5G","name":"Provisions cuites (1 sust)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"

pain, fromage, viande séchée...

","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.02},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/provision_cuite.webp","effects":[]} {"_id":"RKr1ZhTvC6poiNa1","name":"Gros Clou","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.05},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/gros_clou.webp","effects":[]} @@ -96,18 +94,20 @@ {"_id":"SrV0r5hnGdKeSIHR","name":"Cuillère de bois","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.03,"equipe":false,"resistance":0,"qualite":0,"cout":0.03},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/cuillere_bois.webp","effects":[]} {"_id":"SsnGNjTekvB50uWa","name":"Chapeau de cuir souple","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.08,"equipe":false,"resistance":0,"qualite":0,"cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/chapeau_cuir.webp","effects":[]} {"_id":"T9UiLcJonuHmGNwq","name":"Sols (pièces d'argent)","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.005,"equipe":false,"resistance":0,"qualite":0,"cout":1},"flags":{},"img":"icons/commodities/currency/coins-assorted-mix-silver.webp","effects":[]} +{"name":"Hache de bataille","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"haches","description":"","quantite":1,"encombrement":2,"equipe":false,"dommages":"3/4","penetration":0,"force":"12/11","resistance":8,"competence":"Hache à 1 main","cout":15,"portee_courte":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"hachebataille"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/hache_bataille.webp","effects":[],"_id":"TKsUXJq9w7ezcFGQ"} {"_id":"TY6Ft8a6WfxD6pD9","name":"Bobineau de fil","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.01,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bobineau.webp","effects":[]} -{"_id":"U6qli6TPbzj8tUdH","name":"Arme d’hast","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":4,"equipe":false,"dommages":"4","force":"12","resistance":8,"competence":"Dague","cout":10,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":false,"categorie_parade":"hast","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/hast.webp","effects":[]} {"_id":"UDmq6CY3NsttcHe4","name":"Peigne en corne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.04,"equipe":false,"resistance":0,"qualite":0,"cout":0.4},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/peigne.webp","effects":[]} +{"name":"Arme d’hast","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"hast","description":"","quantite":1,"encombrement":4,"equipe":false,"dommages":"4","penetration":0,"force":"12","resistance":8,"competence":"Armes d'hast","cout":10,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":false,"initpremierround":"hast"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/hast.webp","effects":[],"_id":"UE79xKWXTwYAn70K"} {"_id":"UICiMF3wBeLsqm8L","name":"Pipe en bois","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.04,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/pipe.webp","effects":[]} {"_id":"UMfXFhVhdoVQVEKy","name":"Fronde","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

Peut tirer tous les rounds.

","quantite":1,"encombrement":0.08,"equipe":false,"dommages":"1","force":"0","resistance":0,"competence":"Fronde","cout":0.6,"portee_courte":8,"portee_moyenne":15,"portee_extreme":25,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/fronde.webp","effects":[]} {"_id":"UYXXggulNwnodaOt","name":"Chope de fer (20 cl)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":0.1,"encombrement":0.08,"equipe":false,"qualite":0,"contenu":[],"cout":0.15},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/chope_fer.webp","effects":[]} {"_id":"UczsYTAoP9koA2SL","name":"Bourse, sachet de tissu","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":0.3,"encombrement":0.01,"equipe":false,"qualite":0,"contenu":[],"cout":0.05},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bourse_sachet.webp","effects":[]} +{"name":"Esparlongue","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"epees-longues","description":"

C’est une épée semblable à la rapière, longue et ne frappant uniquement d’estoc. Elle doit son nom à ce qu’elle était particulièrement en vogue, au Second Âge, dans la cité d’Esparlongue. En ce début du Troisième Âge, toutefois, on lui substitue le plus souvent la demi-dragonne, épée très voisine, ne frappant pareillement que d’estoc, mais plus résistante (résistance 10) et moins coûteuse (15 sols) ; son bonus aux dommages (+2) est identique.

","quantite":1,"encombrement":1.5,"equipe":false,"dommages":"2","penetration":0,"force":"10","resistance":9,"competence":"Epée à 1 main","cout":20,"portee_courte":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"esparlongue"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/esparlongue.webp","effects":[],"_id":"UsyV9n0byCeYirNC"} {"_id":"Uxk2tvEqtrmYScjK","name":"Pot à braise","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/pot_a_braise.webp","effects":[]} {"_id":"VsjRwh9Z9PMpFKdI","name":"Craie 1 bâton","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.01,"equipe":false,"resistance":0,"qualite":0,"cout":0.01},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/craie.webp","effects":[]} {"_id":"WC1jMDKcxEJQWGOR","name":"Burette de fer blanc (40 cl)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":0.2,"encombrement":0.2,"equipe":false,"qualite":0,"contenu":[],"cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/burette.webp","effects":[]} {"_id":"WTHZdtgf6lHUSKDx","name":"Fouet","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

Provoque des dégâts \"non mortels\".

\n

Les armures sont majorées de 2.

\n

Si la protection atteint une valeur de 5 ou plus, le fouet ne peut causer de dégât.

","quantite":1,"encombrement":0.5,"equipe":false,"dommages":"1","force":"0","resistance":0,"competence":"Fouet","cout":1,"portee_courte":2,"portee_moyenne":null,"portee_extreme":null,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/fouet.webp","effects":[]} -{"_id":"WurdjqJ8zMiXNdiW","name":"Épée gnome","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

C’est une épée courte, essentiellement fabriquée et portée par les Gnomes au Second Âge.

","quantite":1,"encombrement":1,"equipe":false,"dommages":"2","force":"8","resistance":12,"competence":"Epée à 1 main","cout":12,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"categorie_parade":"epees-courtes","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_gnome.webp","effects":[]} +{"name":"Hachette","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"haches","description":"","quantite":1,"encombrement":1,"equipe":false,"dommages":"2","penetration":0,"force":"8","resistance":6,"competence":"Hache à 1 main","cout":4,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"dague"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/hachette.webp","effects":[],"_id":"WTWXZeoK5HpCrGFy"} {"_id":"XTZVrcMNofAviP63","name":"Cire d'abeille 500g","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.15},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/cire.webp","effects":[]} {"_id":"XlKp5BvZX8A03fUg","name":"Sac à dos de cuir","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":25,"encombrement":0.4,"equipe":false,"qualite":0,"contenu":[],"cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/sac_a_dos.webp","effects":[]} {"_id":"XoslLyWIJYY2RGzz","name":"Fiole de verre (20 cl)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":0.1,"encombrement":0.06,"equipe":false,"qualite":0,"contenu":[],"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/fiole_verre.webp","effects":[]} @@ -115,6 +115,7 @@ {"_id":"YHPrUuGGGTGZMNAg","name":"Bière","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"munition","data":{"description":"

1 mesure (20cl) de bière.

","quantite":1,"encombrement":0.1,"equipe":false,"qualite":0,"cout":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_biere.webp","effects":[]} {"_id":"YNHDt4EerstJvx5l","name":"Le Principe Drachromatique","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"livre","data":{"description":"

Cet ouvrage de profonde érudition sur l’origine des couleurs et leur signification onirique est foncièrement incompréhensible, à moins de posséder un minimum de +4 en voie d’Oniros. Il permet d’envisager la synthèse des sorts d’Invulnérabilité Chromatique et de Transmutation Chromatique. Sans son assimilation préalable, la synthèse de ces sorts est totalement inenvisageable. Sa difficulté de lecture est de -4, son assimilation requiert 26 points de tâche, périodicité 1 heure.

","auteur":"Anonyme","quantite":1,"difficulte":-4,"points_de_tache":26,"encombrement":0,"xp":"","cout":0,"competence":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_oniros.png","effects":[]} {"_id":"YNbbSGLnexiXNyXU","name":"Manteau de laine","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.8,"equipe":false,"resistance":0,"qualite":0,"cout":0.6},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/manteau_laine.webp","effects":[]} +{"name":"Gourdin","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"","description":"","quantite":1,"encombrement":1,"equipe":false,"dommages":"1","penetration":0,"force":"7","resistance":8,"competence":"Masse à 1 main","cout":0,"portee_courte":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"gourdin"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/gourdin.webp","effects":[],"_id":"Yh7VGX3BikmIjVQH"} {"_id":"Yyn39VDRnO6oA3Uq","name":"Echecs draconics en bois","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.5,"equipe":false,"resistance":0,"qualite":0,"cout":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/echecs.webp","effects":[]} {"_id":"Z0ij7qpoYeWMVocP","name":"Ceinturon de cuir","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":6,"encombrement":0.1,"equipe":false,"qualite":0,"contenu":[],"cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/ceinturon.webp","effects":[]} {"_id":"ZLda3pfrbiKucSea","name":"Cornebouffe","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"objet","data":{"description":null,"quantite":1,"encombrement":null,"equipe":false,"resistance":0,"qualite":0,"cout":2},"flags":{"core":{"sourceId":"Item.yXOePj4twuchMblc"}},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/cornebouffe.webp","effects":[]} @@ -124,25 +125,26 @@ {"_id":"beQ9d4QQwZDQl5NA","name":"Flûte à bec","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.09,"equipe":false,"resistance":0,"qualite":0,"cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/flute_bec.webp","effects":[]} {"_id":"bgkEBYUEFLvAaeVf","name":"Luth, viole","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"resistance":0,"qualite":0,"cout":7},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/luth.webp","effects":[]} {"_id":"bxDITKRhXiyvLhMz","name":"Candique","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"ingredient","data":{"description":"

Poudre blanche apparaissant sous l’écorce de nombreux arbres,

\n

VUE/Alchimie à 0.

","niveau":0,"encombrement":0.001,"base":0,"quantite":1,"milieu":"Forêts","rarete":"","categorie":"Alchimie","cout":0.02},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/candique.webp","effects":[]} -{"_id":"cFnFQrQIPgyZRWdo","name":"Épée sorde","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

C’est une épée plus courte que la dragonne, mais plus large. Elle peut s’utiliser à une ou deux mains. Sa grande solidité en fait l’épée de prédilection des gardes et des soldats.

\n

C’est probablement à elle que le Guerrier Sorde doit son nom (à moins que ce ne soit l’inverse).

","quantite":1,"encombrement":2,"equipe":false,"dommages":"3/4","force":"12/11","resistance":15,"competence":"Epée à 1 main","cout":20,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":true,"penetration":null,"categorie_parade":"epees-lourdes"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_sord.webp","effects":[]} {"_id":"cVZbnh5cYxBx6P5b","name":"Burin, gouge, ciseau","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/gouge.webp","effects":[]} {"_id":"ckKnviu9SHvWgya0","name":"Bougie de cire (2 heures)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.05},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bougie.webp","effects":[]} {"_id":"cobfvOmFpti5lJuK","name":"Chemise de lin","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0,"equipe":false,"resistance":0,"qualite":0,"cout":0.3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/chemise_lin.webp","effects":[]} {"_id":"dBR6KXvfmjjIcwsc","name":"Pilon en marbre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/pilon.webp","effects":[]} -{"_id":"eK28jEeQiJdd93L3","name":"Bouclier léger","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"dommages":"0","force":"8","resistance":13,"competence":"Bouclier","cout":4,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"boucliers","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_petit.webp","effects":[]} +{"name":"Épée dragonne","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"epees-longues","description":"

C’est une épée longue, plus robuste que l’esparlongue, pouvant également frapper de taille.

","quantite":1,"encombrement":2,"equipe":false,"dommages":"3","penetration":0,"force":"11","resistance":12,"competence":"Epée à 1 main","cout":20,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeedragonne"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_dragonne.webp","effects":[],"_id":"dLiMJO6aUkh0EuIZ"} +{"_id":"eK28jEeQiJdd93L3","name":"Bouclier léger","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"dommages":"0","force":"8","resistance":13,"competence":"Bouclier","cout":4,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"boucliers","penetration":0,"magique":false,"resistance_magique":null,"ecaille_efficacite":null,"initpremierround":"hast"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_petit.webp","effects":[]} {"_id":"fAzYb7kkW6QxG6i6","name":"Graisse à Bottes 500g","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/graisse_a_cuir.webp","effects":[]} {"_id":"fDwsTMuug0Z5BdaA","name":"Cuir / Metal","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"armure","data":{"description":"

Cuir épais clouté, ou petites plaquettes, écailles ou anneaux de fer cousus sur le cuir. Pectoral ou cotte de cuir/métal + jupon ou cuissards de cuir / métal sur culottes de cuir souple + bottes de cuir / métal + casque de métal.

\n

 

","quantite":1,"encombrement":4,"equipe":false,"protection":"4","deterioration":0,"malus":-2,"cout":20},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_metal.webp","effects":[]} {"_id":"fLKFTvLWoj7juxQE","name":"Flèche, carreau","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/fleche.webp","effects":[]} {"_id":"gYFprGGUUVG1Apcf","name":"Carquois","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":2,"encombrement":0.1,"equipe":false,"qualite":0,"contenu":[],"cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/carquois.webp","effects":[]} {"_id":"gfU7oZL1JYqF3lAW","name":"Robe de lin","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.6},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_lin.webp","effects":[]} {"_id":"gmBC6SO3F5d64Vpl","name":"Miroir en cuivre poli 20 cm","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/miroir.webp","effects":[]} +{"name":"Fléau léger","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"","description":"","quantite":1,"encombrement":2,"equipe":false,"dommages":"3","penetration":0,"force":"12","resistance":10,"competence":"Fléau","cout":12,"portee_courte":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":true,"initpremierround":"fleau"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/fleau_leger.webp","effects":[],"_id":"godMVR796aSUVjLu"} {"_id":"hEPimS3H8jihDuUS","name":"Crayon à mine de plomb","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.02,"equipe":false,"resistance":0,"qualite":0,"cout":0.3},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/crayon_plomb.webp","effects":[]} {"_id":"hVgd4APvAW8sbXf0","name":"Grande hache","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":3,"equipe":false,"dommages":"4","force":"13","resistance":8,"competence":"Hache à 2 mains","cout":15,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":false,"categorie_parade":"haches","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/grande_hache.webp","effects":[]} {"_id":"hjsIxUmanyz5otLJ","name":"Marmite de fer (3 litres)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":1.5,"encombrement":0.6,"equipe":false,"qualite":0,"contenu":[],"cout":0.6},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/marmite.webp","effects":[]} +{"name":"Fléau lourd","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"","description":"","quantite":1,"encombrement":3,"equipe":false,"dommages":"4","penetration":0,"force":"13","resistance":10,"competence":"Fléau","cout":15,"portee_courte":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":true,"initpremierround":"fleau"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/fleau_lourd.webp","effects":[],"_id":"htaHjhHwVhlBnZjv"} {"_id":"huvZ4dMPpn9gk9km","name":"Sel","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.01,"equipe":false,"resistance":0,"qualite":0,"cout":null},"flags":{"core":{"sourceId":"Item.fLEyryhRi8Nw37SP"}},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/sel.webp","effects":[]} {"_id":"iCvphbPdxUcfqetd","name":"Aumônière","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"conteneur","data":{"description":"

Comme une bourse, mais sous forme d'une coque en cuir rigide.

","capacite":0.25,"encombrement":0,"equipe":false,"qualite":0,"cout":0.2,"contenu":[]},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/aumoniere.webp","effects":[]} {"_id":"iGHudg5kBOfYWgwV","name":"Arc","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

Nie jusqu'à 2 points d'armure.

\n

Rechargement 1/2 round (s'il tire en début de round, il pourra recharger durant le reste du round pour tirer de nouveau au début du round suivant).

","quantite":1,"encombrement":1,"equipe":false,"dommages":"2","force":"0","resistance":0,"competence":"Arc","cout":10,"portee_courte":10,"portee_moyenne":20,"portee_extreme":50,"penetration":2,"rapide":false,"deuxmains":false,"unemain":false},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/arc.webp","effects":[]} -{"_id":"ijCebH1Pr3LmzdOj","name":"Épée cyane","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

Long cimeterre à l’acier bleuté, exclusivement fabriqué par les Cyans ou Hommes bleus.

","quantite":1,"encombrement":2,"equipe":false,"dommages":"3","force":"11","resistance":12,"competence":"Epée à 1 main","cout":25,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"categorie_parade":"epees-lourdes","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_cyane.webp","effects":[]} {"_id":"iq8ZZgphxOUgC1bi","name":"Flûte traversière de roseau","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.08,"equipe":false,"resistance":0,"qualite":0,"cout":0.12},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/flute_traversiere.webp","effects":[]} {"_id":"iss7ARW8oRoe1umi","name":"Eau","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"munition","data":{"description":"

1 mesure (20cl) d'eau.

","quantite":1,"encombrement":0.1,"equipe":false,"qualite":0,"cout":0},"flags":{"core":{"sourceId":"Item.LsTGq00Wf30rzDsF"}},"img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_eau.webp","effects":[]} {"_id":"iuSOVPBsK8Zg6hoY","name":"1 m² de bâche","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.5,"equipe":false,"resistance":0,"qualite":0,"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bache.webp","effects":[]} @@ -167,11 +169,11 @@ {"_id":"ncpONCxPPNZ9YbBr","name":"Chramaelium","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"ingredient","data":{"description":"

Poudre rouge obtenue par disruption alchimique de la chramaele, minerai ayant l’apparence de la glaise.

\n

VUE/Alchimie à -4

","niveau":0,"encombrement":0.001,"base":0,"quantite":1,"milieu":"","rarete":"","categorie":"Alchimie","cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/chramaelium.webp","effects":[]} {"_id":"nl9cICrauIOEXwFP","name":"Cordelette (10 m)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/cordelette.webp","effects":[]} {"_id":"nqMyaOqBfTxdP9tg","name":"Cor en corne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.6},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/cor_corne.webp","effects":[]} +{"name":"Épée sorde","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"epees-lourdes","description":"

C’est une épée plus courte que la dragonne, mais plus large. Elle peut s’utiliser à une ou deux mains. Sa grande solidité en fait l’épée de prédilection des gardes et des soldats.

\n

C’est probablement à elle que le Guerrier Sorde doit son nom (à moins que ce ne soit l’inverse).

","quantite":1,"encombrement":2,"equipe":false,"dommages":"3/4","penetration":null,"force":"12/11","resistance":15,"competence":"Epée à 1 main","cout":20,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"epeesorde"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_sord.webp","effects":[],"_id":"oXpPZ9LS1nsU0nGT"} {"_id":"of2LbmmB4EtlSwte","name":"Sac en jute (50 litres)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":25,"encombrement":0.1,"equipe":false,"qualite":0,"contenu":[],"cout":0.08},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/sac_jute_50.webp","effects":[]} {"_id":"orpj8CumQ39xMOHy","name":"Brosse à cheveux","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.06,"equipe":false,"resistance":0,"qualite":0,"cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/Brosse.webp","effects":[]} {"_id":"oyAyc3tp1JrIFfos","name":"L'Oniricon","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"livre","data":{"description":"

Cet abécédaire draconic permet de gagner jusqu’à 80 points d’expérience en voie d’Oniros, jusqu’à concurrence du niveau +1. C’est un livre pour débutants, inutile aux haut-rêvants confirmés. Sa difficulté de lecture est de -2, son assimilation requiert 20 points de tâche, périodicité une heure. Le gain final est de 4d10+40 points d’expérience en voie d’Oniros.

","auteur":"anonyme","quantite":1,"difficulte":-2,"points_de_tache":0,"encombrement":0,"xp":"4d10+40","cout":0,"competence":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/icone_parchement_vierge.svg","effects":[]} {"_id":"phfgVizT4ekUwqFq","name":"Selle et harnais","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":25,"encombrement":4,"equipe":false,"qualite":0,"contenu":[],"cout":5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/selle.webp","effects":[]} -{"_id":"q3gHw08c5fYONo2h","name":"Rasoir","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"dommages":"1","force":"0","resistance":0,"competence":"Dague","cout":2,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"dagues","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/rasoir.webp","effects":[]} {"_id":"qCLTOjlIOvlj0uo7","name":"Chaperon de laine","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/chaperon_laine.webp","effects":[]} {"_id":"qWhl9EfdnJx4KFTZ","name":"Bas de laine","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/bas_laine.webp","effects":[]} {"_id":"sSgPT3aKDOZ25svO","name":"Porte plume en bois","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.02,"equipe":false,"resistance":0,"qualite":0,"cout":0.05},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/porte_plume2.webp","effects":[]} @@ -181,8 +183,8 @@ {"name":"Sang","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"munition","data":{"description":"

1 mesure (20cl) de sang.

","quantite":1,"encombrement":0.1,"equipe":false,"qualite":0,"cout":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_sang.webp","effects":[],"_id":"slusKo2nVCtFwDkN"} {"_id":"snupUovwaPAe46aD","name":"Fiole en grès (20 cl)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":0.1,"encombrement":0.1,"equipe":false,"qualite":0,"contenu":[],"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/fiole_gres.webp","effects":[]} {"_id":"szOThadvQvFcS79R","name":"Cuir Epais","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"armure","data":{"description":"

Cuir très épais comme le cuir de botte. Pectoral de cuir épais + jupon de bandes ou de tresses de cuir ou cuissards de cuir épais sur culottes de cuir souple + bottes dures + casque de cuir.

\n

 

","quantite":1,"encombrement":2,"equipe":false,"protection":3,"deterioration":0,"malus":-1,"cout":10},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_epais.webp","effects":[]} -{"_id":"t3LZDSaQ6AiloImA","name":"Esparlongue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"

C’est une épée semblable à la rapière, longue et ne frappant uniquement d’estoc. Elle doit son nom à ce qu’elle était particulièrement en vogue, au Second Âge, dans la cité d’Esparlongue. En ce début du Troisième Âge, toutefois, on lui substitue le plus souvent la demi-dragonne, épée très voisine, ne frappant pareillement que d’estoc, mais plus résistante (résistance 10) et moins coûteuse (15 sols) ; son bonus aux dommages (+2) est identique.

","quantite":1,"encombrement":1.5,"equipe":false,"dommages":"2","force":"10","resistance":9,"competence":"Epée à 1 main","cout":20,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"categorie_parade":"epees-longues","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/esparlongue.webp","effects":[]} {"_id":"tBFt4h3jqINsOxLI","name":"Outre (2 litres)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":1,"encombrement":0.08,"equipe":false,"qualite":0,"contenu":[],"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/outre.webp","effects":[]} +{"name":"Marteau","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"","description":"","quantite":1,"encombrement":0.3,"equipe":false,"dommages":"2","penetration":0,"force":"7","resistance":8,"competence":"Masse à 1 main","cout":1,"portee_courte":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"masse"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/marteau.webp","effects":[],"_id":"tMWzePiuMtiCQnAU"} {"_id":"tY3shj5FA8nwMgxX","name":"Vin","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"munition","data":{"description":"

1 mesure (20cl) de vin.

","quantite":1,"encombrement":0.1,"equipe":false,"qualite":0,"cout":0},"flags":{"core":{"sourceId":"Item.QNNWTG5yqQKmcpJ7"}},"img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_vin.webp","effects":[]} {"_id":"tZWQCuRr1ic3S0pL","name":"Souliers","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.8},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/souliers.webp","effects":[]} {"_id":"tswamwK2oKNARhjA","name":"Verre grossissant","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.02,"equipe":false,"resistance":0,"qualite":0,"cout":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/verre_grossissant.webp","effects":[]} @@ -190,18 +192,16 @@ {"_id":"ueJnUMLK1vpL8xOB","name":"Stylet de bronze","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.02,"equipe":false,"resistance":0,"qualite":0,"cout":0.12},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/stylet_de_bronze.webp","effects":[]} {"_id":"uwwunMSrJoUYTDkG","name":"Seau de bois ferré (10 litres)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":5,"encombrement":1,"equipe":false,"qualite":0,"contenu":[],"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/seau_ferre.webp","effects":[]} {"_id":"vQ494sD9FgFI08kZ","name":"Drap Matelassé","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"armure","data":{"description":"

Deux épaisseurs de drap surpiquées, avec rembourrage de laine.

\n

Pourpoint ou cotte de drap matelassé + culottes de drap matelassé + bottes de cuir souple. Le pourpoint est une sorte de veste ; la cotte est une sorte de tunique, lacée sur la poitrine, et descendant jusqu’aux genoux, façon Robin des Bois.

\n

 

","quantite":1,"encombrement":0,"equipe":false,"protection":1,"deterioration":0,"malus":0,"cout":4},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/drap_matelasse.webp","effects":[]} -{"_id":"viHilj5hAHZqWuli","name":"Lance courte","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":2,"equipe":false,"dommages":"2","force":"8","resistance":5,"competence":"Lance","cout":3,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"categorie_parade":"lances","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/lance.webp","effects":[]} -{"_id":"wK5sGduzSvY3XxMF","name":"Massette","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"dommages":"2","force":"9","resistance":8,"competence":"Masse à 1 main","cout":2,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"categorie_parade":"masses","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/massette.webp","effects":[]} +{"name":"Épée demi-dragonne","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"epees-longues","description":null,"quantite":1,"encombrement":1.5,"equipe":false,"dommages":"2","penetration":0,"force":"10","resistance":10,"competence":"Epée à 1 main","cout":15,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeedragonne"},"flags":{"core":{"sourceId":"Item.ErwaSLcGryAbYjkm"}},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/demi_dragonne.webp","effects":[],"_id":"vnlRGjt7X6yQRObA"} +{"name":"Épée cyane","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"arme","data":{"categorie_parade":"epees-lourdes","description":"

Long cimeterre à l’acier bleuté, exclusivement fabriqué par les Cyans ou Hommes bleus.

","quantite":1,"encombrement":2,"equipe":false,"dommages":"3","penetration":0,"force":"11","resistance":12,"competence":"Epée à 1 main","cout":25,"portee_courte":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"portee_moyenne":0,"portee_extreme":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeecyane"},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_cyane.webp","effects":[],"_id":"wPE64RRcuLlvuPrY"} {"_id":"wcW5KcideGi8EY67","name":"Gants de cuir","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.05,"equipe":false,"resistance":0,"qualite":0,"cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/gants_de_cuir.webp","effects":[]} {"_id":"wpWaqe96x3cvqTXy","name":"Robe de laine","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.2,"equipe":false,"resistance":0,"qualite":0,"cout":0.4},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_laine.webp","effects":[]} {"_id":"wwWRn95ByBD08eGQ","name":"Le Paradoxe de l’Immobilité Rapide","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"livre","data":{"description":"

Ce texte de pure logique ne peut être assimilé que si l’on possède un minimum de +4 en voie d’Hypnos. Il permet d’envisager la synthèse du sort de Concentration. (Sans son assimilation préalable, la synthèse de ce sort est totalement inenvisageable.) Sa difficulté de lecture est de -5, son assimilation requiert 12 points de tâche, périodicité 1 heure.

","auteur":"Wanister de Bravo","quantite":1,"difficulte":-5,"points_de_tache":12,"encombrement":0,"xp":"","cout":0,"competence":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.png","effects":[]} -{"_id":"wyiy7aLaP8jnzkFn","name":"Bâton","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":2,"equipe":false,"dommages":"1","force":"9","resistance":8,"competence":"Masse à 2 mains","cout":0.5,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":true,"unemain":false,"categorie_parade":"masses","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/baton.webp","effects":[]} {"_id":"x4g6bDu3eUllSSSJ","name":"Eponge de mer","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.04,"equipe":false,"resistance":0,"qualite":0,"cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/eponge.webp","effects":[]} {"_id":"xfdeDEyMK8YtBpzC","name":"Huile 20 cl (4 heures)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.04},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/huile.webp","effects":[]} {"_id":"xuk60njqtrSZusSX","name":"Chemise de laine","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.1,"equipe":false,"resistance":0,"qualite":0,"cout":0.2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/chemise_laine.webp","effects":[]} {"_id":"yILNvELKbsz2OOln","name":"Ecritoire","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"resistance":0,"qualite":0,"cout":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/ecritoire.webp","effects":[]} {"_id":"yO9Vx7tqF8qbZoYw","name":"Besace de cuir","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"conteneur","data":{"description":"","capacite":10,"encombrement":0.2,"equipe":false,"qualite":0,"contenu":[],"cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/besace.webp","effects":[]} -{"_id":"yd4XGzrOMEo4fmiZ","name":"Hachette","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"arme","data":{"description":"","quantite":1,"encombrement":1,"equipe":false,"dommages":"2","force":"8","resistance":6,"competence":"Hache à 1 main","cout":4,"portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"rapide":false,"deuxmains":false,"unemain":false,"categorie_parade":"haches","penetration":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/hachette.webp","effects":[]} {"_id":"z3xiBzZBZXlaRVzZ","name":"Le Grand Iris","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"livre","data":{"description":"

Cette judicieuse réflexion sur les sorts d’illusion visuelle d’Hypnos ne peut être assimilée que si l’on possède au minimum zéro en voie d’Hypnos. Il confère un bonus de synthèse de +2 et de 12 points de sorts aux trois yeux d’Hypnos : Invisibilité, Transfiguration, Métamorphose. Sa difficulté de lecture est de -3, son assimilation requiert 16 points de tâche, périodicité une heure.

","auteur":"Khrachtchoum le Problémeux","quantite":1,"difficulte":-3,"points_de_tache":16,"encombrement":0,"xp":"0","cout":0,"competence":""},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_hypnos.png","effects":[]} {"_id":"zQWlnUsd8bPySujd","name":"Aiguille à coudre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"objet","data":{"description":"","quantite":1,"encombrement":0.01,"equipe":false,"resistance":0,"qualite":0,"cout":0.1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/aiguille.webp","effects":[]} {"_id":"zYI8mDiysWtmsSyy","name":"Carquois","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"conteneur","data":{"description":"","capacite":2,"encombrement":0.1,"equipe":false,"qualite":0,"cout":0.5},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/carquois.webp","effects":[]} diff --git a/templates/enum-initpremierround.html b/templates/enum-initpremierround.html index 6408d711..a2a5f9a9 100644 --- a/templates/enum-initpremierround.html +++ b/templates/enum-initpremierround.html @@ -1,4 +1,4 @@ - + From 4b88efa9995639b2b772ce40574d837350ba104c Mon Sep 17 00:00:00 2001 From: sladecraven Date: Sat, 6 Feb 2021 23:51:04 +0100 Subject: [PATCH 12/26] #150 : Gestion du cas Thanatos --- module/actor.js | 1 + module/item-competence.js | 5 +++++ module/item-sheet.js | 6 ++++++ module/rdd-utility.js | 12 +++++++++++- templates/item-competence-sheet.html | 2 +- 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/module/actor.js b/module/actor.js index e466049d..4a076fd8 100644 --- a/module/actor.js +++ b/module/actor.js @@ -706,6 +706,7 @@ export class RdDActor extends Actor { } else { console.log("Competence not found", compName); } + RdDUtility.checkThanatosXP( compName ); } /* -------------------------------------------- */ diff --git a/module/item-competence.js b/module/item-competence.js index 8bd78974..deca47f1 100644 --- a/module/item-competence.js +++ b/module/item-competence.js @@ -59,10 +59,12 @@ export class RdDItemCompetence extends Item { static computeCompetenceXPCost(competence) { let xp = RdDItemCompetence.getDeltaXp(competence.data.base, competence.data.niveau ?? competence.data.base); xp += competence.data.xp ?? 0; + if ( competence.name.includes('Thanatos') ) xp *= 2; /// Thanatos compte double ! xp += competence.data.xp_sort ?? 0; return xp; } + /* -------------------------------------------- */ static computeEconomieCompetenceTroncXP(competences) { let economie = 0; for (let troncList of competenceTroncs) { @@ -87,17 +89,20 @@ export class RdDItemCompetence extends Item { return RdDItemCompetence.getCompetenceXp(niveau + 1); } + /* -------------------------------------------- */ static getCompetenceXp(niveau) { RdDItemCompetence._valideNiveau(niveau); return niveau < -10 ? 0 : competence_xp_par_niveau[niveau + 10]; } + /* -------------------------------------------- */ static getDeltaXp(from, to) { RdDItemCompetence._valideNiveau(from); RdDItemCompetence._valideNiveau(to); return competence_xp_cumul[to] - competence_xp_cumul[from]; } + /* -------------------------------------------- */ static _valideNiveau(niveau){ if (niveau < -11 || niveau > competence_niveau_max) { console.warn("Niveau en dehors des niveaux de compétences: [-11, " + competence_niveau_max + "]", niveau) diff --git a/module/item-sheet.js b/module/item-sheet.js index 54931c78..f70e3483 100644 --- a/module/item-sheet.js +++ b/module/item-sheet.js @@ -80,6 +80,12 @@ export class RdDItemSheet extends ItemSheet { // Select competence categorie html.find("#categorie").on("click", this._onClickSelectCategorie.bind(this) ); + html.find('#sheet-competence-xp').change((event) => { + if ( this.object.data.type == 'competence') { + RdDUtility.checkThanatosXP( this.object.data.name ); + } + } ); + html.find('#creer-tache-livre').click((event) => { let actorId = event.currentTarget.attributes['data-actor-id'].value; let actor = game.actors.get( actorId ); diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 9d892c9f..db036798 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -1021,5 +1021,15 @@ export class RdDUtility { ui.notifications.warn("Pas d'heure de naissance selectionnée") } } - + + /* -------------------------------------------- */ + static checkThanatosXP(compName) { + 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), + content: message + }); + } + } } diff --git a/templates/item-competence-sheet.html b/templates/item-competence-sheet.html index 7d297780..17fefbb0 100644 --- a/templates/item-competence-sheet.html +++ b/templates/item-competence-sheet.html @@ -28,7 +28,7 @@
- +
From 863fc65844d41e5580389c69300b2eaa8c290046 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 6 Feb 2021 21:53:25 +0100 Subject: [PATCH 13/26] =?UTF-8?q?Message=20pour=20ma=C3=AEtrise=20Fleuve?= =?UTF-8?q?=20de=20l'Oubli?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/grammar.js | 19 +- module/item-sort.js | 22 +- module/rdd-tmr-dialog.js | 177 ++++---- module/rdd-utility.js | 13 +- module/tmr-rencontres.js | 59 +-- module/tmr-utility.js | 614 ++++++++++++++------------ templates/chat-fleuve-tmr.html | 30 ++ templates/dialog-roll-tmr-humide.html | 28 ++ templates/item-meditation-sheet.html | 15 +- templates/item-sort-sheet.html | 1 + templates/sort-tmr.html | 4 +- 11 files changed, 551 insertions(+), 431 deletions(-) create mode 100644 templates/chat-fleuve-tmr.html create mode 100644 templates/dialog-roll-tmr-humide.html diff --git a/module/grammar.js b/module/grammar.js index a5bb7472..df4162a2 100644 --- a/module/grammar.js +++ b/module/grammar.js @@ -18,6 +18,23 @@ export class Grammar { } static toLowerCaseNoAccent(words) { - return words?.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "") ?? words; + return words?.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "") ?? words; + } + static articleDetermine(genre) { + switch (genre?.toLowerCase()) { + case 'f': case 'feminin': return 'la'; + case 'p': case 'pluriel': return 'les'; + default: + case 'm': case 'masculin': return 'le'; + } + } + static articleIndétermine(genre) { + switch (genre?.toLowerCase()) { + case 'f': case 'feminin': return 'une'; + case 'p': case 'pluriel': return 'des'; + case 'n': case 'neutre': return 'du' + default: + case 'm': case 'masculin': return 'un'; + } } } \ No newline at end of file diff --git a/module/item-sort.js b/module/item-sort.js index 1ebf950b..d529f879 100644 --- a/module/item-sort.js +++ b/module/item-sort.js @@ -68,13 +68,13 @@ export class RdDItemSort extends Item { let list = []; let caseCheck = {}; for(let i=0; i 0 && caseCheck[caseTMR] == undefined ) { - caseCheck[caseTMR] = bonus; - list.push( caseTMR+":"+bonus ); + if ( bonus > 0 && caseCheck[coord] == undefined ) { + caseCheck[coord] = bonus; + list.push( coord+":"+bonus ); } } } @@ -86,21 +86,21 @@ export class RdDItemSort extends Item { } /* -------------------------------------------- */ - static incrementBonusCase( actor, sort, coordTMR ) { + static incrementBonusCase( actor, sort, coord ) { let bonusCaseList = this.buildBonusCaseList(sort.data.bonuscase, false); //console.log("ITEMSORT", sort, bonusCaseList); let found = false; let StringList = []; for( let bc of bonusCaseList) { - if (bc.case == coordTMR) { // Case existante + if (bc.case == coord) { // Case existante found = true; bc.bonus = Number(bc.bonus) + 1; } StringList.push( bc.case+':'+bc.bonus ); } if ( !found) { //Nouvelle case, bonus de 1 - StringList.push(coordTMR+':1'); + StringList.push(coord+':1'); } // Sauvegarde/update @@ -110,10 +110,10 @@ export class RdDItemSort extends Item { } /* -------------------------------------------- */ - static getCaseBonus( sort, coordTMR) { + static getCaseBonus( sort, coord) { let bonusCaseList = this.buildBonusCaseList(sort.data.bonuscase, false); for( let bc of bonusCaseList) { - if (bc.case == coordTMR) { // Case existante + if (bc.case == coord) { // Case existante return Number(bc.bonus); } } diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 1018ee18..a3b1b18e 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -4,12 +4,14 @@ */ import { RollDataAjustements } from "./rolldata-ajustements.js"; import { RdDUtility } from "./rdd-utility.js"; -import { TMRUtility } from "./tmr-utility.js"; +import { poesieCaseHumide, TMRUtility } from "./tmr-utility.js"; import { tmrConstants } from "./tmr-utility.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js"; import { TMRRencontres } from "./tmr-rencontres.js"; import { ChatUtility } from "./chat-utility.js"; +import { RdDRoll } from "./rdd-roll.js"; + /* -------------------------------------------- */ export class RdDTMRDialog extends Dialog { @@ -70,16 +72,16 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ displaySpecificCase() { - for (let caseTMR of this.casesSpeciales) { - console.log("SPEC CASE ", caseTMR); - if (caseTMR.data.specific == 'trounoir') { - this._trackToken(this._tokenTrouNoir(caseTMR.data.coord)); - } else if (caseTMR.data.specific == 'attache') { - this._trackToken(this._tokenTerreAttache(caseTMR.data.coord)); - } else if (caseTMR.data.specific == 'debordement') { - this._trackToken(this._tokenDebordement(caseTMR.data.coord)); - } else if (caseTMR.data.specific == 'maitrisee') { - this._trackToken(this._tokenMaitrisee(caseTMR.data.coord)); + for (let caseSpeciale of this.casesSpeciales) { + console.log("SPEC CASE ", caseSpeciale); + if (caseSpeciale.data.specific == 'trounoir') { + this._trackToken(this._tokenTrouNoir(caseSpeciale.data.coord)); + } else if (caseSpeciale.data.specific == 'attache') { + this._trackToken(this._tokenTerreAttache(caseSpeciale.data.coord)); + } else if (caseSpeciale.data.specific == 'debordement') { + this._trackToken(this._tokenDebordement(caseSpeciale.data.coord)); + } else if (caseSpeciale.data.specific == 'maitrisee') { + this._trackToken(this._tokenMaitrisee(caseSpeciale.data.coord)); } } } @@ -208,6 +210,7 @@ export class RdDTMRDialog extends Dialog { competence: this.actor.getBestDraconic(), rencontre: this.currentRencontre, nbRounds: 1, + canClose: false, tmr: TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord) } @@ -299,19 +302,25 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async _jetDeRencontre(tmr) { - if (TMRUtility.isForceRencontre()) { - return await TMRUtility.rencontreTMRRoll(tmr.coord, tmr); - } let rencontre = this.rencontresExistantes.find(prev => prev.coord == tmr.coord); if (rencontre) { return rencontre; } - let myRoll = new Roll("1d7").evaluate(); - if (myRoll.total == 7) { - let isMauvaise = this.actor.isRencontreSpeciale(); - return await TMRUtility.rencontreTMRRoll(tmr.coord, tmr, isMauvaise); + let myRoll = new Roll("1d7").evaluate().total; + if (TMRUtility.isForceRencontre() || myRoll== 7) { + return await this.rencontreTMRRoll(tmr, this.actor.isRencontreSpeciale()); } - this._tellToUser(myRoll.total + ": Pas de rencontre en " + tmr.label + " (" + tmr.coord + ")"); + this._tellToUser(myRoll + ": Pas de rencontre en " + tmr.label + " (" + tmr.coord + ")"); + } + + + /* -------------------------------------------- */ + async rencontreTMRRoll(tmr, isMauvaise = false) { + let rencontre = TMRUtility.utiliseForceRencontre() ?? + isMauvaise ? await TMRRencontres.getMauvaiseRencontre() + : await TMRRencontres.getRencontreAleatoire(tmr.type); + rencontre.coord = tmr.coord; + return rencontre; } /* -------------------------------------------- */ @@ -352,79 +361,27 @@ export class RdDTMRDialog extends Dialog { } } - /* -------------------------------------------- */ - isCaseMaitrisee(coordTMR) { - return this.casesSpeciales.find(it => it.data.coord = coordTMR && it.data.specific == 'maitrisee'); - } - - /* -------------------------------------------- */ - manageCaseHumideResult() { - if (this.toclose) - this.close(); - } - /* -------------------------------------------- */ async manageCaseHumide(tmr) { if (this.viewOnly || this.currentRencontre) { return; } if (this.isCaseHumide(tmr)) { - // TODO: permettre de choisir la voie de draconic? - let draconic = this.actor.getBestDraconic(); + let rollData = { + actor: this.actor, + competence: duplicate(this.actor.getBestDraconic()), + tmr: tmr, + canClose: false, + diffLibre: -7, + forceCarac: { "reveactuel": { label: "Rêve Actuel", value: this.actor.getReveActuel() } } + } + rollData.competence.data.defaut_carac = "reveactuel"; - let carac = this.actor.getReveActuel(); - const etatGeneral = this.actor.getEtatGeneral(); - let difficulte = draconic.data.niveau - 7; - let rolled = await RdDResolutionTable.roll(carac, difficulte); - - // Gestion du souffle Double Résistance du Fleuve - if (this.actor.isDoubleResistanceFleuve()) { - let rolled2 = await RdDResolutionTable.roll(carac, difficulte); - if (rolled2.isEchec) - rolled = rolled; - } - console.log("manageCaseHumide >>", rolled); - - let explication = ""; - let msg2MJ = ""; - this.toclose = rolled.isEchec; - if (rolled.isEchec) { - explication += "Vous êtes entré sur une case humide, et vous avez raté votre maîtrise ! Vous quittez les Terres Médianes !" - msg2MJ += game.user.name + " est rentré sur une case humides : Echec !"; - } - else { - explication += "Vous êtes entré sur une case humide, et vous avez réussi votre maîtrise !" - msg2MJ += game.user.name + " est rentré sur une case humides : Réussite !"; - } - explication += "
Test : Rêve actuel / " + draconic.name + " / " + tmr.type + "" - + RdDResolutionTable.explain(rolled); - - if (rolled.isETotal) { - let souffle = await this.actor.ajouterSouffle({ chat: false }); - explication += "
Vous avez fait un Echec Total. Vous subissez un Souffle de Dragon : " + souffle.name; - msg2MJ += "
Et a reçu un Souffle de Dragon : " + souffle.name; - } - if (rolled.isPart) { - explication += "
Vous avez fait une Réussite Particulière"; - this.actor._appliquerAjoutExperience({ rolled: rolled, selectedCarac: { label: 'reve' }, competence: draconic.name }) - msg2MJ += "
Et a fait une réussite particulière"; - } - - // Notification au MJ - ChatMessage.create({ content: msg2MJ, whisper: ChatMessage.getWhisperRecipients("GM") }); - // Et au joueur (ca pourrait être un message de tchat d'ailleurs) - let humideDiag = new Dialog({ - title: "Case humide", - content: explication, - buttons: { - choice: { icon: '', label: "Fermer", callback: () => this.manageCaseHumideResult() } - } - } - ); - humideDiag.render(true); + await this._rollMaitriseCaseHumide(rollData); } } + /* -------------------------------------------- */ isCaseHumide(tmr) { if (this.isCaseMaitrisee(tmr.coord)) { ChatMessage.create({ @@ -439,6 +396,60 @@ export class RdDTMRDialog extends Dialog { return tmr.type == "lac" || tmr.type == "fleuve" || tmr.type == "marais"; } + /* -------------------------------------------- */ + isCaseMaitrisee(coordTMR) { + return this.casesSpeciales.find(it => it.data.coord = coordTMR && it.data.specific == 'maitrisee'); + } + + async _rollMaitriseCaseHumide(rollData) { + this.minimize(); // Hide + const dialog = await RdDRoll.create(this.actor, rollData, + { + html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-tmr-humide.html', + options:{ height: 350 }, + close: html => { this.maximize(); } // Re-display TMR + }, + { + name: 'maitrise', + label: 'Maîtriser le fleuve', + callbacks: [ + this.actor.createCallbackExperience(), + { action: r => this._maitriseCaseHumide(r) } + ] + } + ); + dialog.render(true); + } + + async _maitriseCaseHumide(rollData) { + if (rollData.rolled.isETotal) { + rollData.souffle = await this.actor.ajouterSouffle({ chat: false }); + } + this.toclose = rollData.rolled.isEchec; + if (rollData.rolled.isSuccess) { + if (!rollData.previous && this.actor.isDoubleResistanceFleuve()) { + ChatMessage.create({ + content: `Double résistance du fleuve: `, + whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name) + }); + rollData.previous = [rollData.rolled]; + await this._rollMaitriseCaseHumide(rollData); + return; + } + } + rollData.poesie = poesieCaseHumide[new Roll("1d" + poesieCaseHumide.length).evaluate().total - 1]; + const whisperTo = ChatUtility.getWhisperRecipientsAndGMs(game.user.name); + const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fleuve-tmr.html`, rollData); + ChatMessage.create({ + whisper: whisperTo, + content: content + }); + if (rollData.rolled.isEchec) { + this.close(); + } + + } + /* -------------------------------------------- */ isReserveExtensible(coordTMR) { for (let caseTMR of this.casesSpeciales) { @@ -625,7 +636,7 @@ export class RdDTMRDialog extends Dialog { if (deplacementType == 'normal') { // Pas de rencontres après un saut de type passeur/changeur/... await this.manageRencontre(tmr, () => this.postRencontre(tmr)); } - else{ + else { await this.postRencontre(tmr); } } diff --git a/module/rdd-utility.js b/module/rdd-utility.js index db036798..6fdc870e 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -8,6 +8,7 @@ import { RdDItemCompetenceCreature } from "./item-competencecreature.js"; import { RdDItemArme } from "./item-arme.js"; import { RdDItemCompetence } from "./item-competence.js"; import { Misc } from "./misc.js"; +import { Grammar } from "./grammar.js"; /* -------------------------------------------- */ const categorieCompetences = { @@ -96,7 +97,6 @@ function _buildAllSegmentsFatigue(max) { ligneFatigue[caseIncrementee + 6]++; ligneFatigue.fatigueMax = 2 * (i + 1); fatigue[i + 1] = ligneFatigue; - } return fatigue; } @@ -253,13 +253,10 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.html' ]; - Handlebars.registerHelper('upperFirst', function (str) { - return Misc.upperFirst(str ?? 'null') - }) - - Handlebars.registerHelper('upper', function (str) { - return str?.toUpperCase() ?? 'NULL' - }) + 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); } diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js index cab3a844..6d55b615 100644 --- a/module/tmr-rencontres.js +++ b/module/tmr-rencontres.js @@ -248,44 +248,44 @@ const typeRencontres = { /* -------------------------------------------- */ const mauvaisesRencontres = [ - { code: "mangeur1d6", name: "Mangeur de Rêve", type: "mangeur", genre: "m", force: "1d6", refoulement: 2, isMauvaise: true }, + { code: "mangeur", name: "Mangeur de Rêve", type: "mangeur", genre: "m", force: "1d6", refoulement: 2, isMauvaise: true }, { code: "mangeur2d6", name: "Mangeur de Rêve", type: "mangeur", genre: "m", force: "2d6", refoulement: 2, isMauvaise: true }, - { code: "reflet2d6+4", name: "Reflet d'ancien Rêve", type: "reflet", genre: "m", force: "2d6+4", refoulement: 2, isPersistant: true, isMauvaise: true }, - { code: "tbblanc2d6+4", name: "Tourbillon blanc", type: "tbblanc", genre: "m", force: "2d6+4", refoulement: 2, isPersistant: true, isMauvaise: true }, - { code: "tbnoir2d8+4", name: "Tourbillon noir", type: "tbnoir", genre: "m", force: "2d8+4", refoulement: 2, isPersistant: true, isMauvaise: true }, + { code: "reflet+4", name: "Reflet d'ancien Rêve", type: "reflet", genre: "m", force: "2d6+4", refoulement: 2, isPersistant: true, isMauvaise: true }, + { code: "tbblanc+4", name: "Tourbillon blanc", type: "tbblanc", genre: "m", force: "2d6+4", refoulement: 2, isPersistant: true, isMauvaise: true }, + { code: "tbnoir+4", name: "Tourbillon noir", type: "tbnoir", genre: "m", force: "2d8+4", refoulement: 2, isPersistant: true, isMauvaise: true }, { code: "passfou2d8", name: "Passeur fou", type: "passeurfou", genre: "m", force: "2d8", refoulement: 2, isMauvaise: true }, { code: "tbrouge2d8", name: "Tourbillon rouge", type: "tbrouge", genre: "m", force: "2d8", refoulement: 3, isPersistant: true, isMauvaise: true } ] /* -------------------------------------------- */ const rencontresStandard = [ - { code: "messager2d4", name: "Messager des Rêves", type: "messager", genre: "m", force: "2d4", ignorer: true }, - { code: "passeur2d4", name: "Passeur des Rêves", type: "passeur", genre: "m", force: "2d4", ignorer: true }, - { code: "fleur1d6", name: "Fleur des Rêves", type: "fleur", genre: "f", force: "1d6", ignorer: true }, - { code: "mangeur1d6", name: "Mangeur de Rêve", type: "mangeur", genre: "m", force: "1d6" }, - { code: "changeur2d6", name: "Changeur de Rêve", type: "changeur", genre: "m", force: "2d6" }, - { code: "briseur2d6", name: "Briseur de Rêve", type: "briseur", genre: "m", force: "2d6", quitterTMR: true }, - { code: "reflet1d6", name: "Reflet d'ancien Rêve", type: "reflet", genre: "m", force: "2d6", isPersistant: true }, - { code: "tbblanc2d6", name: "Tourbillon blanc", type: "tbblanc", genre: "m", force: "2d6", isPersistant: true }, - { code: "tbnoir2d8", name: "Tourbillon noir", type: "tbnoir", genre: "m", force: "2d8", isPersistant: true }, - { code: "rdd1ddr+7", name: "Rêve de Dragon", type: "rdd", genre: "m", force: "1ddr + 7", refoulement: 2, quitterTMR: true } + { code: "messager", name: "Messager des Rêves", type: "messager", genre: "m", force: "2d4", ignorer: true }, + { code: "passeur", name: "Passeur des Rêves", type: "passeur", genre: "m", force: "2d4", ignorer: true }, + { code: "fleur", name: "Fleur des Rêves", type: "fleur", genre: "f", force: "1d6", ignorer: true }, + { code: "mangeur", name: "Mangeur de Rêve", type: "mangeur", genre: "m", force: "1d6" }, + { code: "changeur", name: "Changeur de Rêve", type: "changeur", genre: "m", force: "2d6" }, + { code: "briseur", name: "Briseur de Rêve", type: "briseur", genre: "m", force: "2d6", quitterTMR: true }, + { code: "reflet", name: "Reflet d'ancien Rêve", type: "reflet", genre: "m", force: "2d6", isPersistant: true }, + { code: "tbblanc", name: "Tourbillon blanc", type: "tbblanc", genre: "m", force: "2d6", isPersistant: true }, + { code: "tbnoir", name: "Tourbillon noir", type: "tbnoir", genre: "m", force: "2d8", isPersistant: true }, + { code: "rdd", name: "Rêve de Dragon", type: "rdd", genre: "m", force: "1ddr + 7", refoulement: 2, quitterTMR: true } ]; const tableRencontres = { - cite: [{ code: 'messager2d4', range: [1, 25] }, { code: 'passeur2d4', range: [26, 50] }, { code: 'fleur1d6', range: [51, 65] }, { code: 'mangeur1d6', range: [66, 70] }, { code: 'changeur2d6', range: [71, 80] }, { code: 'briseur2d6', range: [81, 85] }, { code: 'reflet2d6', range: [86, 90] }, { code: 'tbblanc2d6', range: [91, 94] }, { code: 'tbnoir2d8', range: [95, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - sanctuaire: [{ code: 'messager2d4', range: [1, 25] }, { code: 'passeur2d4', range: [26, 50] }, { code: 'fleur1d6', range: [51, 65] }, { code: 'mangeur1d6', range: [66, 70] }, { code: 'changeur2d6', range: [71, 80] }, { code: 'briseur2d6', range: [81, 85] }, { code: 'reflet2d6', range: [86, 90] }, { code: 'tbblanc2d6', range: [91, 94] }, { code: 'tbnoir2d8', range: [95, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - plaines: [{ code: 'messager2d4', range: [1, 20] }, { code: 'passeur2d4', range: [21, 40] }, { code: 'fleur1d6', range: [41, 55] }, { code: 'mangeur1d6', range: [56, 60] }, { code: 'changeur2d6', range: [61, 75] }, { code: 'briseur2d6', range: [76, 82] }, { code: 'reflet2d6', range: [83, 88] }, { code: 'tbblanc2d6', range: [89, 93] }, { code: 'tbnoir2d8', range: [94, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - pont: [{ code: 'messager2d4', range: [1, 20] }, { code: 'passeur2d4', range: [21, 40] }, { code: 'fleur1d6', range: [41, 55] }, { code: 'mangeur1d6', range: [56, 60] }, { code: 'changeur2d6', range: [61, 75] }, { code: 'briseur2d6', range: [76, 82] }, { code: 'reflet2d6', range: [83, 88] }, { code: 'tbblanc2d6', range: [89, 93] }, { code: 'tbnoir2d8', range: [94, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - collines: [{ code: 'messager2d4', range: [1, 15] }, { code: 'passeur2d4', range: [16, 30] }, { code: 'fleur1d6', range: [31, 42] }, { code: 'mangeur1d6', range: [43, 54] }, { code: 'changeur2d6', range: [55, 69] }, { code: 'briseur2d6', range: [70, 82] }, { code: 'reflet2d6', range: [83, 88] }, { code: 'tbblanc2d6', range: [89, 93] }, { code: 'tbnoir2d8', range: [94, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - foret: [{ code: 'messager2d4', range: [1, 15] }, { code: 'passeur2d4', range: [16, 30] }, { code: 'fleur1d6', range: [31, 42] }, { code: 'mangeur1d6', range: [43, 54] }, { code: 'changeur2d6', range: [55, 69] }, { code: 'briseur2d6', range: [70, 82] }, { code: 'reflet2d6', range: [83, 88] }, { code: 'tbblanc2d6', range: [89, 93] }, { code: 'tbnoir2d8', range: [94, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - monts: [{ code: 'messager2d4', range: [1, 10] }, { code: 'passeur2d4', range: [11, 20] }, { code: 'fleur1d6', range: [21, 26] }, { code: 'mangeur1d6', range: [27, 44] }, { code: 'changeur2d6', range: [45, 59] }, { code: 'briseur2d6', range: [60, 75] }, { code: 'reflet2d6', range: [76, 85] }, { code: 'tbblanc2d6', range: [86, 92] }, { code: 'tbnoir2d8', range: [93, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - desert: [{ code: 'messager2d4', range: [1, 10] }, { code: 'passeur2d4', range: [11, 20] }, { code: 'fleur1d6', range: [21, 26] }, { code: 'mangeur1d6', range: [27, 44] }, { code: 'changeur2d6', range: [45, 59] }, { code: 'briseur2d6', range: [60, 75] }, { code: 'reflet2d6', range: [76, 85] }, { code: 'tbblanc2d6', range: [86, 92] }, { code: 'tbnoir2d8', range: [93, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - fleuve: [{ code: 'messager2d4', range: [1, 5] }, { code: 'passeur2d4', range: [6, 10] }, { code: 'fleur1d6', range: [11, 13] }, { code: 'mangeur1d6', range: [14, 37] }, { code: 'changeur2d6', range: [38, 49] }, { code: 'briseur2d6', range: [50, 65] }, { code: 'reflet2d6', range: [66, 79] }, { code: 'tbblanc2d6', range: [80, 89] }, { code: 'tbnoir2d8', range: [90, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - lac: [{ code: 'messager2d4', range: [1, 5] }, { code: 'passeur2d4', range: [6, 10] }, { code: 'fleur1d6', range: [11, 13] }, { code: 'mangeur1d6', range: [14, 37] }, { code: 'changeur2d6', range: [38, 49] }, { code: 'briseur2d6', range: [50, 65] }, { code: 'reflet2d6', range: [66, 79] }, { code: 'tbblanc2d6', range: [80, 89] }, { code: 'tbnoir2d8', range: [90, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - marais: [{ code: 'messager2d4', range: [1, 2] }, { code: 'passeur2d4', range: [3, 4] }, { code: 'fleur1d6', range: [5, 5] }, { code: 'mangeur1d6', range: [6, 29] }, { code: 'changeur2d6', range: [30, 39] }, { code: 'briseur2d6', range: [40, 60] }, { code: 'reflet2d6', range: [61, 75] }, { code: 'tbblanc2d6', range: [76, 86] }, { code: 'tbnoir2d8', range: [87, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - gouffre: [{ code: 'messager2d4', range: [1, 2] }, { code: 'passeur2d4', range: [3, 4] }, { code: 'fleur1d6', range: [5, 5] }, { code: 'mangeur1d6', range: [6, 29] }, { code: 'changeur2d6', range: [30, 39] }, { code: 'briseur2d6', range: [40, 60] }, { code: 'reflet2d6', range: [61, 75] }, { code: 'tbblanc2d6', range: [76, 86] }, { code: 'tbnoir2d8', range: [87, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - necropole: [{ code: 'mangeur1d6', range: [1, 20] }, { code: 'changeur2d6', range: [21, 30] }, { code: 'briseur2d6', range: [31, 50] }, { code: 'reflet2d6', range: [51, 65] }, { code: 'tbblanc2d6', range: [66, 80] }, { code: 'tbnoir2d8', range: [81, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }], - desolation: [{ code: 'mangeur1d6', range: [1, 20] }, { code: 'changeur2d6', range: [21, 30] }, { code: 'briseur2d6', range: [31, 50] }, { code: 'reflet2d6', range: [51, 65] }, { code: 'tbblanc2d6', range: [66, 80] }, { code: 'tbnoir2d8', range: [81, 97] }, { code: 'rdd1ddr+7', range: [98, 100] }] + 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] }], + sanctuaire: [{ 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] }], + plaines: [{ code: 'messager', range: [1, 20] }, { code: 'passeur', range: [21, 40] }, { code: 'fleur', range: [41, 55] }, { code: 'mangeur', range: [56, 60] }, { code: 'changeur', range: [61, 75] }, { code: 'briseur', range: [76, 82] }, { code: 'reflet', range: [83, 88] }, { code: 'tbblanc', range: [89, 93] }, { code: 'tbnoir', range: [94, 97] }, { code: 'rdd', range: [98, 100] }], + pont: [{ code: 'messager', range: [1, 20] }, { code: 'passeur', range: [21, 40] }, { code: 'fleur', range: [41, 55] }, { code: 'mangeur', range: [56, 60] }, { code: 'changeur', range: [61, 75] }, { code: 'briseur', range: [76, 82] }, { code: 'reflet', range: [83, 88] }, { code: 'tbblanc', range: [89, 93] }, { code: 'tbnoir', range: [94, 97] }, { code: 'rdd', range: [98, 100] }], + collines: [{ code: 'messager', range: [1, 15] }, { code: 'passeur', range: [16, 30] }, { code: 'fleur', range: [31, 42] }, { code: 'mangeur', range: [43, 54] }, { code: 'changeur', range: [55, 69] }, { code: 'briseur', range: [70, 82] }, { code: 'reflet', range: [83, 88] }, { code: 'tbblanc', range: [89, 93] }, { code: 'tbnoir', range: [94, 97] }, { code: 'rdd', range: [98, 100] }], + foret: [{ code: 'messager', range: [1, 15] }, { code: 'passeur', range: [16, 30] }, { code: 'fleur', range: [31, 42] }, { code: 'mangeur', range: [43, 54] }, { code: 'changeur', range: [55, 69] }, { code: 'briseur', range: [70, 82] }, { code: 'reflet', range: [83, 88] }, { code: 'tbblanc', range: [89, 93] }, { code: 'tbnoir', range: [94, 97] }, { code: 'rdd', range: [98, 100] }], + monts: [{ code: 'messager', range: [1, 10] }, { code: 'passeur', range: [11, 20] }, { code: 'fleur', range: [21, 26] }, { code: 'mangeur', range: [27, 44] }, { code: 'changeur', range: [45, 59] }, { code: 'briseur', range: [60, 75] }, { code: 'reflet', range: [76, 85] }, { code: 'tbblanc', range: [86, 92] }, { code: 'tbnoir', range: [93, 97] }, { code: 'rdd', range: [98, 100] }], + desert: [{ code: 'messager', range: [1, 10] }, { code: 'passeur', range: [11, 20] }, { code: 'fleur', range: [21, 26] }, { code: 'mangeur', range: [27, 44] }, { code: 'changeur', range: [45, 59] }, { code: 'briseur', range: [60, 75] }, { code: 'reflet', range: [76, 85] }, { code: 'tbblanc', range: [86, 92] }, { code: 'tbnoir', range: [93, 97] }, { code: 'rdd', range: [98, 100] }], + fleuve: [{ code: 'messager', range: [1, 5] }, { code: 'passeur', range: [6, 10] }, { code: 'fleur', range: [11, 13] }, { code: 'mangeur', range: [14, 37] }, { code: 'changeur', range: [38, 49] }, { code: 'briseur', range: [50, 65] }, { code: 'reflet', range: [66, 79] }, { code: 'tbblanc', range: [80, 89] }, { code: 'tbnoir', range: [90, 97] }, { code: 'rdd', range: [98, 100] }], + lac: [{ code: 'messager', range: [1, 5] }, { code: 'passeur', range: [6, 10] }, { code: 'fleur', range: [11, 13] }, { code: 'mangeur', range: [14, 37] }, { code: 'changeur', range: [38, 49] }, { code: 'briseur', range: [50, 65] }, { code: 'reflet', range: [66, 79] }, { code: 'tbblanc', range: [80, 89] }, { code: 'tbnoir', range: [90, 97] }, { code: 'rdd', range: [98, 100] }], + marais: [{ code: 'messager', range: [1, 2] }, { code: 'passeur', range: [3, 4] }, { code: 'fleur', range: [5, 5] }, { code: 'mangeur', range: [6, 29] }, { code: 'changeur', range: [30, 39] }, { code: 'briseur', range: [40, 60] }, { code: 'reflet', range: [61, 75] }, { code: 'tbblanc', range: [76, 86] }, { code: 'tbnoir', range: [87, 97] }, { code: 'rdd', range: [98, 100] }], + gouffre: [{ code: 'messager', range: [1, 2] }, { code: 'passeur', range: [3, 4] }, { code: 'fleur', range: [5, 5] }, { code: 'mangeur', range: [6, 29] }, { code: 'changeur', range: [30, 39] }, { code: 'briseur', range: [40, 60] }, { code: 'reflet', range: [61, 75] }, { code: 'tbblanc', range: [76, 86] }, { code: 'tbnoir', range: [87, 97] }, { code: 'rdd', range: [98, 100] }], + necropole: [{ code: 'mangeur', range: [1, 20] }, { code: 'changeur', range: [21, 30] }, { code: 'briseur', range: [31, 50] }, { code: 'reflet', range: [51, 65] }, { code: 'tbblanc', range: [66, 80] }, { code: 'tbnoir', range: [81, 97] }, { code: 'rdd', range: [98, 100] }], + desolation: [{ code: 'mangeur', range: [1, 20] }, { code: 'changeur', range: [21, 30] }, { code: 'briseur', range: [31, 50] }, { code: 'reflet', range: [51, 65] }, { code: 'tbblanc', range: [66, 80] }, { code: 'tbnoir', range: [81, 97] }, { code: 'rdd', range: [98, 100] }] } @@ -378,7 +378,8 @@ export class TMRRencontres { /* -------------------------------------------- */ static async evaluerForceRencontre(rencontre) { if (TMRRencontres.isReveDeDragon(rencontre)) { - rencontre.force = await DeDraconique.ddr("selfroll").total + 7; + const ddr = await DeDraconique.ddr("selfroll") + rencontre.force = 7 + ddr.total; } else { rencontre.force = new Roll(rencontre.force).evaluate().total; diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 4cedfaa7..34c32967 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -4,241 +4,303 @@ import { Grammar } from "./grammar.js"; import { Misc } from "./misc.js"; /* -------------------------------------------- */ -const TMRMapping = { - A1: { type: "cite", label: "Cité Vide"}, - B1: { type: "plaines", label: "Plaines d’Assorh"}, - C1: { type: "necropole", label: "Nécropole de Kroak"}, - D1: { type: "fleuve", label: "Fleuve"}, - E1: { type: "monts", label: "Monts de Kanaï"}, - F1: { type: "cite", label: "Cité Glauque"}, - G1: { type: "desolation", label: "Désolation de Demain"}, - H1: { type: "lac", label: "Lac d’Anticalme"}, - I1: { type: "plaines", label: "Plaines Grises"}, - J1: { type: "monts", label: "Monts Fainéants"}, - K1: { type: "cite", label: "Cité d’Onkause"}, - L1: { type: "fleuve", label: "Fleuve"}, - M1: { type: "cite", label: "Cité Jalouse"}, - - A2: { type: "desert", label: "Désert de Mieux"}, - B2: { type: "collines", label: "Collines de Dawell"}, - C2: { type: "marais", label: "Marais Glignants"}, - D2: { type: "cite", label: "Cité de Frost"}, - E2: { type: "plaines", label: "Plaines de Fiask"}, - F2: { type: "lac", label: "Lac de Misère"}, - G2: { type: "marais", label: "Marais Nuisants"}, - H2: { type: "collines", label: "Collines de Parta"}, - I2: { type: "foret", label: "Forêt Fade"}, - J2: { type: "desert", label: "Désert de Poly"}, - K2: { type: "foret", label: "Forêt Tamée"}, - L2: { type: "fleuve", label: "Fleuve"}, - M2: { type: "necropole", label: "Nécropole de Logos"}, +const TMRMapping = { + A1: { type: "cite", label: "Cité Vide" }, + B1: { type: "plaines", label: "Plaines d’Assorh" }, + C1: { type: "necropole", label: "Nécropole de Kroak" }, + D1: { type: "fleuve", label: "Fleuve de l'Oubli" }, + E1: { type: "monts", label: "Monts de Kanaï" }, + F1: { type: "cite", label: "Cité Glauque" }, + G1: { type: "desolation", label: "Désolation de Demain" }, + H1: { type: "lac", label: "Lac d’Anticalme" }, + I1: { type: "plaines", label: "Plaines Grises" }, + J1: { type: "monts", label: "Monts Fainéants" }, + K1: { type: "cite", label: "Cité d’Onkause" }, + L1: { type: "fleuve", label: "Fleuve de l'Oubli" }, + M1: { type: "cite", label: "Cité Jalouse" }, - A3: { type: "desolation", label: "Désolation de Demain"}, - B3: { type: "plaines", label: "Plaines de Rubéga"}, - C3: { type: "fleuve", label: "Fleuve"}, - D3: { type: "gouffre", label: "Gouffre d’Oki"}, - E3: { type: "foret", label: "Forêt d’Estoubh"}, - F3: { type: "fleuve", label: "Fleuve"}, - G3: { type: "gouffre", label: "Gouffre de Sun"}, - H3: { type: "foret", label: "Forêt de Ganna"}, - I3: { type: "monts", label: "Monts Grinçants"}, - J3: { type: "cite", label: "Cité Venin"}, - K3: { type: "plaines", label: "Plaines de Dois"}, - L3: { type: "lac", label: "Lac Laineux"}, - M3: { type: "monts", label: "Monts de Vdah"}, + A2: { type: "desert", label: "Désert de Mieux" }, + B2: { type: "collines", label: "Collines de Dawell" }, + C2: { type: "marais", label: "Marais Glignants" }, + D2: { type: "cite", label: "Cité de Frost" }, + E2: { type: "plaines", label: "Plaines de Fiask" }, + F2: { type: "lac", label: "Lac de Misère" }, + G2: { type: "marais", label: "Marais Nuisants" }, + H2: { type: "collines", label: "Collines de Parta" }, + I2: { type: "foret", label: "Forêt Fade" }, + J2: { type: "desert", label: "Désert de Poly" }, + K2: { type: "foret", label: "Forêt Tamée" }, + L2: { type: "fleuve", label: "Fleuve de l'Oubli" }, + M2: { type: "necropole", label: "Nécropole de Logos" }, - A4: { type: "foret", label: "Forêt de Falconax"}, - B4: { type: "monts", label: "Monts Crâneurs"}, - C4: { type: "pont", label: "Pont de Giolii"}, - D4: { type: "lac", label: "Lac de Foam"}, - E4: { type: "plaines", label: "Plaines d’Orti"}, - F4: { type: "fleuve", label: "Fleuve"}, - G4: { type: "sanctuaire", label: "Sanctuaire Blanc"}, - H4: { type: "plaines", label: "Plaines de Psark"}, - I4: { type: "plaines", label: "Plaines de Xiax"}, - J4: { type: "collines", label: "Collines d’Encre"}, - K4: { type: "pont", label: "Pont de Fah"}, - L4: { type: "sanctuaire", label: "Sanctuaire Mauve"}, - M4: { type: "gouffre", label: "Gouffre Grisant"}, + A3: { type: "desolation", label: "Désolation de Demain" }, + B3: { type: "plaines", label: "Plaines de Rubéga" }, + C3: { type: "fleuve", label: "Fleuve de l'Oubli" }, + D3: { type: "gouffre", label: "Gouffre d’Oki" }, + E3: { type: "foret", label: "Forêt d’Estoubh" }, + F3: { type: "fleuve", label: "Fleuve de l'Oubli" }, + G3: { type: "gouffre", label: "Gouffre de Sun" }, + H3: { type: "foret", label: "Forêt de Ganna" }, + I3: { type: "monts", label: "Monts Grinçants" }, + J3: { type: "cite", label: "Cité Venin" }, + K3: { type: "plaines", label: "Plaines de Dois" }, + L3: { type: "lac", label: "Lac Laineux" }, + M3: { type: "monts", label: "Monts de Vdah" }, - A5: { type: "plaines", label: "Plaines de Trilkh"}, - B5: { type: "collines", label: "Collines de Tanegy"}, - C5: { type: "marais", label: "Marais Flouants"}, - D5: { type: "fleuve", label: "Fleuve"}, - E5: { type: "monts", label: "Monts Brûlants"}, - F5: { type: "cite", label: "Cité de Panople"}, - G5: { type: "pont", label: "Pont d’Ik"}, - H5: { type: "desert", label: "Désert de Krane"}, - I5: { type: "desolation", label: "Désolation de Demain"}, - J5: { type: "marais", label: "Marais de Jab"}, - K5: { type: "fleuve", label: "Fleuve"}, - L5: { type: "collines", label: "Collines Suaves"}, - M5: { type: "cite", label: "Cité Rimarde"}, + A4: { type: "foret", label: "Forêt de Falconax" }, + B4: { type: "monts", label: "Monts Crâneurs" }, + C4: { type: "pont", label: "Pont de Giolii" }, + D4: { type: "lac", label: "Lac de Foam" }, + E4: { type: "plaines", label: "Plaines d’Orti" }, + F4: { type: "fleuve", label: "Fleuve de l'Oubli" }, + G4: { type: "sanctuaire", label: "Sanctuaire Blanc" }, + H4: { type: "plaines", label: "Plaines de Psark" }, + I4: { type: "plaines", label: "Plaines de Xiax" }, + J4: { type: "collines", label: "Collines d’Encre" }, + K4: { type: "pont", label: "Pont de Fah" }, + L4: { type: "sanctuaire", label: "Sanctuaire Mauve" }, + M4: { type: "gouffre", label: "Gouffre Grisant" }, - A6: { type: "necropole", label: "Nécropole de Zniak"}, - B6: { type: "foret", label: "Forêt de Bust"}, - C6: { type: "cite", label: "Cité Pavois"}, - D6: { type: "fleuve", label: "Fleuve"}, - E6: { type: "sanctuaire", label: "Sanctuaire de Plaine"}, - F6: { type: "fleuve", label: "Fleuve"}, - G6: { type: "marais", label: "Marais Glutants"}, - H6: { type: "monts", label: "Monts Gurdes"}, - I6: { type: "necropole", label: "Nécropole de Xotar"}, - J6: { type: "lac", label: "Lac d’Iaupe"}, - K6: { type: "desolation", label: "Désolation de Demain"}, - L6: { type: "foret", label: "Forêt Gueuse"}, - M6: { type: "desolation", label: "Désolation de Demain"}, + A5: { type: "plaines", label: "Plaines de Trilkh" }, + B5: { type: "collines", label: "Collines de Tanegy" }, + C5: { type: "marais", label: "Marais Flouants" }, + D5: { type: "fleuve", label: "Fleuve de l'Oubli" }, + E5: { type: "monts", label: "Monts Brûlants" }, + F5: { type: "cite", label: "Cité de Panople" }, + G5: { type: "pont", label: "Pont d’Ik" }, + H5: { type: "desert", label: "Désert de Krane" }, + I5: { type: "desolation", label: "Désolation de Demain" }, + J5: { type: "marais", label: "Marais de Jab" }, + K5: { type: "fleuve", label: "Fleuve de l'Oubli" }, + L5: { type: "collines", label: "Collines Suaves" }, + M5: { type: "cite", label: "Cité Rimarde" }, - A7: { type: "plaines", label: "Plaines de l’Arc"}, - B7: { type: "marais", label: "Marais Bluants"}, - C7: { type: "fleuve", label: "Fleuve"}, - D7: { type: "plaines", label: "Plaines d’A!a"}, - E7: { type: "foret", label: "Forêt de Glusks"}, - F7: { type: "fleuve", label: "Fleuve"}, - G7: { type: "cite", label: "Cité de Terwa"}, - H7: { type: "gouffre", label: "Gouffre de Kapfa"}, - I7: { type: "plaines", label: "Plaines de Troo"}, - J7: { type: "fleuve", label: "Fleuve"}, - K7: { type: "cite", label: "Cité de Kolix"}, - L7: { type: "gouffre", label: "Gouffre d’Episophe"}, - M7: { type: "desert", label: "Désert de Lave"}, + A6: { type: "necropole", label: "Nécropole de Zniak" }, + B6: { type: "foret", label: "Forêt de Bust" }, + C6: { type: "cite", label: "Cité Pavois" }, + D6: { type: "fleuve", label: "Fleuve de l'Oubli" }, + E6: { type: "sanctuaire", label: "Sanctuaire de Plaine" }, + F6: { type: "fleuve", label: "Fleuve de l'Oubli" }, + G6: { type: "marais", label: "Marais Glutants" }, + H6: { type: "monts", label: "Monts Gurdes" }, + I6: { type: "necropole", label: "Nécropole de Xotar" }, + J6: { type: "lac", label: "Lac d’Iaupe" }, + K6: { type: "desolation", label: "Désolation de Demain" }, + L6: { type: "foret", label: "Forêt Gueuse" }, + M6: { type: "desolation", label: "Désolation de Demain" }, - A8: { type: "gouffre", label: "Gouffre de Shok"}, - B8: { type: "fleuve", label: "Fleuve"}, - C8: { type: "foret", label: "Forêt Turmide"}, - D8: { type: "cite", label: "Cité d’Olak"}, - E8: { type: "plaines", label: "Plaines d’Iolise"}, - F8: { type: "lac", label: "Lac des Chats"}, - G8: { type: "plaines", label: "Plaines Sans Joie"}, - H8: { type: "foret", label: "Forêt d’Ourf"}, - I8: { type: "fleuve", label: "Fleuve"}, - J8: { type: "monts", label: "Monts Barask"}, - K8: { type: "desert", label: "Désert de Fumée"}, - L8: { type: "monts", label: "Monts Tavelés"}, - M8: { type: "plaines", label: "Plaines Lavées"}, + A7: { type: "plaines", label: "Plaines de l’Arc" }, + B7: { type: "marais", label: "Marais Bluants" }, + C7: { type: "fleuve", label: "Fleuve de l'Oubli" }, + D7: { type: "plaines", label: "Plaines d’A!a" }, + E7: { type: "foret", label: "Forêt de Glusks" }, + F7: { type: "fleuve", label: "Fleuve de l'Oubli" }, + G7: { type: "cite", label: "Cité de Terwa" }, + H7: { type: "gouffre", label: "Gouffre de Kapfa" }, + I7: { type: "plaines", label: "Plaines de Troo" }, + J7: { type: "fleuve", label: "Fleuve de l'Oubli" }, + K7: { type: "cite", label: "Cité de Kolix" }, + L7: { type: "gouffre", label: "Gouffre d’Episophe" }, + M7: { type: "desert", label: "Désert de Lave" }, - A9: { type: "collines", label: "Collines de Korrex"}, - B9: { type: "lac", label: "Lac de Lucre"}, - C9: { type: "monts", label: "Monts Tuméfiés"}, - D9: { type: "pont", label: "Pont d’Orx"}, - E9: { type: "fleuve", label: "Fleuve"}, - F9: { type: "plaines", label: "Plaines de Foe"}, - G9: { type: "desolation", label: "Désolation de Demain"}, - H9: { type: "collines", label: "Collines de Noirseul"}, - I9: { type: "fleuve", label: "Fleuve"}, - J9: { type: "marais", label: "Marais Gronchants"}, - K9: { type: "sanctuaire", label: "Sanctuaire Noir"}, - L9: { type: "collines", label: "Collines Cornues"}, - M9: { type: "necropole", label: "Nécropole de Zonar"}, + A8: { type: "gouffre", label: "Gouffre de Shok" }, + B8: { type: "fleuve", label: "Fleuve de l'Oubli" }, + C8: { type: "foret", label: "Forêt Turmide" }, + D8: { type: "cite", label: "Cité d’Olak" }, + E8: { type: "plaines", label: "Plaines d’Iolise" }, + F8: { type: "lac", label: "Lac des Chats" }, + G8: { type: "plaines", label: "Plaines Sans Joie" }, + H8: { type: "foret", label: "Forêt d’Ourf" }, + I8: { type: "fleuve", label: "Fleuve de l'Oubli" }, + J8: { type: "monts", label: "Monts Barask" }, + K8: { type: "desert", label: "Désert de Fumée" }, + L8: { type: "monts", label: "Monts Tavelés" }, + M8: { type: "plaines", label: "Plaines Lavées" }, - A10: { type: "sanctuaire", label: "Sanctuaire d’Olis"}, - B10: { type: "monts", label: "Monts Salés"}, - C10: { type: "marais", label: "Marais de Dom"}, - D10: { type: "fleuve", label: "Fleuve"}, - E10: { type: "gouffre", label: "Gouffre de Junk"}, - F10: { type: "marais", label: "Marais Zultants"}, - G10: { type: "cite", label: "Cité de Sergal"}, - H10: { type: "plaines", label: "Plaines Noires"}, - I10: { type: "lac", label: "Lac Wanito"}, - J10: { type: "fleuve", label: "Fleuve"}, - K10: { type: "plaines", label: "Plaines Jaunes"}, - L10: { type: "desert", label: "Désert de Nicrop"}, - M10: { type: "foret", label: "Forêt de Jajou"}, + A9: { type: "collines", label: "Collines de Korrex" }, + B9: { type: "lac", label: "Lac de Lucre" }, + C9: { type: "monts", label: "Monts Tuméfiés" }, + D9: { type: "pont", label: "Pont d’Orx" }, + E9: { type: "fleuve", label: "Fleuve de l'Oubli" }, + F9: { type: "plaines", label: "Plaines de Foe" }, + G9: { type: "desolation", label: "Désolation de Demain" }, + H9: { type: "collines", label: "Collines de Noirseul" }, + I9: { type: "fleuve", label: "Fleuve de l'Oubli" }, + J9: { type: "marais", label: "Marais Gronchants" }, + K9: { type: "sanctuaire", label: "Sanctuaire Noir" }, + L9: { type: "collines", label: "Collines Cornues" }, + M9: { type: "necropole", label: "Nécropole de Zonar" }, - A11: { type: "desolation", label: "Désolation de Demain"}, - B11: { type: "cite", label: "Cité de Brilz"}, - C11: { type: "pont", label: "Pont de Roï"}, - D11: { type: "desolation", label: "Désolation de Demain"}, - E11: { type: "lac", label: "Lac de Glinster"}, - F11: { type: "cite", label: "Cité de Noape"}, - G11: { type: "fleuve", label: "Fleuve"}, - H11: { type: "fleuve", label: "Fleuve"}, - I11: { type: "pont", label: "Pont de Yalm"}, - J11: { type: "plaines", label: "Plaines de Miltiar"}, - K11: { type: "cite", label: "Cité Tonnerre"}, - L11: { type: "collines", label: "Collines de Kol"}, - M11: { type: "cite", label: "Cité Crapaud"}, + A10: { type: "sanctuaire", label: "Sanctuaire d’Olis" }, + B10: { type: "monts", label: "Monts Salés" }, + C10: { type: "marais", label: "Marais de Dom" }, + D10: { type: "fleuve", label: "Fleuve de l'Oubli" }, + E10: { type: "gouffre", label: "Gouffre de Junk" }, + F10: { type: "marais", label: "Marais Zultants" }, + G10: { type: "cite", label: "Cité de Sergal" }, + H10: { type: "plaines", label: "Plaines Noires" }, + I10: { type: "lac", label: "Lac Wanito" }, + J10: { type: "fleuve", label: "Fleuve de l'Oubli" }, + K10: { type: "plaines", label: "Plaines Jaunes" }, + L10: { type: "desert", label: "Désert de Nicrop" }, + M10: { type: "foret", label: "Forêt de Jajou" }, - A12: { type: "plaines", label: "Plaines Sages"}, - B12: { type: "fleuve", label: "Fleuve"}, - C12: { type: "lac", label: "Lac de Fricassa"}, - D12: { type: "collines", label: "Collines d’Huaï"}, - E12: { type: "monts", label: "Monts Ajourés"}, - F12: { type: "necropole", label: "Nécropole de Troat"}, - G12: { type: "plaines", label: "Plaines de Lufmil"}, - H12: { type: "collines", label: "Collines de Tooth"}, - I12: { type: "gouffre", label: "Gouffre Abimeux"}, - J12: { type: "cite", label: "Cité Folle"}, - K12: { type: "desolation", label: "Désolation de Demain"}, - L12: { type: "plaines", label: "Plaines Venteuses"}, - M12: { type: "collines", label: "Collines Révulsantes"}, + A11: { type: "desolation", label: "Désolation de Demain" }, + B11: { type: "cite", label: "Cité de Brilz" }, + C11: { type: "pont", label: "Pont de Roï" }, + D11: { type: "desolation", label: "Désolation de Demain" }, + E11: { type: "lac", label: "Lac de Glinster" }, + F11: { type: "cite", label: "Cité de Noape" }, + G11: { type: "fleuve", label: "Fleuve de l'Oubli" }, + H11: { type: "fleuve", label: "Fleuve de l'Oubli" }, + I11: { type: "pont", label: "Pont de Yalm" }, + J11: { type: "plaines", label: "Plaines de Miltiar" }, + K11: { type: "cite", label: "Cité Tonnerre" }, + L11: { type: "collines", label: "Collines de Kol" }, + M11: { type: "cite", label: "Cité Crapaud" }, - A13: { type: "fleuve", label: "Fleuve"}, - B13: { type: "gouffre", label: "Gouffre des Litiges"}, - C13: { type: "desert", label: "Désert de Neige"}, - D13: { type: "cite", label: "Cité Sordide"}, - E13: { type: "plaines", label: "Plaines de Xnez"}, - F13: { type: "foret", label: "Forêt des Cris"}, - G13: { type: "plaines", label: "Plaines Calcaires"}, - H13: { type: "desolation", label: "Désolation de Demain"}, - I13: { type: "monts", label: "Monts Bigleux"}, - J13: { type: "gouffre", label: "Gouffre de Gromph"}, - K13: { type: "foret", label: "Forêt de Kluth"}, - L13: { type: "monts", label: "Monts Dormants"}, - M13: { type: "plaines", label: "Plaines d’Anjou"}, + A12: { type: "plaines", label: "Plaines Sages" }, + B12: { type: "fleuve", label: "Fleuve de l'Oubli" }, + C12: { type: "lac", label: "Lac de Fricassa" }, + D12: { type: "collines", label: "Collines d’Huaï" }, + E12: { type: "monts", label: "Monts Ajourés" }, + F12: { type: "necropole", label: "Nécropole de Troat" }, + G12: { type: "plaines", label: "Plaines de Lufmil" }, + H12: { type: "collines", label: "Collines de Tooth" }, + I12: { type: "gouffre", label: "Gouffre Abimeux" }, + J12: { type: "cite", label: "Cité Folle" }, + K12: { type: "desolation", label: "Désolation de Demain" }, + L12: { type: "plaines", label: "Plaines Venteuses" }, + M12: { type: "collines", label: "Collines Révulsantes" }, - A14: { type: "collines", label: "Collines de Stolis"}, - B14: { type: "necropole", label: "Nécropole de Gorlo"}, - C14: { type: "foret", label: "Forêt de Bissam"}, - D14: { type: "sanctuaire", label: "Sanctuaire Plat"}, - E14: { type: "monts", label: "Monts de Quath"}, - F14: { type: "plaines", label: "Plaines Brisées"}, - G14: { type: "desert", label: "Désert de Sek"}, - H14: { type: "plaines", label: "Plaines Blanches"}, - I14: { type: "cite", label: "Cité Destituée"}, - J14: { type: "desert", label: "Désert de Sank"}, - K14: { type: "necropole", label: "Nécropole d’Antinéar"}, - L14: { type: "plaines", label: "Plaines de Jislith"}, - M14: { type: "desolation", label: "Désolation de Demain"}, + A13: { type: "fleuve", label: "Fleuve de l'Oubli" }, + B13: { type: "gouffre", label: "Gouffre des Litiges" }, + C13: { type: "desert", label: "Désert de Neige" }, + D13: { type: "cite", label: "Cité Sordide" }, + E13: { type: "plaines", label: "Plaines de Xnez" }, + F13: { type: "foret", label: "Forêt des Cris" }, + G13: { type: "plaines", label: "Plaines Calcaires" }, + H13: { type: "desolation", label: "Désolation de Demain" }, + I13: { type: "monts", label: "Monts Bigleux" }, + J13: { type: "gouffre", label: "Gouffre de Gromph" }, + K13: { type: "foret", label: "Forêt de Kluth" }, + L13: { type: "monts", label: "Monts Dormants" }, + M13: { type: "plaines", label: "Plaines d’Anjou" }, - A15: { type: "cite", label: "Cité de Mielh"}, - C15: { type: "plaines", label: "Plaines de Toué"}, - E15: { type: "foret", label: "Forêt des Furies"}, - G15: { type: "plaines", label: "Plaines des Soupirs"}, - I15: { type: "monts", label: "Monts des Dragées"}, - K15: { type: "collines", label: "Collines Pourpres"}, - M15: { type: "cite", label: "Cité de Klana"} - } + A14: { type: "collines", label: "Collines de Stolis" }, + B14: { type: "necropole", label: "Nécropole de Gorlo" }, + C14: { type: "foret", label: "Forêt de Bissam" }, + D14: { type: "sanctuaire", label: "Sanctuaire Plat" }, + E14: { type: "monts", label: "Monts de Quath" }, + F14: { type: "plaines", label: "Plaines Brisées" }, + G14: { type: "desert", label: "Désert de Sek" }, + H14: { type: "plaines", label: "Plaines Blanches" }, + I14: { type: "cite", label: "Cité Destituée" }, + J14: { type: "desert", label: "Désert de Sank" }, + K14: { type: "necropole", label: "Nécropole d’Antinéar" }, + L14: { type: "plaines", label: "Plaines de Jislith" }, + M14: { type: "desolation", label: "Désolation de Demain" }, -export const TMRType = { - cite: {name:"cité"}, - sanctuaire: {name:"sanctuaire"}, - plaines: {name:"plaines"}, - pont: {name:"pont"}, - collines: {name:"collines"}, - foret: {name:"forêt"}, - monts: {name:"monts"}, - desert: {name:"désert"}, - fleuve: {name:"fleuve"}, - lac: {name:"lac"}, - marais: {name:"marais"}, - gouffre: {name:"gouffre"}, - necropole: {name:"nécropole"}, - desolation: {name:"désolation"} + A15: { type: "cite", label: "Cité de Mielh" }, + C15: { type: "plaines", label: "Plaines de Toué" }, + E15: { type: "foret", label: "Forêt des Furies" }, + G15: { type: "plaines", label: "Plaines des Soupirs" }, + I15: { type: "monts", label: "Monts des Dragées" }, + K15: { type: "collines", label: "Collines Pourpres" }, + M15: { type: "cite", label: "Cité de Klana" } } -/* -------------------------------------------- */ -const caseSpecificModes = [ "attache", "trounoir", "debordement", "reserve_extensible", "maitrisee" ]; +export const TMRType = { + cite: { name: "cité", genre: "f" }, + sanctuaire: { name: "sanctuaire" }, + plaines: { name: "plaines", genre: "p" }, + pont: { name: "pont", genre: "m" }, + collines: { name: "collines", genre: "p" }, + foret: { name: "forêt", genre: "f" }, + monts: { name: "monts", genre: "p" }, + desert: { name: "désert", genre: "m" }, + fleuve: { name: "fleuve", genre: "m" }, + lac: { name: "lac", genre: "m" }, + marais: { name: "marais", genre: "m" }, + gouffre: { name: "gouffre", genre: "m" }, + necropole: { name: "nécropole", genre: "f" }, + desolation: { name: "désolation", genre: "f" } +} + +export const poesieCaseHumide = [ + { + reference: 'Le Ratier Bretonien', + extrait: `Le courant du Fleuve +
Te domine et te Porte +
Avant que tu te moeuves +
Combat le, ou il t'emporte` + }, + { + reference: 'Incompatibilité, Charles Beaudelaire', + extrait: `Et lorsque par hasard une nuée errante +
Assombrit dans son vol le lac silencieux, +
On croirait voir la robe ou l'ombre transparente +
D'un esprit qui voyage et passe dans les cieux.` + }, + { + reference: 'Au fleuve de Loire, Joachim du Bellay', + extrait: `Ô de qui la vive course +
Prend sa bienheureuse source, +
D’une argentine fontaine, +
Qui d’une fuite lointaine, +
Te rends au sein fluctueux +
De l’Océan monstrueux` + }, + { + reference: 'Denis Gerfaud', + extrait: `Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli. + Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos. + Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli, + sinon peut-être lui-même, ou peut-être Thanatos` }, + { + reference: 'Denis Gerfaud', + extrait: `Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure + Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir. + Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli` + }, + { + reference: 'Denis Gerfaud', + extrait: `Narcos engendre le fils dont il est la mère à l'heure du Vaisseau, + car Oniros s'embarque pour redescendre le Fleuve + vers son père Hypnos sur la Voie de l'Oubli` + }, + { + reference: 'Denis Gerfaud', + extrait: `Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car + tel les serpents, Oniros commence à remonter le Fleuve + sur le Voie du Souvenir vers son père Narcos` + }, + { + reference: 'Denis Gerfaud', + extrait: `Ainsi se cuccèdent les Jours et les Ages. Les jours des Dragons sont les Ages des Hommes` + }, + { + reference: 'Denis Gerfaud', + extrait: `Ainsi parlent les sages: + «Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros + Les Dragons ne sont pas les maîtres de leurs rêvezs, car ils ne sont pas maîtres d'Oniros. + Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. + Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»` + }, +] /* -------------------------------------------- */ -const tmrRandomMovePatten = - [ { name: 'top', x: 0, y: -1 }, - { name: 'topright', x: 1, y: -1 }, - { name: 'botright', x: 1, y: 1 }, - { name: 'bot', x: 0, y: 1 }, - { name: 'botleft', x: -1, y: 1 }, - { name: 'topleft', x: -1, y: -1 } - ] +const caseSpecificModes = ["attache", "trounoir", "debordement", "reserve_extensible", "maitrisee"]; + +/* -------------------------------------------- */ +const tmrRandomMovePatten = + [{ name: 'top', x: 0, y: -1 }, + { name: 'topright', x: 1, y: -1 }, + { name: 'botright', x: 1, y: 1 }, + { name: 'bot', x: 0, y: 1 }, + { name: 'botleft', x: -1, y: 1 }, + { name: 'topleft', x: -1, y: -1 } + ] /* -------------------------------------------- */ export const tmrConstants = { @@ -253,7 +315,7 @@ export const tmrConstants = { /* -------------------------------------------- */ /* -------------------------------------------- */ -export class TMRUtility { +export class TMRUtility { static init() { for (let coord in TMRMapping) { TMRMapping[coord].coord = coord; @@ -265,64 +327,68 @@ export class TMRUtility { } /* -------------------------------------------- */ - static convertToTMRCoord( pos ) - { - let letterX = String.fromCharCode(65+ (pos.x)); - return letterX + (pos.y +1) + static convertToTMRCoord(pos) { + let letterX = String.fromCharCode(65 + (pos.x)); + return letterX + (pos.y + 1) } /* -------------------------------------------- */ - static verifyTMRCoord( coord ) { + static verifyTMRCoord(coord) { let TMRregexp = new RegExp(/([A-M])(\d+)/g); - let res = TMRregexp.exec( coord ); + let res = TMRregexp.exec(coord); if (res && res[1] && res[2]) { if (res[2] > 0 && res[2] < 16) { return true; } } return false; - } + } /* -------------------------------------------- */ - static convertToCellPos( coordTMR ) - { + static convertToCellPos(coordTMR) { let x = coordTMR.charCodeAt(0) - 65; let y = coordTMR.substr(1) - 1; - return {x: x, y: y} + return { x: x, y: y } } - + /* -------------------------------------------- */ - static getTMR( coordTMR) - { + static getTMR(coordTMR) { return TMRMapping[coordTMR]; } - + /* -------------------------------------------- */ /** Some debug functions */ - static async setForceRencontre( index, force = undefined ) { - this.prochaineRencontre = TMRRencontres.getRencontre( index ); - if (this.prochaineRencontre ) { + static async setForceRencontre(index, force = undefined) { + this.prochaineRencontre = TMRRencontres.getRencontre(index); + if (this.prochaineRencontre) { if (force) { this.prochaineRencontre.force = force; } - else{ + else { await TMRRencontres.evaluerForceRencontre(this.prochaineRencontre) } console.log("La prochaine rencontre sera:", this.prochaineRencontre.name, " force:", this.prochaineRencontre.force); } else { - ui.notifications.warn("Pas de prochaine rencontre valide pour "+index); + ui.notifications.warn("Pas de prochaine rencontre valide pour " + index); } } + /* -------------------------------------------- */ static isForceRencontre() { - return this.prochaineRencontre + return this.prochaineRencontre; + } + /* -------------------------------------------- */ + static utiliseForceRencontre() { + const rencontre = this.prochaineRencontre; + this.prochaineRencontre = undefined; + return rencontre; } /* -------------------------------------------- */ static getDirectionPattern() { - let roll = new Roll("1d"+tmrRandomMovePatten.length).evaluate().total; - return tmrRandomMovePatten[roll -1]; + let roll = new Roll("1d" + tmrRandomMovePatten.length).evaluate().total; + return tmrRandomMovePatten[roll - 1]; } static deplaceTMRAleatoire(coord) { @@ -330,12 +396,12 @@ export class TMRUtility { } /* -------------------------------------------- */ - static deplaceTMRSelonPattern( coord, direction, nTime ) { - for (let i=0; i it.coord); + return this.getListTMR(terrain).map(it => it.coord); } static getTMRAleatoire(terrain = undefined) { let list = terrain ? TMRUtility.getListTMR(terrain) : Object.values(TMRMapping); let index = new Roll("1d" + list.length).evaluate().total - 1; - return list[index]; + return list[index]; } /* -------------------------------------------- */ - static _checkTMRCoord( x, y ) { - if (x >= 0 && x < 13 && y >= 0 && y < 14 ) return true; - if (x >= 0 && x < 13 && x%2 == 0 && y == 14 ) return true; + static _checkTMRCoord(x, y) { + if (x >= 0 && x < 13 && y >= 0 && y < 14) return true; + if (x >= 0 && x < 13 && x % 2 == 0 && y == 14) return true; return false; } /* -------------------------------------------- */ - static computeRealPictureCoordinates( coordXY, tmrConstants ) { + static computeRealPictureCoordinates(coordXY, tmrConstants) { let decallagePairImpair = (coordXY.x % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y; - return { + return { x: tmrConstants.gridx + (coordXY.x * tmrConstants.cellw), y: tmrConstants.gridy + (coordXY.y * tmrConstants.cellh) + decallagePairImpair } } /* -------------------------------------------- */ - static getSortReserveList( reserveList, coordTMR ) { + static getSortReserveList(reserveList, coordTMR) { // TODO : Gérer les têtes spéciales réserve! let sortReserveList let tmrDescr = this.getTMR(coordTMR); //console.log("Sort réserve : ", tmrDescr); - if ( tmrDescr.type == 'fleuve') { // Gestion de la reserve en Fleuve - sortReserveList = reserveList.filter(it => TMRUtility.getTMR(it.coord).type == 'fleuve' ); + if (tmrDescr.type == 'fleuve') { // Gestion de la reserve en Fleuve + sortReserveList = reserveList.filter(it => TMRUtility.getTMR(it.coord).type == 'fleuve'); } else { // Reserve sur un case "normale" - sortReserveList = reserveList.filter(it => it.coord == coordTMR); + sortReserveList = reserveList.filter(it => it.coord == coordTMR); } //console.log("Sort réserve : ", tmrDescr, sortReserve, reserveList); return sortReserveList; @@ -417,18 +465,18 @@ export class TMRUtility { return TMRUtility.getTMRArea(centerCoord, portee, tmrConstants); } - static getTMRArea( centerCoord, distance, tmrConstants ) { - let centerPos = this.convertToCellPos( centerCoord ); - let posPic = this.computeRealPictureCoordinates( centerPos, tmrConstants ); + static getTMRArea(centerCoord, distance, tmrConstants) { + let centerPos = this.convertToCellPos(centerCoord); + let posPic = this.computeRealPictureCoordinates(centerPos, tmrConstants); let caseList = []; - for (let dx=-distance; dx<=distance; dx++ ) { // Loop thru lines - for (let dy=-distance; dy<=distance; dy++ ) { // Loop thru lines - const currentPos = { x: centerPos.x+dx, y: centerPos.y+dy }; - if ( this._checkTMRCoord(currentPos.x, currentPos.y) ) { // Coordinate is valie - let posPicNow = this.computeRealPictureCoordinates( currentPos, tmrConstants ); - let dist = Math.sqrt(Math.pow(posPicNow.x - posPic.x,2) + Math.pow(posPicNow.y - posPic.y, 2)) / tmrConstants.cellw; - if ( dist < distance+0.5) { - caseList.push( this.convertToTMRCoord(currentPos) ); // Inside the area + for (let dx = -distance; dx <= distance; dx++) { // Loop thru lines + for (let dy = -distance; dy <= distance; dy++) { // Loop thru lines + const currentPos = { x: centerPos.x + dx, y: centerPos.y + dy }; + if (this._checkTMRCoord(currentPos.x, currentPos.y)) { // Coordinate is valie + let posPicNow = this.computeRealPictureCoordinates(currentPos, tmrConstants); + let dist = Math.sqrt(Math.pow(posPicNow.x - posPic.x, 2) + Math.pow(posPicNow.y - posPic.y, 2)) / tmrConstants.cellw; + if (dist < distance + 0.5) { + caseList.push(this.convertToTMRCoord(currentPos)); // Inside the area } } } diff --git a/templates/chat-fleuve-tmr.html b/templates/chat-fleuve-tmr.html new file mode 100644 index 00000000..9cc96e2a --- /dev/null +++ b/templates/chat-fleuve-tmr.html @@ -0,0 +1,30 @@ +{{competence.name}} +

+ {{alias}} tente de maîtriser {{le tmr.genre}} {{tmr.label}} ({{tmr.coord}}) +

+{{#if previous}} + {{#each previous as |rolled key|}} + {{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}} +
Double résistance du fleuve! + {{/each}} +{{/if}} +{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}} +
+ +{{#if rolled.isSuccess}} + Vous avez maîtrisé {{le tmr.genre}} {{#if (eq tmr.type 'fleuve')}}Fleuve de l'Oubli{{else}}{{tmr.label}}{{/if}} ! + {{else}} + Vous ne parvenez pas à surmonter {{le tmr.genre}} {{#if (eq tmr.type 'fleuve')}}Fleuve de l'Oubli{{else}}{{tmr.label}}{{/if}}. + Vous quittez les Terres Médianes ! + {{#if souffle}} +
De plus, votre échec total vous fait subir un Souffle de Dragon : {{souffle.name}} + {{/if}} +{{/if}} +
+{{#if poesie}} +
+ + {{{poesie.extrait}}} +

{{poesie.reference}}

+
+{{/if}} diff --git a/templates/dialog-roll-tmr-humide.html b/templates/dialog-roll-tmr-humide.html new file mode 100644 index 00000000..314668dc --- /dev/null +++ b/templates/dialog-roll-tmr-humide.html @@ -0,0 +1,28 @@ + +
+ + + + + + + +
+ {{>"systems/foundryvtt-reve-de-dragon/templates/dialog-roll-surenc.html"}} +
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/templates/item-meditation-sheet.html b/templates/item-meditation-sheet.html index 1893346e..0b484acb 100644 --- a/templates/item-meditation-sheet.html +++ b/templates/item-meditation-sheet.html @@ -50,20 +50,7 @@
diff --git a/templates/item-sort-sheet.html b/templates/item-sort-sheet.html index 728b0d73..a77801a0 100644 --- a/templates/item-sort-sheet.html +++ b/templates/item-sort-sheet.html @@ -21,6 +21,7 @@ diff --git a/templates/sort-tmr.html b/templates/sort-tmr.html index c716adbc..0231eb92 100644 --- a/templates/sort-tmr.html +++ b/templates/sort-tmr.html @@ -2,7 +2,7 @@ - + @@ -12,4 +12,4 @@ - + From 2af358b924802e9d5cc60cfd8f5725af37a370d8 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 6 Feb 2021 23:53:14 +0100 Subject: [PATCH 14/26] =?UTF-8?q?Am=C3=A9lioration=20message=20dormir=20un?= =?UTF-8?q?e=20heure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/module/actor.js b/module/actor.js index 4a076fd8..0d9cbc42 100644 --- a/module/actor.js +++ b/module/actor.js @@ -470,7 +470,7 @@ export class RdDActor extends Actor { async dormir(heures = 1) { let message = { whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), - content: this.name +": Vous dormez " + heures + " heure" + (heures > 1 ? "s" : "") + content: this.name +": Vous dormez " + heures + (heures > 1 ? " heures. " : "heure. ") }; await this.recupereEndurance(message); for (let i = 0; i < heures; i++) { @@ -495,7 +495,7 @@ export class RdDActor extends Actor { if (ethylisme.value < 1) { ethylisme.value = Math.min(ethylisme.value + 1, 1); if (ethylisme.value <= 0) { - message.content += `
Vous dégrisez un peu (${RdDUtility.getNomEthylisme(ethylisme.value)})`; + message.content += `Vous dégrisez un peu (${RdDUtility.getNomEthylisme(ethylisme.value)}). `; } } await this.update({ "data.compteurs.ethylisme": ethylisme }); @@ -506,7 +506,7 @@ export class RdDActor extends Actor { const manquant = this._computeEnduranceMax() - this.data.data.sante.endurance.value; if (manquant > 0) { await this.santeIncDec("endurance", manquant); - message.content += "
Vous récuperez " + manquant + " points d'endurance"; + message.content += "Vous récuperez " + manquant + " points d'endurance. "; } } @@ -515,14 +515,14 @@ export class RdDActor extends Actor { let fatigue = duplicate(this.data.data.sante.fatigue) const fatigueMin = this._computeFatigueMin(); if (fatigue.value <= fatigueMin) { - message.content += "
Vous êtes déjà reposé"; + message.content += "Vous êtes déjà reposé. "; return; } fatigue.value = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue.value)); console.log("recupererFatigue", fatigue) await this.update({ "data.sante.fatigue": fatigue }); if (fatigue.value == 0) { - message.content += "
Vous êtes bien reposé"; + message.content += "Vous êtes complêtement reposé. "; } } @@ -551,18 +551,18 @@ export class RdDActor extends Actor { const seuil = this.data.data.reve.seuil.value; const reveActuel = this.getReveActuel(); if (reveActuel >= seuil) { - message.content += `
Vous avez suffisament rêvé (seuil ${seuil}, rêve actuel ${reveActuel})`; + message.content += `Vous avez suffisament rêvé, au delà de votre seuil. `; } else { let deRecuperation = (await DeDraconique.ddr("selfroll")).total; console.log("recuperationReve", deRecuperation); if (deRecuperation >= 7) { // Rêve de Dragon ! - message.content += `
Vous faites un Rêve de Dragon de ${deRecuperation} Points de rêve`; - /*message.content += */await this.combattreReveDeDragon(deRecuperation); + message.content += `Vous faites un Rêve de Dragon de ${deRecuperation} Points de rêve! `; + await this.combattreReveDeDragon(deRecuperation); } else { - message.content += `
Vous récupérez ${deRecuperation} Points de rêve`; + message.content += `Vous récupérez ${deRecuperation} Points de rêve. `; await this.reveActuelIncDec(deRecuperation); } } From ae3766f99b56d637c8af8d8baa2ebbb7ce179862 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 6 Feb 2021 23:58:15 +0100 Subject: [PATCH 15/26] =?UTF-8?q?R=C3=AAve=20de=20Dragon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 64 ++++++++++++++++--- module/poetique.js | 69 +++++++++++++++++++++ module/rdd-rolltables.js | 4 +- module/rdd-tmr-dialog.js | 15 +++-- module/tmr-rencontres.js | 10 +-- module/tmr-utility.js | 2 +- templates/chat-resultat-reve-de-dragon.html | 28 +++++++++ templates/dialog-roll-reve-de-dragon.html | 12 ++++ 8 files changed, 178 insertions(+), 26 deletions(-) create mode 100644 module/poetique.js create mode 100644 templates/chat-resultat-reve-de-dragon.html create mode 100644 templates/dialog-roll-reve-de-dragon.html diff --git a/module/actor.js b/module/actor.js index 0d9cbc42..853cebc8 100644 --- a/module/actor.js +++ b/module/actor.js @@ -22,6 +22,8 @@ import { StatusEffects } from "./status-effects.js"; import { RdDItemCompetenceCreature } from "./item-competencecreature.js"; import { ReglesOptionelles } from "./regles-optionelles.js"; import { RdDItem } from "./item.js"; +import { TMRRencontres } from "./tmr-rencontres.js"; +import { Poetique } from "./poetique.js"; /* -------------------------------------------- */ @@ -580,15 +582,57 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async combattreReveDeDragon(force) { - let draconic = this.getBestDraconic(); - let niveau = Math.max(0, draconic.data.niveau); - let etat = this.getEtatGeneral(); - let difficulte = niveau - etat - force; - let reveActuel = this.getReveActuel(); - let rolled = await RdDResolutionTable.roll(reveActuel, difficulte); - // TODO: xp particulière - console.log("combattreReveDeDragon", rolled); - return await this.appliquerReveDeDragon(rolled, force); + let rollData = { + actor: this, + competence: duplicate(this.getBestDraconic()), + canClose: false, + rencontre: duplicate(TMRRencontres.getRencontre('rdd')), + tmr: true, + use: {libre: false, conditions: false}, + forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: this.getReveActuel() } } + } + rollData.rencontre.force = force; + rollData.competence.data.defaut_carac = 'reve-actuel'; + + const dialog = await RdDRoll.create(this, rollData, + { + html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-reve-de-dragon.html', + options: { height: 400 } + }, + { + name: 'maitrise', + label: 'Maîtriser le Rêve de Dragon', + callbacks: [ + this.createCallbackExperience(), + { action: r => this.resultCombatReveDeDragon(r) } + ] + } + ); + dialog.render(true); + } + + async resultCombatReveDeDragon(rollData) { + rollData.queues = []; + if (rollData.rolled.isEchec) { + rollData.queues.push(await this.ajouterQueue()); + } + if (rollData.rolled.isETotal) { + rollData.queues.push(await this.ajouterQueue()); + } + if (rollData.rolled.isSuccess) { + await this.updatePointDeSeuil(); + await this.reveActuelIncDec(rollData.rencontre.force); + } + if (rollData.rolled.isPart) { + // TODO: un dialogue pour demander le type de tête? + rollData.tete = true; + } + rollData.poesie = Poetique.getExtrait(); + + ChatMessage.create({ + whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.html`, rollData) + }); } /* -------------------------------------------- */ @@ -1074,7 +1118,7 @@ export class RdDActor extends Actor { content: this.name + " subit une Queue de Dragon : " + queue.name }); } - return queue.name; + return queue; } /* -------------------------------------------- */ diff --git a/module/poetique.js b/module/poetique.js new file mode 100644 index 00000000..dcbb15f1 --- /dev/null +++ b/module/poetique.js @@ -0,0 +1,69 @@ + +const poesieHautReve = [ + { + reference: 'Le Ratier Bretonien', + extrait: `Le courant du Fleuve +
Te domine et te Porte +
Avant que tu te moeuves +
Combat le, ou il t'emporte` + }, + { + reference: 'Incompatibilité, Charles Beaudelaire', + extrait: `Et lorsque par hasard une nuée errante +
Assombrit dans son vol le lac silencieux, +
On croirait voir la robe ou l'ombre transparente +
D'un esprit qui voyage et passe dans les cieux.` + }, + { + reference: 'Au fleuve de Loire, Joachim du Bellay', + extrait: `Ô de qui la vive course +
Prend sa bienheureuse source, +
D’une argentine fontaine, +
Qui d’une fuite lointaine, +
Te rends au sein fluctueux +
De l’Océan monstrueux` + }, + { + reference: 'Denis Gerfaud', + extrait: `Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli. + Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos. + Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli, + sinon peut-être lui-même, ou peut-être Thanatos` }, + { + reference: 'Denis Gerfaud', + extrait: `Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure + Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir. + Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli` + }, + { + reference: 'Denis Gerfaud', + extrait: `Narcos engendre le fils dont il est la mère à l'heure du Vaisseau, + car Oniros s'embarque pour redescendre le Fleuve + vers son père Hypnos sur la Voie de l'Oubli` + }, + { + reference: 'Denis Gerfaud', + extrait: `Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car + tel les serpents, Oniros commence à remonter le Fleuve + sur le Voie du Souvenir vers son père Narcos` + }, + { + reference: 'Denis Gerfaud', + extrait: `Ainsi se cuccèdent les Jours et les Ages. Les jours des Dragons sont les Ages des Hommes` + }, + { + reference: 'Denis Gerfaud', + extrait: `Ainsi parlent les sages: + «Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros + Les Dragons ne sont pas les maîtres de leurs rêvezs, car ils ne sont pas maîtres d'Oniros. + Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. + Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»` + }, +] + +export class Poetique { + static getExtrait(){ + return poesieHautReve[new Roll("1d" + poesieHautReve.length).evaluate().total - 1] + } + +} \ No newline at end of file diff --git a/module/rdd-rolltables.js b/module/rdd-rolltables.js index c0152062..629a180a 100644 --- a/module/rdd-rolltables.js +++ b/module/rdd-rolltables.js @@ -41,9 +41,9 @@ export class RdDRollTables { /* -------------------------------------------- */ static async getQueue(toChat = false) { - let queue = await RdDRollTables.drawItemFromRollTable("Queues de dragon", toChat); + let queue = await RdDRollTables.drawItemFromRollTable("Queues de dragon", toChat); if (queue.name.toLowerCase().includes('lancinant') ) { - queue = await RdDRollTables.drawItemFromRollTable("Désirs lancinants", toChat); + queue = await RdDRollTables.drawItemFromRollTable("Désirs lancinants", toChat); } if (queue.name.toLowerCase().includes('fixe') ) { queue = await RdDRollTables.drawItemFromRollTable("Idées fixes", toChat); diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index a3b1b18e..298a12a5 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -4,13 +4,14 @@ */ import { RollDataAjustements } from "./rolldata-ajustements.js"; import { RdDUtility } from "./rdd-utility.js"; -import { poesieCaseHumide, TMRUtility } from "./tmr-utility.js"; +import { TMRUtility } from "./tmr-utility.js"; import { tmrConstants } from "./tmr-utility.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js"; import { TMRRencontres } from "./tmr-rencontres.js"; import { ChatUtility } from "./chat-utility.js"; import { RdDRoll } from "./rdd-roll.js"; +import { Poetique } from "./poetique.js"; /* -------------------------------------------- */ @@ -373,9 +374,9 @@ export class RdDTMRDialog extends Dialog { tmr: tmr, canClose: false, diffLibre: -7, - forceCarac: { "reveactuel": { label: "Rêve Actuel", value: this.actor.getReveActuel() } } + forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: this.actor.getReveActuel() } } } - rollData.competence.data.defaut_carac = "reveactuel"; + rollData.competence.data.defaut_carac = 'reve-actuel'; await this._rollMaitriseCaseHumide(rollData); } @@ -437,12 +438,10 @@ export class RdDTMRDialog extends Dialog { return; } } - rollData.poesie = poesieCaseHumide[new Roll("1d" + poesieCaseHumide.length).evaluate().total - 1]; - const whisperTo = ChatUtility.getWhisperRecipientsAndGMs(game.user.name); - const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fleuve-tmr.html`, rollData); + rollData.poesie = Poetique.getExtrait(); ChatMessage.create({ - whisper: whisperTo, - content: content + whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fleuve-tmr.html`, rollData) }); if (rollData.rolled.isEchec) { this.close(); diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js index 6d55b615..b70d49d3 100644 --- a/module/tmr-rencontres.js +++ b/module/tmr-rencontres.js @@ -253,8 +253,8 @@ const mauvaisesRencontres = [ { code: "reflet+4", name: "Reflet d'ancien Rêve", type: "reflet", genre: "m", force: "2d6+4", refoulement: 2, isPersistant: true, isMauvaise: true }, { code: "tbblanc+4", name: "Tourbillon blanc", type: "tbblanc", genre: "m", force: "2d6+4", refoulement: 2, isPersistant: true, isMauvaise: true }, { code: "tbnoir+4", name: "Tourbillon noir", type: "tbnoir", genre: "m", force: "2d8+4", refoulement: 2, isPersistant: true, isMauvaise: true }, - { code: "passfou2d8", name: "Passeur fou", type: "passeurfou", genre: "m", force: "2d8", refoulement: 2, isMauvaise: true }, - { code: "tbrouge2d8", name: "Tourbillon rouge", type: "tbrouge", genre: "m", force: "2d8", refoulement: 3, isPersistant: true, isMauvaise: true } + { code: "passfou", name: "Passeur fou", type: "passeurfou", genre: "m", force: "2d8", refoulement: 2, isMauvaise: true }, + { code: "tbrouge", name: "Tourbillon rouge", type: "tbrouge", genre: "m", force: "2d8", refoulement: 3, isPersistant: true, isMauvaise: true } ] /* -------------------------------------------- */ @@ -472,14 +472,14 @@ export class TMRRencontres { } static async onPostSuccessReveDeDragon(tmrDialog, data) { - await data.actor.appliquerReveDeDragon(data.rolled, data.rencontre.force); if (data.rolled.isPart) { await data.actor.appliquerExperience(data.rolled, 'reve', data.competence); } + await data.actor.resultCombattreReveDeDragon(data.rolled); } - + static async onPostEchecReveDeDragon(tmrDialog, data) { - await data.actor.appliquerReveDeDragon(data.rolled, data.rencontre.force); + await data.actor.resultCombattreReveDeDragon(data.rolled); tmrDialog.close(); } } diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 34c32967..33f5e1da 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -227,7 +227,7 @@ export const TMRType = { desolation: { name: "désolation", genre: "f" } } -export const poesieCaseHumide = [ +export const poesieHautReve = [ { reference: 'Le Ratier Bretonien', extrait: `Le courant du Fleuve diff --git a/templates/chat-resultat-reve-de-dragon.html b/templates/chat-resultat-reve-de-dragon.html new file mode 100644 index 00000000..f1aa7992 --- /dev/null +++ b/templates/chat-resultat-reve-de-dragon.html @@ -0,0 +1,28 @@ +Rêve de Dragon +

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

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

{{poesie.reference}}

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

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

+
+
+
+
+
+
+ + + \ No newline at end of file From 4d775c97f686f61bfed86b6084a7499e2d0e1c94 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 6 Feb 2021 23:58:58 +0100 Subject: [PATCH 16/26] Fix carac Action physiques --- module/rdd-carac.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/module/rdd-carac.js b/module/rdd-carac.js index ae9cdf26..db39b5e4 100644 --- a/module/rdd-carac.js +++ b/module/rdd-carac.js @@ -1,3 +1,5 @@ +import { Grammar } from "./grammar.js"; + export class RdDCarac { static isAgiliteOuDerivee(selectedCarac) { @@ -25,6 +27,6 @@ export class RdDCarac { * ainsi que de Perception active et volontaire. */ static isActionPhysique(selectedCarac) { - return selectedCarac?.label.match(/(Apparence|Force|Agilité|Dextérité|Vue|Ouïe|Odorat-Goût|Empathie|Mêlée|Tir|Lancer|Dérobée)/); + return Grammar.toLowerCaseNoAccent(selectedCarac?.label).match(/(apparence|force|agilite|dexterite|vue|ouie|odorat|empathie|melee|tir|lancer|derobee)/); } } \ No newline at end of file From 43218dd282a11f8e079c03637130c54e481da73f Mon Sep 17 00:00:00 2001 From: sladecraven Date: Sun, 7 Feb 2021 20:36:34 +0100 Subject: [PATCH 17/26] #149 Gestion des ombres pour Thanatos --- module/actor.js | 12 +++++++----- system.json | 4 ++-- template.json | 5 +++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/module/actor.js b/module/actor.js index 853cebc8..29799b07 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1101,12 +1101,12 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async ajouterQueue(options = { chat: false }) { - // TODO: Déterminer si Thanatos a été utilisé? => laisser le joueur ne pas choisir Thanatos => choisir sa voie? - let utiliseThanatos = false; let queue; - if (utiliseThanatos) { + if (this.data.data.reve.reve.thanatosused) { queue = await RdDRollTables.getOmbre(); - // mettre à jour: plus d'ombre en vue + let myReve = duplicate(this.data.data.reve.reve); + myReve.thanatosused = false; + await this.update({ "data.reve.reve": myReve } ); } else { queue = await RdDRollTables.getQueue(); @@ -1929,7 +1929,9 @@ export class RdDActor extends Actor { if (rollData.isSortReserve) { rollData.depenseReve++; } - + if ( rollData.competence.name.includes('Thanatos')) { // Si Thanatos + myReve.thanatosused = true; + } if (myReve.value > rollData.depenseReve) { // Incrémenter/gére le bonus de case RdDItemSort.incrementBonusCase(this, selectedSort, rollData.coord); diff --git a/system.json b/system.json index f3659a30..fed85608 100644 --- a/system.json +++ b/system.json @@ -2,11 +2,11 @@ "name": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", "description": "Rêve de Dragon RPG for FoundryVTT", - "version": "1.3.16", + "version": "1.3.17", "manifestPlusVersion": "1.0.0", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.9", - "templateVersion": 92, + "templateVersion": 93, "author": "LeRatierBretonnien", "authors": [ { diff --git a/template.json b/template.json index 63e222ae..17852e84 100644 --- a/template.json +++ b/template.json @@ -435,7 +435,8 @@ "reve": { "max": 0, "value": 10, - "label": "Points de Rêve actuels" + "label": "Points de Rêve actuels", + "thanatosused": false }, "seuil": { "max": 0, @@ -467,7 +468,7 @@ }, "ombres": { "list": [] - } + } }, "compteurs": { "sust": { From 54a937c6206e977968afa4ff0a5dc5039319b579 Mon Sep 17 00:00:00 2001 From: sladecraven Date: Mon, 8 Feb 2021 14:15:18 +0100 Subject: [PATCH 18/26] #151 : permission de supprimer une rencontre depuis la fiche de PJ --- module/actor-sheet.js | 10 ++++++++-- module/actor.js | 11 +++++++++++ module/rdd-calendrier.js | 3 ++- module/rdd-tmr-dialog.js | 2 ++ system.json | 2 +- templates/actor-sheet.html | 15 +++++++++++++++ 6 files changed, 39 insertions(+), 4 deletions(-) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index eb2c0bdd..15d2eb2f 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -124,6 +124,7 @@ export class RdDActorSheet extends ActorSheet { RdDUtility.filterItemsPerTypeForSheet(data); data.data.sortReserve = data.data.reve.reserve.list; + data.data.rencontres = duplicate(data.data.reve.rencontre.list); data.data.caseSpeciales = data.itemsByType['casetmr']; RdDUtility.buildArbreDeConteneur(this, data); data.data.surEncombrementMessage = (data.data.compteurs.surenc.value < 0) ? "Sur-Encombrement!" : ""; @@ -189,18 +190,23 @@ export class RdDActorSheet extends ActorSheet { // Everything below here is only needed if the sheet is editable if (!this.options.editable) return; - // Update Inventory Item html.find('.item-edit').click(ev => { const li = $(ev.currentTarget).parents(".item"); const item = this.actor.getOwnedItem(li.data("item-id")); item.sheet.render(true); }); + // Update Inventory Item + html.find('.rencontre-delete').click(ev => { + const li = $(ev.currentTarget).parents(".item"); + const rencontreKey = li.data("item-id"); + this.actor.deleteTMRRencontre(rencontreKey); + }); // Delete Inventory Item html.find('.item-delete').click(ev => { const li = $(ev.currentTarget).parents(".item"); RdDUtility.confirmerSuppression(this, li); - }); + }); html.find('.subacteur-delete').click(ev => { const li = $(ev.currentTarget).parents(".item"); RdDUtility.confirmerSuppressionSubacteur(this, li); diff --git a/module/actor.js b/module/actor.js index 29799b07..4b7499c4 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1189,6 +1189,17 @@ export class RdDActor extends Actor { } } + /* -------------------------------------------- */ + async deleteTMRRencontre(rencontreKey) { + let list = duplicate(this.data.data.reve.rencontre.list); + let newList = []; + for (let i = 0; i < list.length; i++) { + if ( i != rencontreKey) + newList.push( list[i]); + } + await this.update({ "data.reve.rencontre.list": newList }); + } + /* -------------------------------------------- */ async updateCoordTMR(coord) { let tmrPos = duplicate(this.data.data.reve.tmrpos); diff --git a/module/rdd-calendrier.js b/module/rdd-calendrier.js index d0f7c47b..705317b6 100644 --- a/module/rdd-calendrier.js +++ b/module/rdd-calendrier.js @@ -79,7 +79,8 @@ export class RdDCalendrier extends Application { } /* -------------------------------------------- */ - getDateFromIndex( index ) { + getDateFromIndex( index = undefined ) { + if ( !index) index = this.getCurrentDayIndex(); let month = Math.floor(index / 28); let day = (index - (month*28)) + 1; return day+" "+heuresList[month]; diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 298a12a5..924b020a 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -321,6 +321,8 @@ export class RdDTMRDialog extends Dialog { isMauvaise ? await TMRRencontres.getMauvaiseRencontre() : await TMRRencontres.getRencontreAleatoire(tmr.type); rencontre.coord = tmr.coord; + rencontre.date = game.system.rdd.calendrier.getDateFromIndex(); + rencontre.heure = game.system.rdd.calendrier.getCurrentHeure(); return rencontre; } diff --git a/system.json b/system.json index fed85608..e0db5a9b 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", "description": "Rêve de Dragon RPG for FoundryVTT", - "version": "1.3.17", + "version": "1.3.18", "manifestPlusVersion": "1.0.0", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.9", diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index fddb959a..169ba52e 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -546,6 +546,7 @@
+ {{!-- Liste de blessures --}}

Blessures:

@@ -824,6 +825,20 @@ {{/each}}
+
+
+

Rencontres présentes:

+ +
{{!-- Queues, Souffles, Tetes, Ombre --}}
From 375d452e7e202858f6df0cec94885f499cd4cb7c Mon Sep 17 00:00:00 2001 From: sladecraven Date: Mon, 8 Feb 2021 16:14:43 +0100 Subject: [PATCH 19/26] =?UTF-8?q?Modifier=20la=20loc=20pour=20les=20cr?= =?UTF-8?q?=C3=A9atures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 2 +- module/rdd-utility.js | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/module/actor.js b/module/actor.js index 4b7499c4..42b9f87c 100644 --- a/module/actor.js +++ b/module/actor.js @@ -2646,7 +2646,7 @@ export class RdDActor extends Actor { let encaissement = RdDUtility.selectEncaissement(jetTotal, rollData.dmg.mortalite) let over20 = Math.max(jetTotal - 20, 0); encaissement.dmg = rollData.dmg; - encaissement.dmg.loc = rollData.dmg.loc ?? RdDUtility.getLocalisation(); + encaissement.dmg.loc = rollData.dmg.loc ?? RdDUtility.getLocalisation( this.data.type ); encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;' encaissement.roll = roll; encaissement.armure = armure; diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 6fdc870e..086b1519 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -578,18 +578,23 @@ export class RdDUtility { } /* -------------------------------------------- */ - static getLocalisation() { - // TODO: bouger dans une RollTable du compendium et chercher dans les RoolTable puis compendium pour permettre le changement? + static getLocalisation( type = 'personnage' ) { let result = new Roll("1d20").roll().total; let txt = "" - if (result <= 3) txt = "Jambe, genou, pied, jarret"; - else if (result <= 7) txt = "Hanche, cuisse, fesse"; - else if (result <= 9) txt = "Ventre, reins"; - else if (result <= 12) txt = "Poitrine, dos"; - else if (result <= 14) txt = "Avant-bras, main, coude"; - else if (result <= 18) txt = "Epaule, bras, omoplate"; - else if (result == 19) txt = "Tête"; - else if (result == 20) txt = "Tête (visage)"; + 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"; + else if (result <= 12) txt = "Poitrine, dos"; + else if (result <= 14) txt = "Avant-bras, main, coude"; + else if (result <= 18) txt = "Epaule, bras, omoplate"; + else if (result == 19) txt = "Tête"; + else if (result == 20) txt = "Tête (visage)"; + } else { + if (result <= 7) txt = "Jambes/Pattes"; + else if (result <= 18) txt = "Corps"; + else if (result <= 20) txt = "Tête"; + } return { result: result, label: txt }; } From c31306f15470ea9946fdbc31c22b0a16c5fd4c11 Mon Sep 17 00:00:00 2001 From: sladecraven Date: Mon, 8 Feb 2021 22:51:31 +0100 Subject: [PATCH 20/26] =?UTF-8?q?#156=20Drag&Drop=20de=20comp=C3=A9tences/?= =?UTF-8?q?armes/acteur/journal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/rdd-hotbar-drop.js | 84 +++++++++++++++++++++++++++++++++++++++ module/rdd-main.js | 5 ++- system.json | 2 +- 3 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 module/rdd-hotbar-drop.js diff --git a/module/rdd-hotbar-drop.js b/module/rdd-hotbar-drop.js new file mode 100644 index 00000000..12b925bb --- /dev/null +++ b/module/rdd-hotbar-drop.js @@ -0,0 +1,84 @@ + +export class RdDHotbar { + + /** + * Create a macro when dropping an entity on the hotbar + * Item - open roll dialog for item + * Actor - open actor sheet + * Journal - open journal sheet + */ + static initDropbar( ) { + + Hooks.on("hotbarDrop", async (bar, data, slot) => { + // Create item macro if rollable item - weapon, spell, prayer, trait, or skill + if (data.type == "Item") { + if (data.data.type != "arme" && data.data.type != "competence" ) + return + let item = data.data + let command = `game.system.rdd.RdDHotbar.rollMacro("${item.name}", "${item.type}");`; + let macro = game.macros.entities.find(m => (m.name === item.name) && (m.command === command)); + if (!macro) { + macro = await Macro.create({ + name: item.name, + type: "script", + img: item.img, + command: command + }, { displaySheet: false }) + } + game.user.assignHotbarMacro(macro, slot); + } + // Create a macro to open the actor sheet of the actor dropped on the hotbar + else if (data.type == "Actor") { + let actor = game.actors.get(data.id); + let command = `game.actors.get("${data.id}").sheet.render(true)` + let macro = game.macros.entities.find(m => (m.name === actor.name) && (m.command === command)); + if (!macro) { + macro = await Macro.create({ + name: actor.data.name, + type: "script", + img: actor.data.img, + command: command + }, { displaySheet: false }) + game.user.assignHotbarMacro(macro, slot); + } + } + // Create a macro to open the journal sheet of the journal dropped on the hotbar + else if (data.type == "JournalEntry") { + let journal = game.journal.get(data.id); + let command = `game.journal.get("${data.id}").sheet.render(true)` + let macro = game.macros.entities.find(m => (m.name === journal.name) && (m.command === command)); + if (!macro) { + macro = await Macro.create({ + name: journal.data.name, + type: "script", + img: "systems/wfrp4e/icons/buildings/scroll.png", + command: command + }, { displaySheet: false }) + game.user.assignHotbarMacro(macro, slot); + } + } + return false; + }); + } + + /** Roll macro */ + static rollMacro(itemName, itemType, bypassData) { + const speaker = ChatMessage.getSpeaker(); + let actor; + if (speaker.token) actor = game.actors.tokens[speaker.token]; + if (!actor) actor = game.actors.get(speaker.actor); + let item = actor ? actor.items.find(i => i.name === itemName && i.type == itemType) : null; + if (!item) return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`); + + item = item.data; + + // Trigger the item roll + switch (item.type) { + case "arme": + return actor.rollArme(item.data.competence, itemName); + case "competence": + return actor.rollCompetence( itemName ); + } + } + +} diff --git a/module/rdd-main.js b/module/rdd-main.js index aab4d527..898b1ebe 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -27,6 +27,7 @@ import { StatusEffects } from "./status-effects.js"; import { RddCompendiumOrganiser } from "./rdd-compendium-organiser.js"; import { ReglesOptionelles } from "./regles-optionelles.js"; import { TMRRencontres } from "./tmr-rencontres.js"; +import { RdDHotbar } from "./rdd-hotbar-drop.js" /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -113,7 +114,8 @@ Hooks.once("init", async function () { // Create useful storage space game.system.rdd = { TMRUtility, - RdDUtility + RdDUtility, + RdDHotbar } /* -------------------------------------------- */ @@ -233,6 +235,7 @@ Hooks.once("init", async function () { ReglesOptionelles.init(); TMRUtility.init(); TMRRencontres.init(); + RdDHotbar.initDropbar(); }); /* -------------------------------------------- */ diff --git a/system.json b/system.json index e0db5a9b..ffb88e17 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", "description": "Rêve de Dragon RPG for FoundryVTT", - "version": "1.3.18", + "version": "1.3.19", "manifestPlusVersion": "1.0.0", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.9", From 62ad72338ae1e675c0d5460ed7ad1752f6834466 Mon Sep 17 00:00:00 2001 From: sladecraven Date: Tue, 9 Feb 2021 09:18:52 +0100 Subject: [PATCH 21/26] #154 - COmptage des utilisations --- module/actor.js | 23 +++++++++++++++ module/rdd-combat.js | 44 ++++++++++++++++++++++++++--- module/rdd-main.js | 3 +- templates/chat-demande-defense.html | 6 ++-- 4 files changed, 68 insertions(+), 8 deletions(-) diff --git a/module/actor.js b/module/actor.js index 42b9f87c..1cd7df78 100644 --- a/module/actor.js +++ b/module/actor.js @@ -2732,6 +2732,29 @@ export class RdDActor extends Actor { return data; } + /* -------------------------------------------- */ + async resetItemUse( ) { + await this.setFlag('foundryvtt-reve-de-dragon', 'itemUse', null ); + await this.setFlag('foundryvtt-reve-de-dragon', 'itemUse', {} ); + } + + /* -------------------------------------------- */ + async incItemUse( itemId ) { + let itemUse = this.getFlag('foundryvtt-reve-de-dragon', 'itemUse'); + itemUse = (itemUse) ? duplicate(itemUse) : {}; + itemUse[itemId] = (itemUse[itemId]) ? itemUse[itemId] + 1 : 1; + await this.setFlag( 'foundryvtt-reve-de-dragon', 'itemUse', itemUse); + console.log("ITEM USE INC", itemUse); + } + + /* -------------------------------------------- */ + getItemUse( itemId ) { + let itemUse = this.getFlag('foundryvtt-reve-de-dragon', 'itemUse'); + itemUse = (itemUse) ? itemUse : {}; + console.log("ITEM USE GET", itemUse); + return itemUse[itemId] ? itemUse[itemId] : 0; + } + /* -------------------------------------------- */ /* -- entites -- */ /* retourne true si on peut continuer, false si on ne peut pas continuer */ diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 6e313123..d7922600 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -9,6 +9,23 @@ import { RdDRoll } from "./rdd-roll.js"; import { RdDRollTables } from "./rdd-rolltables.js"; import { ReglesOptionelles } from "./regles-optionelles.js"; +/* -------------------------------------------- */ +export class RdDCombatManager extends Combat { + + /* -------------------------------------------- */ + cleanItemUse() { + for(let turn of this.turns) { + turn.actor.resetItemUse() + } + } + + /* -------------------------------------------- */ + async nextRound() { + console.log('New round !'); + this.cleanItemUse(); + } +} + /* -------------------------------------------- */ export class RdDCombat { @@ -39,13 +56,15 @@ export class RdDCombat { /* -------------------------------------------- */ static onUpdateCombat(combat, data) { if (combat.data.round != 0 && combat.turns && combat.data.active) { - RdDCombat.combatNouveauRound(combat); + RdDCombat.combatNouveauTour(combat); } + } /* -------------------------------------------- */ static onPreDeleteCombat(combat, options) { if (game.user.isGM) { + combat.cleanItemUse(); ChatUtility.removeChatMessageContaining(`
`) /* * TODO: support de plusieurs combats parallèles @@ -64,7 +83,7 @@ export class RdDCombat { } /* -------------------------------------------- */ - static combatNouveauRound(combat) { + static combatNouveauTour(combat) { let turn = combat.turns.find(t => t.tokenId == combat.current.tokenId); if (game.user.isGM) { // seul le GM notifie le status @@ -358,6 +377,7 @@ export class RdDCombat { let rollData = this._prepareAttaque(competence, arme); console.log("RdDCombat.attaque >>>", rollData); + this.attacker.incItemUse( arme._id ); // Usage const dialog = await RdDRoll.create(this.attacker, rollData, { @@ -457,15 +477,24 @@ export class RdDCombat { if (essaisPrecedents) { mergeObject(attackerRoll.essais, essaisPrecedents, { overwrite: true }); } + + // # utilisation esquive + let esquiveUsage = 0; + let esquive = this.defender.getCompetence("esquive"); + if (esquive) { + esquiveUsage = this.defender.getItemUse( esquive._id); + } + const paramChatDefense = { passeArme: attackerRoll.passeArme, essais: attackerRoll.essais, defender: this.defender, attacker: this.attacker, attackerId: this.attackerId, + esquiveUsage: esquiveUsage, defenderTokenId: this.defenderTokenId, mainsNues: attackerRoll.dmg.mortalite != 'mortel' && this.defender.getCompetence("Corps à corps"), - armes: this._filterArmesParade(this.defender.data.items, attackerRoll.competence, attackerRoll.arme), + armes: this._filterArmesParade(this.defender, attackerRoll.competence, attackerRoll.arme), diffLibre: attackerRoll.ajustements?.diffLibre?.value ?? 0, attaqueParticuliere: attackerRoll.particuliere, attaqueCategorie: attackerRoll.competence.data.categorie, @@ -510,8 +539,12 @@ export class RdDCombat { } /* -------------------------------------------- */ - _filterArmesParade(items, competence) { + _filterArmesParade(defender, competence) { + let items = defender.data.items; items = items.filter(item => RdDItemArme.isArmeUtilisable(item) || RdDItemCompetenceCreature.isCompetenceParade(item)); + for( let item of items) { + item.data.nbUsage = defender.getItemUse( item._id); // Ajout du # d'utilisation ce round + } switch (competence.data.categorie) { case 'tir': case 'lancer': @@ -575,6 +608,7 @@ export class RdDCombat { let arme = this.defender.getArmeParade(armeParadeId); console.log("RdDCombat.parade >>>", attackerRoll, armeParadeId, arme); + this.defender.incItemUse( armeParadeId ); // Usage let rollData = this._prepareParade(attackerRoll, arme); @@ -596,6 +630,7 @@ export class RdDCombat { dialog.render(true); } + /* -------------------------------------------- */ _prepareParade(attackerRoll, armeParade) { const compName = armeParade.data.competence; const armeAttaque = attackerRoll.arme; @@ -681,6 +716,7 @@ export class RdDCombat { } console.log("RdDCombat.esquive >>>", attackerRoll, esquive); let rollData = this._prepareEsquive(attackerRoll, esquive); + this.defender.incItemUse( esquive._id ); // Usage const dialog = await RdDRoll.create(this.defender, rollData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-competence.html' }, { diff --git a/module/rdd-main.js b/module/rdd-main.js index 898b1ebe..7bf9ebeb 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -20,7 +20,7 @@ import { RdDCalendrier } from "./rdd-calendrier.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDTokenHud } from "./rdd-token-hud.js"; import { RdDCommands } from "./rdd-commands.js"; -import { RdDCombat } from "./rdd-combat.js"; +import { RdDCombatManager, RdDCombat } from "./rdd-combat.js"; import { ChatUtility } from "./chat-utility.js"; import { RdDItemCompetence } from "./item-competence.js"; import { StatusEffects } from "./status-effects.js"; @@ -219,6 +219,7 @@ Hooks.once("init", async function () { Actors.registerSheet("foundryvtt-reve-de-dragon", RdDActorEntiteSheet, { types: ["entite"], makeDefault: true }); Items.unregisterSheet("core", ItemSheet); Items.registerSheet("foundryvtt-reve-de-dragon", RdDItemSheet, { makeDefault: true }); + CONFIG.Combat.entityClass = RdDCombatManager; // Handlebar function pour container Handlebars.registerHelper('buildConteneur', (objet) => { return RdDUtility.buildConteneur(objet); }); diff --git a/templates/chat-demande-defense.html b/templates/chat-demande-defense.html index 8b9b1ade..c9d2fe76 100644 --- a/templates/chat-demande-defense.html +++ b/templates/chat-demande-defense.html @@ -37,19 +37,19 @@ {{else}} {{#each armes as |arme key|}} - Parer avec {{arme.name}} à {{../diffLibre }} + Parer avec {{arme.name}} à {{../diffLibre }} (Utilisation : {{arme.data.nbUsage}})
{{/each}} {{#if mainsNues}} - Parer à mains nues à {{diffLibre}} + Parer à mains nues à {{diffLibre}} (Utilisation : {{arme.data.nbUsage}})
{{/if}} {{#if (ne attaqueCategorie 'tir')}} - Esquiver à {{diffLibre}} + Esquiver à {{diffLibre}} (Utilisation : {{esquiveUsage}})
{{/if}} From cddc6a8e9b6b567e8ead84a2d445eda999fa5d1a Mon Sep 17 00:00:00 2001 From: sladecraven Date: Tue, 9 Feb 2021 11:17:17 +0100 Subject: [PATCH 22/26] #157 Warning sur force insuffisante --- module/actor.js | 11 +++++++++++ module/rdd-combat.js | 1 + system.json | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/module/actor.js b/module/actor.js index 1cd7df78..6a0d0f62 100644 --- a/module/actor.js +++ b/module/actor.js @@ -2520,11 +2520,20 @@ export class RdDActor extends Actor { return undefined; } + /* -------------------------------------------- */ getArmeParade(armeParadeId) { const item = armeParadeId ? this.getOwnedItem(armeParadeId) : undefined; return RdDItemArme.getArmeData(item); } + /* -------------------------------------------- */ + verifierForceMin( item ) { + if ( item.type == 'arme' && item.data.force > this.data.data.carac.force.value ) { + ChatMessage.create( { content: `${this.name} s'est équipé(e) de l'arme ${item.name}, mais n'a pas une force suffisante pour l'utiliser normalement + (${item.data.force} nécessaire pour unr Force de ${this.data.data.carac.force.value})` } ); + } + } + /* -------------------------------------------- */ async equiperObjet(itemID) { let item = this.getOwnedItem(itemID); @@ -2533,6 +2542,8 @@ export class RdDActor extends Actor { await this.updateEmbeddedEntity("OwnedItem", update); this.computeEncombrementTotalEtMalusArmure(); // Mise à jour encombrement this.computePrixTotalEquipement(); // Mis à jour du prix total de l'équipement + if ( item.data.data.equipe ) + this.verifierForceMin( item.data ); } } diff --git a/module/rdd-combat.js b/module/rdd-combat.js index d7922600..300d8e67 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -378,6 +378,7 @@ export class RdDCombat { let rollData = this._prepareAttaque(competence, arme); console.log("RdDCombat.attaque >>>", rollData); this.attacker.incItemUse( arme._id ); // Usage + this.attacker.verifierForceMin( arme ); const dialog = await RdDRoll.create(this.attacker, rollData, { diff --git a/system.json b/system.json index ffb88e17..e1b9dfe4 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", "description": "Rêve de Dragon RPG for FoundryVTT", - "version": "1.3.19", + "version": "1.3.20", "manifestPlusVersion": "1.0.0", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.9", From 6675539c5900a4e32faeab12ee1ab3e1bf4d2de2 Mon Sep 17 00:00:00 2001 From: sladecraven Date: Wed, 10 Feb 2021 11:24:14 +0100 Subject: [PATCH 23/26] =?UTF-8?q?#140=20Permettre=20des=20jets=20de=20cara?= =?UTF-8?q?c=20d=C3=A9riv=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 2 +- module/chat-utility.js | 4 +++- module/rdd-main.js | 7 ++++++- module/rdd-utility.js | 9 ++++++++- templates/actor-sheet.html | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/module/actor.js b/module/actor.js index 6a0d0f62..d82abf96 100644 --- a/module/actor.js +++ b/module/actor.js @@ -2530,7 +2530,7 @@ export class RdDActor extends Actor { verifierForceMin( item ) { if ( item.type == 'arme' && item.data.force > this.data.data.carac.force.value ) { ChatMessage.create( { content: `${this.name} s'est équipé(e) de l'arme ${item.name}, mais n'a pas une force suffisante pour l'utiliser normalement - (${item.data.force} nécessaire pour unr Force de ${this.data.data.carac.force.value})` } ); + (${item.data.force} nécessaire pour une Force de ${this.data.data.carac.force.value})` } ); } } diff --git a/module/chat-utility.js b/module/chat-utility.js index be3c737b..d38514ca 100644 --- a/module/chat-utility.js +++ b/module/chat-utility.js @@ -4,12 +4,14 @@ */ export class ChatUtility { + /* -------------------------------------------- */ static onSocketMessage(sockmsg) { switch (sockmsg.msg) { case "msg_delete_chat_message": return ChatUtility.onRemoveMessages(sockmsg.part, sockmsg.gmId); } } + /* -------------------------------------------- */ static onRemoveMessages(part, gmId) { if (game.user._id == gmId) { const toDelete = game.messages.filter(it => it.data.content.includes(part)); @@ -107,5 +109,5 @@ export class ChatUtility { ChatMessage.create(data); } } - + } diff --git a/module/rdd-main.js b/module/rdd-main.js index 7bf9ebeb..ac026714 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -300,4 +300,9 @@ Hooks.on("chatMessage", (html, content, msg) => { /* -------------------------------------------- */ Hooks.on("getCombatTrackerEntryContext", (html, options) => { RdDUtility.pushInitiativeOptions(html, options); -}) +}); + +/* -------------------------------------------- */ +Hooks.on("renderChatMessage", async (app, html, msg) => { + RdDUtility.onRenderChatMessage(app, html, msg); +}); diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 086b1519..cd1b1c32 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -1024,7 +1024,7 @@ export class RdDUtility { } } - /* -------------------------------------------- */ + /*-------------------------------------------- */ static checkThanatosXP(compName) { 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."; @@ -1034,4 +1034,11 @@ export class RdDUtility { }); } } + + /*-------------------------------------------- */ + static async onRenderChatMessage( app, html, msg ) { + // TODO + //console.log(app, html, msg); + } + } diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 169ba52e..2ae3963d 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -128,7 +128,7 @@