forked from public/foundryvtt-reve-de-dragon
Compare commits
268 Commits
foundryvtt
...
foundryvtt
| Author | SHA1 | Date | |
|---|---|---|---|
| ab884713f6 | |||
| 940237852b | |||
| 78ee23da96 | |||
| 862a267683 | |||
| 2373acc295 | |||
| 249d171511 | |||
| 018b6a32dd | |||
| 44ec511aa6 | |||
| ff44de3b3c | |||
| 8101b905d8 | |||
| 27dd89024e | |||
| 69a653d1e5 | |||
| bea4124388 | |||
| e5bb2e9afc | |||
| 1d3ae9bb1a | |||
| d4be2957a3 | |||
| 6c9d03be92 | |||
| 5a50917730 | |||
| d285e866be | |||
| ece9ab6f64 | |||
| 038e922f0f | |||
| 728c5f2f8e | |||
| e6592f8333 | |||
| 42567e7ca0 | |||
| 9d1fe6d8fd | |||
| f5bd0f32f4 | |||
| fad29f9652 | |||
| 9d51631d5c | |||
| d1b73e7658 | |||
| 54158ee10d | |||
| e089bdf9c8 | |||
| 41ab593059 | |||
| 42ad4c5b26 | |||
| 85f8a716d4 | |||
| 47f305d865 | |||
| 407b4f82d9 | |||
| c950f568fd | |||
| 0ed90f6177 | |||
| b74fc27079 | |||
| a65d4511c5 | |||
| e61417c44e | |||
| 8ca725bd38 | |||
| 441a5965c7 | |||
| f08c8f93da | |||
| d28362bf14 | |||
| e506382d18 | |||
| c1cecc76b3 | |||
| f2a3e1db45 | |||
| b69359a47d | |||
| fe6c2e2ff2 | |||
| 9bd13a6021 | |||
| a29630f9a2 | |||
| c7fd9f7596 | |||
| 7b18fd25c3 | |||
| 5c256e2c49 | |||
| 1c475348d5 | |||
| de5d32f88f | |||
| 76a02d60ca | |||
| 724c556b9e | |||
| 7dfba94a11 | |||
| 928c7bbcfe | |||
| 222a06a978 | |||
| b4edaf8584 | |||
| 3c062afd56 | |||
| 6de4fff403 | |||
| 3543f081b2 | |||
| 56f14e12a2 | |||
| e226af5ac5 | |||
| d8be37a2ec | |||
| ba2d9de7b6 | |||
| 6b8fb3267a | |||
| 05d6f64a31 | |||
| c0570e58b4 | |||
| 8389d578bc | |||
| f05ef79b97 | |||
| d2a8bfae4f | |||
| d54834fa71 | |||
| c898bf5212 | |||
| a118dc7334 | |||
| 46401e5d63 | |||
| 7eb1d9f838 | |||
| 1d8f4ebb88 | |||
| 145a92f462 | |||
| 5148d02314 | |||
| 000c89b11a | |||
| 5d4a18aac5 | |||
| 34b5df637f | |||
| 22572ca98c | |||
| a6a1c1009e | |||
| 288cf9162c | |||
| 4b1381e535 | |||
| 78336a3f45 | |||
| 3001ae44de | |||
| a43ceb3188 | |||
| 9e95a44efd | |||
| 179ea0c85b | |||
| 3821b5bea1 | |||
| 2739c650d9 | |||
| b101d58bee | |||
| 0e3d721fc7 | |||
| e1e45a83be | |||
| 3b14e54829 | |||
| 615a3f1315 | |||
| ca72d088cc | |||
| ac89b948ca | |||
| f22c4d2ec8 | |||
| ffd80394d3 | |||
| 0959d1b18e | |||
| 24e58abfcc | |||
| 7d292c009d | |||
| 4bf075786c | |||
| a2a04ade4c | |||
| 2db6895c76 | |||
| e46f35ef92 | |||
| 9e050d3e12 | |||
| 81492f2857 | |||
| 959e751e48 | |||
| b6a124b57d | |||
| db2ca945a8 | |||
| 667d764db1 | |||
| 4273f5f48f | |||
| 6c4a8eb70f | |||
| eb029e8d66 | |||
| 9ee14b3b56 | |||
| 3203fae111 | |||
| 755301275b | |||
| f6d5dc9d7c | |||
| 5e9b47af1f | |||
| 18dfb36a78 | |||
| febccd508f | |||
| b147f8937b | |||
| 55a93b317a | |||
| 02a630152d | |||
| ad8ac0de77 | |||
| dceb6f026f | |||
| ad37ee1b8e | |||
| 4d40e2fe59 | |||
| 9d7e57d9fb | |||
| 717029e572 | |||
| d6f8976298 | |||
| 92e93cbbea | |||
| 994eaad9a9 | |||
| cfed7e2afa | |||
| 436f9e6fa4 | |||
| 18a50197cd | |||
| b6910612f8 | |||
| 4ba1ec8a2e | |||
| 75a0f7c322 | |||
| e2a9f55740 | |||
| 1e0788cde8 | |||
| c10195f753 | |||
| 4d7317b964 | |||
| 7b1fa009bb | |||
| 71bb8a14e1 | |||
| 5444bc7fd8 | |||
| debaf1da34 | |||
| 69e2ab9000 | |||
| 24218ed062 | |||
| da4e18dc3c | |||
| 154a9b7a37 | |||
| fb8189606b | |||
| cfbfad27bd | |||
| f541849306 | |||
| d2d1891838 | |||
| 5580b6d59c | |||
| 40c45c30de | |||
| 1b6c5256cc | |||
| c0e6759164 | |||
| a096590a07 | |||
| 9883048fb5 | |||
| 7bec42c4cf | |||
| 6708dc0da9 | |||
| 96c2da0d05 | |||
| 2b19250e8b | |||
| 957eabcac7 | |||
| 285937c201 | |||
| 93965ce91a | |||
| 18aba9adff | |||
| 0a5662ff71 | |||
| bf98e4eae2 | |||
| e32a1d25f6 | |||
| 327943c4aa | |||
| de56fa909a | |||
| 2aa62cffe9 | |||
| c57f140c54 | |||
| 9cf14f8b75 | |||
| b8e7b21e14 | |||
| c1d02d9fda | |||
| 23af30a538 | |||
| 4e1b663dec | |||
| c9d98c57da | |||
| 0aef139cf8 | |||
| 9c85293714 | |||
| ab1c04ae17 | |||
| a585e0faba | |||
| 50c730ba72 | |||
| 928a60f092 | |||
| e5c2f52b0e | |||
| f9391523f8 | |||
| 55434762f4 | |||
| 5e6ffc7846 | |||
| 3344e20936 | |||
| 5a66e4e741 | |||
| d329724d63 | |||
| 8a5405c9f5 | |||
| ea992aae46 | |||
| 0bfcfec58f | |||
| 88e00c59bc | |||
| d314dc39a0 | |||
| 30bb803da2 | |||
| dd79e16ea5 | |||
| 83e2d56fd4 | |||
| afc23dfa7b | |||
| 3e189cbe5f | |||
| d0475e8677 | |||
| a3694c1673 | |||
| 9e6d5856b1 | |||
| acc880b53f | |||
| 2598ae3489 | |||
| 4f5fb63751 | |||
| d739a7993a | |||
| 41335cd433 | |||
| e470d76ea0 | |||
| ffccc819f1 | |||
| 45bfc69b39 | |||
| 79e9358072 | |||
| 5cab418e62 | |||
| 7809f7c21a | |||
| 1bac204071 | |||
| 3bf5beb67b | |||
| ac1da6e979 | |||
| 67735197bc | |||
| f81dc9a5f5 | |||
| a563233d6b | |||
| 0c11013694 | |||
| 77cf72a752 | |||
| 42ed5da2d4 | |||
| 5fd3a43b2a | |||
| 1bb710ce83 | |||
| 80579032ea | |||
| a810e20eca | |||
| c6f0aaeba0 | |||
| 3c3be7409d | |||
| f97345e407 | |||
| 4cc50fc190 | |||
| 26967fe1cd | |||
| b23dcaace5 | |||
| 045ee76013 | |||
| 7fed3844b5 | |||
| b5571e6c7a | |||
| b5eac8ccfa | |||
| 673196c644 | |||
| 9741028914 | |||
| 10daab2bcd | |||
| 99d2d38279 | |||
| e30825db6b | |||
| 10ed4d9382 | |||
| 2ffa0d8dc7 | |||
| f229537206 | |||
| 5c31c7bd7f | |||
| 4cf428f630 | |||
| 0c1b70f3f0 | |||
| b7ea857bb4 | |||
| 0238976ce8 | |||
| 31fd91336a | |||
| c70b6c9d5f | |||
| 07d0d92f57 | |||
| a2968697f4 |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,5 +1,6 @@
|
|||||||
.vscode/settings.json
|
.vscode/settings.json
|
||||||
.idea
|
.idea
|
||||||
|
.history
|
||||||
todo.md
|
todo.md
|
||||||
/.vscode
|
/.vscode
|
||||||
/ignored/
|
/ignored/
|
||||||
@@ -7,3 +8,7 @@ todo.md
|
|||||||
/jsconfig.json
|
/jsconfig.json
|
||||||
/package.json
|
/package.json
|
||||||
/package-lock.json
|
/package-lock.json
|
||||||
|
/packs/*/
|
||||||
|
/packs/*/CURRENT
|
||||||
|
/packs/*/LOG
|
||||||
|
/packs/*/LOCK
|
||||||
|
|||||||
141
changelog.md
141
changelog.md
@@ -1,10 +1,137 @@
|
|||||||
==================================================================
|
# v11.0
|
||||||
v0.9.2 - 05/09/2020
|
## v11.1.1 - Les fumebols de Werther de Zloth
|
||||||
|
- Fix: on peut de nouveau afficher les vues détaillées
|
||||||
|
- Fix: on peut ouvrir les sacs et contenants portés par les véhicules et créatures
|
||||||
|
- Fix: cuisiner du gibier prend maintenant bien les proportaions en compte
|
||||||
|
|
||||||
Erreur de calcul sur points de vie
|
## v11.1.0 - Les choix de Werther de Zloth
|
||||||
Gestion différente des compétences "troncs"
|
- Les options suivantes peuvent être désactivées:
|
||||||
|
- La transformation de stress à Château Dormant
|
||||||
|
- La récuperation de chance à Château Dormant
|
||||||
|
- La récupération d'éthylisme
|
||||||
|
- La récupération de rêve (y compris fleurs de rêve et Rêves de Dragon: la rencontre a lieu, mais ne donne pas de rêve)
|
||||||
|
- Le jet de moral de Château Dormant
|
||||||
|
- Séparation des véhicules dans leur propre acteur
|
||||||
|
- Séparation des entités dans leur propre acteur
|
||||||
|
- Séparation des créatures dans leur propre acteur
|
||||||
|
- La fenêtre de signes draconiques ne sélectionne plus tout les haut-rêvants par défaut
|
||||||
|
- Un nouveau personnage a automatiquement son token relié
|
||||||
|
- corrections de bugs
|
||||||
|
- si on n'utilise pas les règles de fatigues, un reflet de rêve pouvait garder le Haut-rêvant dans les TMRs pour toujours
|
||||||
|
- certaines macros ne marchaient pas pour les créatures/entités/véhicules/commerces
|
||||||
|
- en cas de charge, les particulières sont toujours en force (p125)
|
||||||
|
|
||||||
==================================================================
|
## v11.0.28 - les fractures de Khrachtchoum
|
||||||
v0.9.1 - 03/09/2020
|
- La gravité de la blessure est affichée dans le résumé de l'encaissement
|
||||||
|
- Lors du changement d'acteur pendant le round
|
||||||
|
- le message annonçant le joueur dont c'est le tour ne contient plus d'informations de santé
|
||||||
|
- un message avec les informations de santé est envoyé au Gardienn et au propriétaire du token.acteur
|
||||||
|
- le jet de vie est bien fait par le token si besoin
|
||||||
|
- seul les propriétaires peuvent faire les jets de vie
|
||||||
|
- Amélioration de la fenêtre de jets
|
||||||
|
- le type de dégâts pour les attaques est toujours affiché
|
||||||
|
- le moral est indiqué avant l'icone d'appel au moral
|
||||||
|
|
||||||
|
## v11.0.27 - Khrachtchoum le méticuleux
|
||||||
|
- le tooltip dans les TMR reste visible si on ne bouge pas la souris
|
||||||
|
- le surencombrement n'affecte QUE les actions physiques
|
||||||
|
- on peut de nouveau fabriquer une potion depuis la fenêtre d'édition de l'herbe
|
||||||
|
- si les TMR sont minimisées alors qu'une action est requise, elles sont bien réaffichées lorsque l'action est faite
|
||||||
|
|
||||||
|
## v11.0.26 - le crépuscule de Khrachtchoum
|
||||||
|
- gestion correcte des TMRs
|
||||||
|
- les TMRs ne sont jamais minimisées (par le système) quand le haut-rêvant est en demi-rêve
|
||||||
|
- lorsqu'une fenêtre liée aux demi-rêve est affichée, cliquer sur les TMRs n'a pas d'effet
|
||||||
|
- les lancers de sorts et lectures de signes sont affichées en premier plan
|
||||||
|
- Les effets qui ouvrent une fenêtre sont bien affichés en premier plan
|
||||||
|
- en cas de rencontre suivie de maîtrises/conquêtes, les fenêtres s'enchaînent
|
||||||
|
- Le drag&drop vers la barre de macro est corrigé
|
||||||
|
- pour les créatures, possibilités d'avoir les attaques ou autres compétences
|
||||||
|
- pour les personnages, les macros sont créées:
|
||||||
|
- pour les compétences
|
||||||
|
- pour le corps à corps, trois macros sont créées: compétence, pugilat, empoignade
|
||||||
|
- pour les armes
|
||||||
|
- deux macros sont créées pour les armes à 1/2 mains
|
||||||
|
- deux macros sont créées pour les armes de mélée et lancer
|
||||||
|
- 4 macros si votre arbalête se lance, tire, et se manie à 1 ou 2 mains...
|
||||||
|
- les jets de compétences d'attaque des créatures fonctionnent de nouveau
|
||||||
|
|
||||||
|
## v11.0.25 - la vision du rêve de Khrachtchoum
|
||||||
|
- Les TMRs restent affichées tant que le Haut-rêvant est en demi-rêve
|
||||||
|
|
||||||
|
## v11.0.24 - les couleurs de Khrachtchoum
|
||||||
|
- nouvelle carte des TMRs
|
||||||
|
|
||||||
|
## v11.0.23 - la lumière de Khrachtchoum
|
||||||
|
- ajustement automatique de la luminosité selon l'heure pour les scènes:
|
||||||
|
- avec une vision des tokens (sinon: ce n'est pas une scène de carte pour tokens)
|
||||||
|
- avec illumination globale (correspondant à une illumination extérieure)
|
||||||
|
- quand lampe "allumée" dans la fenêtre du calendrier
|
||||||
|
|
||||||
|
## v11.0.22 - les automatismes de Khrachtchoum le Problémeux
|
||||||
|
- Macro pour attaquer avec les compétences de créatures
|
||||||
|
|
||||||
|
## v11.0.20
|
||||||
|
- Macro pour attaquer avec les armes des personnages
|
||||||
|
|
||||||
|
## v11.0.17
|
||||||
|
- Fix: les actions de commerce ne s'appliquait pas bien aux personnages des tokens non liés
|
||||||
|
|
||||||
|
## v11.0.15 - L'apprentissage de Khrachtchoum
|
||||||
|
- Fix: l'expérience ne s'appliquait plus sur certaines réussites particulières (régression depuis la 11.0.7)
|
||||||
|
|
||||||
|
## v11.0.14 - Les pincettes de Khrachtchoum le Problémeux
|
||||||
|
- Correction du calcul de la place restante lors de l'ajout dans un conteneur
|
||||||
|
|
||||||
|
## v11.0.13 - La multiplication de l'eau de Khrachtchoum le Problémeux
|
||||||
|
- Correction de la vente depuis un commerce ayant des quantités illimitées
|
||||||
|
|
||||||
|
## v11.0.12 - Les poids de la mesure de Khrachtchoum le Problémeux
|
||||||
|
- Correction des malus de surencombrement
|
||||||
|
- Le malus armure est correctement affiché dans l'onglet des caractéristiques
|
||||||
|
- Correction d'orthographe et amélioration des messages des oeuvres d'art
|
||||||
|
|
||||||
|
## v11.0.11 - Les bleus de Khrachtchoum le Problémeux
|
||||||
|
- si le gardien configure le sommeil, les joueurs sont notifiés que chateau dormant vient de passer
|
||||||
|
- possibilité de créer des armes et des compétences de créatures non-mortelles.
|
||||||
|
|
||||||
|
## v11.0.10 - Les Songes de Khrachtchoum le Problémeux
|
||||||
|
- on peut de nouveau se déplacer dans les TMRs d'un clic sur la case à atteindre
|
||||||
|
- Lire un livre depuis l'inventaire permet de nouveau de faire un jet de la tâche
|
||||||
|
créée au lieu de créer toujours une nouvelle tâche
|
||||||
|
- La sélection des TMR pour la création de signes draconiques ne cause plus d'erreurs
|
||||||
|
- la récupération d'endurance en cas d'insomnie est limitée à la moitié
|
||||||
|
- le résultat du sommeil lors d'un rêve de dragon à la première heure s'affiche normalement
|
||||||
|
- lorsque le gardien gère la durée des nuits, en cas de rêve de dragon,
|
||||||
|
les heures dormies sont déduites des heures restant à dormir
|
||||||
|
|
||||||
|
## v11.0.9 - Les Souvenirs de Khrachtchoum le Problémeux
|
||||||
|
- mode de saisie de l'archétype en vue détaillée
|
||||||
|
- création une nouvelle incarnation depuis l'archétype
|
||||||
|
- réorganisation de la fenêtre de sélection des règles optionnelles
|
||||||
|
- correction de l'affichage du type dans les fenêtres d'objets
|
||||||
|
|
||||||
|
## v11.0.8 - la poigne de Sémolosse
|
||||||
|
- lien vers le changelog
|
||||||
|
- organisation des compendiums du système
|
||||||
|
- correction de l'empoignade
|
||||||
|
- les items d'empoignade sont ajoutés par le MJ quand nécessaire
|
||||||
|
- seul le joueur propriétaire du personnage peut effectuer ses choix et actions d'empoignade
|
||||||
|
- les caractéristiques du défenseur sont utilisées pour la défense
|
||||||
|
- la difficulté d'attaque est imposée au défenseur
|
||||||
|
- les attaques particulières sont en finesse (p133)
|
||||||
|
- on peut entraîner au sol dès 2 points d'empoignade
|
||||||
|
- les actions liée à l'immobilisation sont proposées en fin de round
|
||||||
|
|
||||||
|
# v11.0.7
|
||||||
|
|
||||||
|
- les créatures ont maintenant le droit d'avoir des compétences de tir, lancer, mêlée, armes naturelles, parade.
|
||||||
|
- les créatures armées utilisent la bonne phase d'initiative
|
||||||
|
- correction des possessions
|
||||||
|
- la difficulté de la défense est imposée par l'attaque
|
||||||
|
- une attaque particulière de possession est en finesse
|
||||||
|
- le rêve actuel des personnages est bien utilisé
|
||||||
|
- correction des achats par le MJ sans acteur sélectionné
|
||||||
|
|
||||||
|
Cf branche v10 pour l'historique des versions 10
|
||||||
|
|
||||||
Initial official release
|
|
||||||
|
|||||||
BIN
icons/sante/blessure-mort.webp
Normal file
BIN
icons/sante/blessure-mort.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.1 KiB |
BIN
icons/sante/blessure-soins.webp
Normal file
BIN
icons/sante/blessure-soins.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
BIN
icons/sante/blessure.webp
Normal file
BIN
icons/sante/blessure.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.6 KiB |
BIN
icons/sante/eraflure.webp
Normal file
BIN
icons/sante/eraflure.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.8 KiB |
BIN
icons/sante/mort.webp
Normal file
BIN
icons/sante/mort.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.6 KiB |
101
lang/fr.json
101
lang/fr.json
@@ -1,53 +1,56 @@
|
|||||||
{
|
{
|
||||||
"ACTOR": {
|
"TYPES": {
|
||||||
"TypePersonnage": "Personnage",
|
"Actor": {
|
||||||
"TypeCreature": "Créature",
|
"Personnage": "Personnage",
|
||||||
"TypeEntite": "Entité de cauchemar",
|
"Creature": "Créature",
|
||||||
"TypeCommerce": "Commerce",
|
"Entite": "Entité de cauchemar",
|
||||||
"TypeVehicule": "Véhicule"
|
"Commerce": "Commerce",
|
||||||
},
|
"Vehicule": "Véhicule"
|
||||||
"ITEM": {
|
},
|
||||||
"TypeObjet": "Objet",
|
"Item": {
|
||||||
"TypeGemme": "Gemme",
|
"Arme": "Arme",
|
||||||
"TypeCompetence": "Compétence",
|
"Armure": "Armure",
|
||||||
"TypeCompetencecreature": "Compétence de créature",
|
"Blessure": "Blessure",
|
||||||
"TypeMaladie": "Maladie",
|
"Casetmr": "TMR spéciale",
|
||||||
"TypePoison": "Poison",
|
"Chant": "Chant",
|
||||||
"TypeNombreastral": "Nombre astral",
|
"Competence": "Compétence",
|
||||||
"TypeTarot": "Carte de tarot",
|
"Competencecreature": "Compétence de créature",
|
||||||
"TypeCasetmr": "TMR spéciale",
|
"Conteneur": "Conteneur",
|
||||||
"TypeRencontre": "Rencontre TMR",
|
"Danse": "Danse",
|
||||||
"TypeMunition": "Munition",
|
"Extraitpoetique": "Extrait poetique",
|
||||||
"TypeMonnaie": "Monnaie",
|
"Faune": "Faune",
|
||||||
"TypeHerbe": "Herbe",
|
"Gemme": "Gemme",
|
||||||
"TypePlante": "Plante",
|
"Herbe": "Herbe",
|
||||||
"TypeIngredient": "Ingrédient",
|
"Ingredient": "Ingrédient",
|
||||||
"TypeFaune": "Faune",
|
"Jeu": "Jeu",
|
||||||
"TypeLivre": "Livre",
|
"Livre": "Livre",
|
||||||
"TypePotion": "Potion",
|
"Maladie": "Maladie",
|
||||||
"TypeArme": "Arme",
|
"Meditation": "Méditation",
|
||||||
"TypeArmure": "Armure",
|
"Monnaie": "Monnaie",
|
||||||
"TypeConteneur": "Conteneur",
|
"Munition": "Munition",
|
||||||
"TypeNourritureboisson": "Nourriture & boisson",
|
"Musique": "Musique",
|
||||||
"TypeService": "Service",
|
"Nombreastral": "Nombre astral",
|
||||||
"TypeChant": "Chant",
|
"Nourritureboisson": "Nourriture & boisson",
|
||||||
"TypeDanse": "Danse",
|
"Objet": "Objet",
|
||||||
"TypeMusique": "Musique",
|
"Oeuvre": "Oeuvre",
|
||||||
"TypeOeuvre": "Oeuvre",
|
"Ombre": "Ombre de Thanatos",
|
||||||
"TypeTache": "Tâche",
|
"Plante": "Plante",
|
||||||
"TypeJeu": "Jeu",
|
"Poison": "Poison",
|
||||||
"TypeRecettealchimique": "Recette alchimique",
|
"Possession": "Possession",
|
||||||
"TypeRecettecuisine": "Recette de cuisine",
|
"Potion": "Potion",
|
||||||
"TypeSort": "Sort",
|
"Queue": "Queue de Dragon",
|
||||||
"TypeMeditation": "Méditation",
|
"Recettealchimique": "Recette alchimique",
|
||||||
"TypeSignedraconique": "Signe draconique",
|
"Recettecuisine": "Recette de cuisine",
|
||||||
"TypeQueue": "Queue de Dragon",
|
"Rencontre": "Rencontre TMR",
|
||||||
"TypeOmbre": "Ombre de Thanatos",
|
"Service": "Service",
|
||||||
"TypeSouffle": "Souffle de Dragon",
|
"Signedraconique": "Signe draconique",
|
||||||
"TypeTete": "Tête de Dragon",
|
"Sort": "Sort",
|
||||||
"TypePossession": "Possession",
|
"Sortreserve": "Sort en réserve",
|
||||||
"TypeSortreserve": "Sort en réserve",
|
"Souffle": "Souffle de Dragon",
|
||||||
"TypeExtraitpoetique": "Extrait poetique"
|
"Tache": "Tâche",
|
||||||
|
"Tarot": "Carte de tarot",
|
||||||
|
"Tete": "Tête de Dragon"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"EFFECT": {
|
"EFFECT": {
|
||||||
"StatusStunned": "Sonné",
|
"StatusStunned": "Sonné",
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
import { RdDActorSheet } from "./actor-sheet.js";
|
|
||||||
|
|
||||||
export class RdDActorEntiteSheet extends RdDActorSheet {
|
|
||||||
|
|
||||||
/** @override */
|
|
||||||
static get defaultOptions() {
|
|
||||||
return mergeObject(super.defaultOptions, {
|
|
||||||
classes: ["rdd", "sheet", "actor"],
|
|
||||||
template: "systems/foundryvtt-reve-de-dragon/templates/actor-entite-sheet.html",
|
|
||||||
width: 640,
|
|
||||||
height: 720,
|
|
||||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
|
|
||||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
/** @override */
|
|
||||||
activateListeners(html) {
|
|
||||||
super.activateListeners(html);
|
|
||||||
|
|
||||||
// Everything below here is only needed if the sheet is editable
|
|
||||||
if (!this.options.editable) return;
|
|
||||||
|
|
||||||
// On competence change
|
|
||||||
this.html.find('.creature-carac').change(async event => {
|
|
||||||
let compName = event.currentTarget.attributes.compname.value;
|
|
||||||
this.actor.updateCreatureCompetence(compName, "carac_value", parseInt(event.target.value));
|
|
||||||
});
|
|
||||||
this.html.find('.creature-niveau').change(async event => {
|
|
||||||
let compName = event.currentTarget.attributes.compname.value;
|
|
||||||
this.actor.updateCreatureCompetence(compName, "niveau", parseInt(event.target.value));
|
|
||||||
});
|
|
||||||
this.html.find('.creature-dommages').change(async event => {
|
|
||||||
let compName = event.currentTarget.attributes.compname.value;
|
|
||||||
this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -7,31 +7,30 @@ import { Misc } from "./misc.js";
|
|||||||
import { RdDCombatManager } from "./rdd-combat.js";
|
import { RdDCombatManager } from "./rdd-combat.js";
|
||||||
import { RdDCarac } from "./rdd-carac.js";
|
import { RdDCarac } from "./rdd-carac.js";
|
||||||
import { DialogSplitItem } from "./dialog-split-item.js";
|
import { DialogSplitItem } from "./dialog-split-item.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
|
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
|
||||||
import { STATUSES } from "./settings/status-effects.js";
|
import { STATUSES } from "./settings/status-effects.js";
|
||||||
import { MAINS_DIRECTRICES } from "./actor.js";
|
import { MAINS_DIRECTRICES } from "./actor.js";
|
||||||
import { RdDBaseActorSheet } from "./actor/base-actor-sheet.js";
|
import { RdDBaseActorReveSheet } from "./actor/base-actor-reve-sheet.js";
|
||||||
import { RdDItem } from "./item.js";
|
import { RdDItem } from "./item.js";
|
||||||
|
import { RdDItemBlessure } from "./item/blessure.js";
|
||||||
|
import { RdDEmpoignade } from "./rdd-empoignade.js";
|
||||||
|
import { ChatUtility } from "./chat-utility.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/**
|
/**
|
||||||
* Extend the basic ActorSheet with some very simple modifications
|
* Extend the basic ActorSheet with some very simple modifications
|
||||||
* @extends {ActorSheet}
|
* @extends {ActorSheet}
|
||||||
*/
|
*/
|
||||||
export class RdDActorSheet extends RdDBaseActorSheet {
|
export class RdDActorSheet extends RdDBaseActorReveSheet {
|
||||||
|
|
||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
RdDUtility.initAfficheContenu();
|
return mergeObject(RdDBaseActorReveSheet.defaultOptions, {
|
||||||
return mergeObject(super.defaultOptions, {
|
|
||||||
classes: ["rdd", "sheet", "actor"],
|
|
||||||
template: "systems/foundryvtt-reve-de-dragon/templates/actor-sheet.html",
|
template: "systems/foundryvtt-reve-de-dragon/templates/actor-sheet.html",
|
||||||
width: 550,
|
width: 550,
|
||||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
|
|
||||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }],
|
|
||||||
showCompNiveauBase: false,
|
showCompNiveauBase: false,
|
||||||
vueDetaillee: false
|
vueArchetype: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +52,8 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
surprise: RdDBonus.find(this.actor.getSurprise(false)).descr,
|
surprise: RdDBonus.find(this.actor.getSurprise(false)).descr,
|
||||||
resumeBlessures: this.actor.computeResumeBlessure(this.actor.system.blessures),
|
resumeBlessures: this.actor.computeResumeBlessure(this.actor.system.blessures),
|
||||||
caracTotal: RdDCarac.computeTotal(this.actor.system.carac, this.actor.system.beaute),
|
caracTotal: RdDCarac.computeTotal(this.actor.system.carac, this.actor.system.beaute),
|
||||||
surEncombrementMessage: this.actor.getMessageSurEncombrement(),
|
surEncombrementMessage: this.actor.isSurenc() ? "Sur-Encombrement!" : "",
|
||||||
|
malusArmure: this.actor.getMalusArmure()
|
||||||
})
|
})
|
||||||
|
|
||||||
this.timerRecherche = undefined;
|
this.timerRecherche = undefined;
|
||||||
@@ -77,11 +77,15 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// toujours avoir une liste d'armes (pour mettre esquive et corps à corps)
|
// toujours avoir une liste d'armes (pour mettre esquive et corps à corps)
|
||||||
formData.combat = duplicate(formData.armes ?? []);
|
const actor = this.actor;
|
||||||
|
formData.combat = duplicate(formData.armes);
|
||||||
RdDItemArme.computeNiveauArmes(formData.combat, formData.competences);
|
RdDItemArme.computeNiveauArmes(formData.combat, formData.competences);
|
||||||
RdDItemArme.ajoutCorpsACorps(formData.combat, formData.competences, formData.system.carac);
|
formData.combat.push(RdDItemArme.mainsNues(actor));
|
||||||
|
formData.combat.push(RdDItemArme.empoignade(actor));
|
||||||
|
|
||||||
formData.esquives = this.actor.getCompetences("Esquive");
|
formData.esquives = this.actor.getCompetences("Esquive");
|
||||||
formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.system.carac);
|
formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.system.carac);
|
||||||
|
formData.empoignades = this.actor.getEmpoignades();
|
||||||
|
|
||||||
this.armesList = formData.combat;
|
this.armesList = formData.combat;
|
||||||
|
|
||||||
@@ -107,23 +111,38 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
return formData;
|
return formData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */ /** @override */
|
/* -------------------------------------------- */
|
||||||
|
/** @override */
|
||||||
activateListeners(html) {
|
activateListeners(html) {
|
||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
|
|
||||||
HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionelles.isUsing("appliquer-fatigue"));
|
HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionnelles.isUsing("appliquer-fatigue"));
|
||||||
|
|
||||||
// Everything below here is only needed if the sheet is editable
|
// Everything below here is only needed if the sheet is editable
|
||||||
if (!this.options.editable) return;
|
if (!this.options.editable) return;
|
||||||
|
|
||||||
this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor));
|
this.html.find('.sheet-possession-attack').click(async event => {
|
||||||
|
const poss = RdDSheetUtility.getItem(event, this.actor)
|
||||||
|
this.actor.conjurerPossession(poss)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.html.find('.subacteur-label a').click(async event => {
|
||||||
|
let actorId = RdDSheetUtility.getEventItemData(event, 'actor-id');
|
||||||
|
let actor = game.actors.get(actorId);
|
||||||
|
if (actor) {
|
||||||
|
actor.sheet.render(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
this.html.find('.subacteur-delete').click(async event => {
|
this.html.find('.subacteur-delete').click(async event => {
|
||||||
const li = RdDSheetUtility.getEventElement(event);
|
const li = RdDSheetUtility.getEventElement(event);
|
||||||
const actorId = li.data("actor-id");
|
const actorId = li.data("actor-id");
|
||||||
if (actorId) {
|
if (actorId) {
|
||||||
const subActor = game.actors.get(actorId);
|
const subActor = game.actors.get(actorId);
|
||||||
RdDUtility.confirmerSuppressionSubacteur(this, subActor, li);
|
RdDUtility.confirmerSuppressionSubacteur(this, subActor, li, () => {
|
||||||
|
console.log('Delete : ', subActor.id);
|
||||||
|
this.actor.removeSubacteur(subActor.id);
|
||||||
|
RdDUtility.slideOnDelete(this, li);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.html.find('.experiencelog-delete').click(async event => {
|
this.html.find('.experiencelog-delete').click(async event => {
|
||||||
@@ -136,57 +155,39 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
const key = Number(li.data("key") ?? -1);
|
const key = Number(li.data("key") ?? -1);
|
||||||
await this.actor.deleteExperienceLog(0, key + 1);
|
await this.actor.deleteExperienceLog(0, key + 1);
|
||||||
});
|
});
|
||||||
this.html.find('.encaisser-direct').click(async event => {
|
this.html.find("input.derivee-value[name='system.compteurs.stress.value']").change(async event => {
|
||||||
this.actor.encaisser();
|
this.actor.updateCompteurValue("stress", parseInt(event.target.value));
|
||||||
})
|
|
||||||
this.html.find('.sheet-possession-attack').click(async event => {
|
|
||||||
const poss = RdDSheetUtility.getItem(event, this.actor)
|
|
||||||
this.actor.conjurerPossession(poss)
|
|
||||||
})
|
|
||||||
this.html.find('.remise-a-neuf').click(async event => {
|
|
||||||
if (game.user.isGM) {
|
|
||||||
this.actor.remiseANeuf();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
this.html.find("input.derivee-value[name='system.compteurs.experience.value']").change(async event => {
|
||||||
|
this.actor.updateCompteurValue("experience", parseInt(event.target.value));
|
||||||
|
});
|
||||||
|
|
||||||
this.html.find('.creer-tache').click(async event => {
|
this.html.find('.creer-tache').click(async event => {
|
||||||
this.createEmptyTache();
|
this.createEmptyTache();
|
||||||
});
|
});
|
||||||
this.html.find('.creer-tache-blessure-legere').click(async event => {
|
this.html.find('.creer-tache-blessure-legere').click(async event => RdDItemBlessure.createTacheSoinBlessure(this.actor, 2));
|
||||||
this.actor.createTacheBlessure('legere');
|
this.html.find('.creer-tache-blessure-grave').click(async event => RdDItemBlessure.createTacheSoinBlessure(this.actor, 4));
|
||||||
});
|
this.html.find('.creer-tache-blessure-critique').click(async event => RdDItemBlessure.createTacheSoinBlessure(this.actor, 6));
|
||||||
this.html.find('.creer-tache-blessure-grave').click(async event => {
|
this.html.find('.creer-blessure-legere').click(async event => RdDItemBlessure.createBlessure(this.actor, 2));
|
||||||
this.actor.createTacheBlessure('grave');
|
this.html.find('.creer-blessure-grave').click(async event => RdDItemBlessure.createBlessure(this.actor, 4));
|
||||||
});
|
this.html.find('.creer-blessure-critique').click(async event => RdDItemBlessure.createBlessure(this.actor, 6));
|
||||||
this.html.find('.creer-tache-blessure-critique').click(async event => {
|
this.html.find('.creer-une-oeuvre').click(async event => this.selectTypeOeuvreToCreate());
|
||||||
this.actor.createTacheBlessure('critique');
|
|
||||||
});
|
|
||||||
this.html.find('.creer-une-oeuvre').click(async event => {
|
|
||||||
this.selectTypeOeuvreToCreate();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Blessure control
|
this.html.find('.blessure-premierssoins-done').change(async event => {
|
||||||
this.html.find('.blessure-control').click(async event => {
|
const blessure = this.getBlessure(event);
|
||||||
const tr = this.html.find(event.currentTarget).parents(".item");
|
await blessure?.setSoinsBlessure({ premierssoins: { done: event.currentTarget.checked } });
|
||||||
let btype = tr.data("blessure-type");
|
|
||||||
let index = tr.data('blessure-index');
|
|
||||||
let active = this.html.find(event.currentTarget).data('blessure-active');
|
|
||||||
//console.log(btype, index, active);
|
|
||||||
await this.actor.manageBlessureFromSheet(btype, index, active);
|
|
||||||
});
|
});
|
||||||
|
this.html.find('.blessure-soinscomplets-done').change(async event => {
|
||||||
// Blessure data
|
const blessure = this.getBlessure(event);
|
||||||
this.html.find('.blessure-soins').change(async event => {
|
await blessure?.setSoinsBlessure({ soinscomplets: { done: event.currentTarget.checked } })
|
||||||
const tr = this.html.find(event.currentTarget).parents(".item");
|
});
|
||||||
let btype = tr.data('blessure-type');
|
this.html.find('.blessure-premierssoins-bonus').change(async event => {
|
||||||
let index = tr.data('blessure-index');
|
const blessure = this.getBlessure(event);
|
||||||
let psoins = tr.find('.blessure-premiers_soins').val();
|
await blessure?.setSoinsBlessure({ premierssoins: { bonus: Number(event.currentTarget.value) } })
|
||||||
let pcomplets = tr.find('.blessure-soins_complets').val();
|
});
|
||||||
let jours = tr.find('.blessure-jours').val();
|
this.html.find('.blessure-soinscomplets-bonus').change(async event => {
|
||||||
let loc = tr.find('.blessure-localisation').val();
|
const blessure = this.getBlessure(event);
|
||||||
let psdone = tr.find('.blessure-psdone:checked').val();
|
await blessure?.setSoinsBlessure({ soinscomplets: { bonus: Number(event.currentTarget.value) } })
|
||||||
let scdone = tr.find('.blessure-scdone:checked').val();
|
|
||||||
console.log(btype, index, psoins, pcomplets, jours, loc, psdone, scdone);
|
|
||||||
await this.actor.setDataBlessureFromSheet(btype, index, psoins, pcomplets, jours, loc, psdone, scdone);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Equip Inventory Item
|
// Equip Inventory Item
|
||||||
@@ -195,11 +196,6 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Roll Carac
|
// Roll Carac
|
||||||
this.html.find('.carac-label a').click(async event => {
|
|
||||||
let caracName = event.currentTarget.attributes.name.value;
|
|
||||||
this.actor.rollCarac(caracName.toLowerCase());
|
|
||||||
});
|
|
||||||
|
|
||||||
this.html.find('.chance-actuelle').click(async event => {
|
this.html.find('.chance-actuelle').click(async event => {
|
||||||
this.actor.rollCarac('chance-actuelle');
|
this.actor.rollCarac('chance-actuelle');
|
||||||
});
|
});
|
||||||
@@ -208,14 +204,10 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
this.actor.rollAppelChance();
|
this.actor.rollAppelChance();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Roll Skill
|
||||||
this.html.find('[name="jet-astrologie"]').click(async event => {
|
this.html.find('[name="jet-astrologie"]').click(async event => {
|
||||||
this.actor.astrologieNombresAstraux();
|
this.actor.astrologieNombresAstraux();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Roll Skill
|
|
||||||
this.html.find('a.competence-label').click(async event => {
|
|
||||||
this.actor.rollCompetence(RdDSheetUtility.getItemId(event));
|
|
||||||
});
|
|
||||||
this.html.find('.tache-label a').click(async event => {
|
this.html.find('.tache-label a').click(async event => {
|
||||||
this.actor.rollTache(RdDSheetUtility.getItemId(event));
|
this.actor.rollTache(RdDSheetUtility.getItemId(event));
|
||||||
});
|
});
|
||||||
@@ -240,13 +232,6 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
this.html.find('.recettecuisine-label a').click(async event => {
|
this.html.find('.recettecuisine-label a').click(async event => {
|
||||||
this.actor.rollRecetteCuisine(RdDSheetUtility.getItemId(event));
|
this.actor.rollRecetteCuisine(RdDSheetUtility.getItemId(event));
|
||||||
});
|
});
|
||||||
this.html.find('.subacteur-label a').click(async event => {
|
|
||||||
let actorId = RdDSheetUtility.getEventItemData(event, 'actor-id');
|
|
||||||
let actor = game.actors.get(actorId);
|
|
||||||
if (actor) {
|
|
||||||
actor.sheet.render(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Boutons spéciaux MJs
|
// Boutons spéciaux MJs
|
||||||
this.html.find('.forcer-tmr-aleatoire').click(async event => {
|
this.html.find('.forcer-tmr-aleatoire').click(async event => {
|
||||||
@@ -261,6 +246,11 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
this.actor.rollCarac('reve-actuel', true);
|
this.actor.rollCarac('reve-actuel', true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Suite empoignade
|
||||||
|
this.html.find('.empoignade-label a').click(async event => {
|
||||||
|
let emp = RdDSheetUtility.getItem(event, this.actor)
|
||||||
|
RdDEmpoignade.onAttaqueEmpoignadeFromItem(emp)
|
||||||
|
});
|
||||||
// Roll Weapon1
|
// Roll Weapon1
|
||||||
this.html.find('.arme-label a').click(async event => {
|
this.html.find('.arme-label a').click(async event => {
|
||||||
let arme = this._getEventArmeCombat(event);
|
let arme = this._getEventArmeCombat(event);
|
||||||
@@ -276,35 +266,12 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
ui.notifications.info("Impossible de lancer l'initiative sans être dans un combat.");
|
ui.notifications.info("Impossible de lancer l'initiative sans être dans un combat.");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// Display TMR, visualisation
|
// Display TMR
|
||||||
this.html.find('.visu-tmr').click(async event => {
|
this.html.find('.visu-tmr').click(async event => { this.actor.displayTMR("visu") })
|
||||||
this.actor.displayTMR("visu");
|
this.html.find('.monte-tmr').click(async event => { this.actor.displayTMR("normal") })
|
||||||
});
|
this.html.find('.monte-tmr-rapide').click(async event => { this.actor.displayTMR("rapide") })
|
||||||
|
|
||||||
// Display TMR, normal
|
this.html.find('.repos').click(async event => { await this.actor.repos() })
|
||||||
this.html.find('.monte-tmr').click(async event => {
|
|
||||||
this.actor.displayTMR("normal");
|
|
||||||
});
|
|
||||||
|
|
||||||
// Display TMR, fast
|
|
||||||
this.html.find('.monte-tmr-rapide').click(async event => {
|
|
||||||
this.actor.displayTMR("rapide");
|
|
||||||
});
|
|
||||||
|
|
||||||
this.html.find('.repos').click(async event => {
|
|
||||||
await this.actor.repos();
|
|
||||||
});
|
|
||||||
this.html.find('.delete-active-effect').click(async event => {
|
|
||||||
if (game.user.isGM) {
|
|
||||||
let effect = this.html.find(event.currentTarget).parents(".active-effect").data('effect');
|
|
||||||
this.actor.removeEffect(effect);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.html.find('.enlever-tous-effets').click(async event => {
|
|
||||||
if (game.user.isGM) {
|
|
||||||
await this.actor.removeEffects();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.html.find('.carac-xp-augmenter').click(async event => {
|
this.html.find('.carac-xp-augmenter').click(async event => {
|
||||||
let caracName = event.currentTarget.name.replace("augmenter.", "");
|
let caracName = event.currentTarget.name.replace("augmenter.", "");
|
||||||
this.actor.updateCaracXPAuto(caracName);
|
this.actor.updateCaracXPAuto(caracName);
|
||||||
@@ -318,47 +285,39 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
|
|
||||||
if (this.options.vueDetaillee) {
|
if (this.options.vueDetaillee) {
|
||||||
// On carac change
|
// On carac change
|
||||||
this.html.find('.carac-value').change(async event => {
|
|
||||||
let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "");
|
|
||||||
this.actor.updateCarac(caracName, parseInt(event.target.value));
|
|
||||||
});
|
|
||||||
this.html.find('input.carac-xp').change(async event => {
|
this.html.find('input.carac-xp').change(async event => {
|
||||||
let caracName = event.currentTarget.name.replace(".xp", "").replace("system.carac.", "");
|
let caracName = event.currentTarget.name.replace(".xp", "").replace("system.carac.", "");
|
||||||
this.actor.updateCaracXP(caracName, parseInt(event.target.value));
|
this.actor.updateCaracXP(caracName, parseInt(event.target.value));
|
||||||
});
|
});
|
||||||
// On competence change
|
|
||||||
this.html.find('.competence-value').change(async event => {
|
|
||||||
let compName = event.currentTarget.attributes.compname.value;
|
|
||||||
//console.log("Competence changed :", compName);
|
|
||||||
this.actor.updateCompetence(compName, parseInt(event.target.value));
|
|
||||||
});
|
|
||||||
// On competence xp change
|
// On competence xp change
|
||||||
this.html.find('input.competence-xp').change(async event => {
|
this.html.find('input.competence-xp').change(async event => {
|
||||||
let compName = event.currentTarget.attributes.compname.value;
|
let compName = event.currentTarget.attributes.compname.value;
|
||||||
this.actor.updateCompetenceXP(compName, parseInt(event.target.value));
|
this.actor.updateCompetenceXP(compName, parseInt(event.target.value));
|
||||||
});
|
});
|
||||||
// On competence xp change
|
|
||||||
this.html.find('input.competence-xp-sort').change(async event => {
|
this.html.find('input.competence-xp-sort').change(async event => {
|
||||||
let compName = event.currentTarget.attributes.compname.value;
|
let compName = event.currentTarget.attributes.compname.value;
|
||||||
this.actor.updateCompetenceXPSort(compName, parseInt(event.target.value));
|
this.actor.updateCompetenceXPSort(compName, parseInt(event.target.value));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.html.find('.toggle-archetype').click(async event => {
|
||||||
|
this.options.vueArchetype = !this.options.vueArchetype;
|
||||||
|
this.render(true);
|
||||||
|
});
|
||||||
// On competence archetype change
|
// On competence archetype change
|
||||||
this.html.find('.competence-archetype').change(async event => {
|
this.html.find('.competence-archetype').change(async event => {
|
||||||
let compName = event.currentTarget.attributes.compname.value;
|
let compName = event.currentTarget.attributes.compname.value;
|
||||||
this.actor.updateCompetenceArchetype(compName, parseInt(event.target.value));
|
this.actor.updateCompetenceArchetype(compName, parseInt(event.target.value));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
this.html.find('.nouvelle-incarnation').click(async event => {
|
||||||
|
this.actor.nouvelleIncarnation();
|
||||||
|
});
|
||||||
|
|
||||||
this.html.find('.show-hide-competences').click(async event => {
|
this.html.find('.show-hide-competences').click(async event => {
|
||||||
this.options.showCompNiveauBase = !this.options.showCompNiveauBase;
|
this.options.showCompNiveauBase = !this.options.showCompNiveauBase;
|
||||||
this.render(true);
|
this.render(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.html.find('.vue-detaillee').click(async event => {
|
|
||||||
this.options.vueDetaillee = !this.options.vueDetaillee;
|
|
||||||
this.render(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
// On pts de reve change
|
// On pts de reve change
|
||||||
this.html.find('.pointsreve-value').change(async event => {
|
this.html.find('.pointsreve-value').change(async event => {
|
||||||
let reveValue = event.currentTarget.value;
|
let reveValue = event.currentTarget.value;
|
||||||
@@ -371,11 +330,6 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
this.actor.setPointsDeSeuil(event.currentTarget.value);
|
this.actor.setPointsDeSeuil(event.currentTarget.value);
|
||||||
});
|
});
|
||||||
|
|
||||||
// On stress change
|
|
||||||
this.html.find('.compteur-edit').change(async event => {
|
|
||||||
let fieldName = event.currentTarget.attributes.name.value;
|
|
||||||
this.actor.updateCompteurValue(fieldName, parseInt(event.target.value));
|
|
||||||
});
|
|
||||||
|
|
||||||
this.html.find('.stress-test').click(async event => {
|
this.html.find('.stress-test').click(async event => {
|
||||||
this.actor.transformerStress();
|
this.actor.transformerStress();
|
||||||
@@ -397,7 +351,7 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
this.actor.jetVie();
|
this.actor.jetVie();
|
||||||
});
|
});
|
||||||
this.html.find('.jet-endurance').click(async event => {
|
this.html.find('.jet-endurance').click(async event => {
|
||||||
this.actor.jetEndurance();
|
await this.jetEndurance();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.html.find('.vie-plus').click(async event => {
|
this.html.find('.vie-plus').click(async event => {
|
||||||
@@ -406,12 +360,6 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
this.html.find('.vie-moins').click(async event => {
|
this.html.find('.vie-moins').click(async event => {
|
||||||
this.actor.santeIncDec("vie", -1);
|
this.actor.santeIncDec("vie", -1);
|
||||||
});
|
});
|
||||||
this.html.find('.endurance-plus').click(async event => {
|
|
||||||
this.actor.santeIncDec("endurance", 1);
|
|
||||||
});
|
|
||||||
this.html.find('.endurance-moins').click(async event => {
|
|
||||||
this.actor.santeIncDec("endurance", -1);
|
|
||||||
});
|
|
||||||
this.html.find('.ptreve-actuel-plus').click(async event => {
|
this.html.find('.ptreve-actuel-plus').click(async event => {
|
||||||
this.actor.reveActuelIncDec(1);
|
this.actor.reveActuelIncDec(1);
|
||||||
});
|
});
|
||||||
@@ -426,6 +374,22 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async jetEndurance() {
|
||||||
|
const endurance = this.actor.getEnduranceActuelle()
|
||||||
|
const result = await this.actor.jetEndurance(endurance);
|
||||||
|
ChatMessage.create({
|
||||||
|
content: `Jet d'Endurance : ${result.jetEndurance} / ${endurance}
|
||||||
|
<br>${this.actor.name} a ${result.sonne ? 'échoué' : 'réussi'} son Jet d'Endurance ${result.sonne ? 'et devient Sonné' : ''}`,
|
||||||
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.actor.name)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getBlessure(event) {
|
||||||
|
const itemId = this.html.find(event.currentTarget).parents(".item-blessure").data('item-id');
|
||||||
|
const blessure = this.actor.getItem(itemId, 'blessure');
|
||||||
|
return blessure;
|
||||||
|
}
|
||||||
|
|
||||||
isCompetenceAffichable(competence) {
|
isCompetenceAffichable(competence) {
|
||||||
return !this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(competence);
|
return !this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(competence);
|
||||||
}
|
}
|
||||||
@@ -439,9 +403,9 @@ export class RdDActorSheet extends RdDBaseActorSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async selectTypeOeuvreToCreate() {
|
async selectTypeOeuvreToCreate() {
|
||||||
let typeObjets = RdDItem.getTypesOeuvres();
|
let types = RdDItem.getTypesOeuvres();
|
||||||
let content = `<span class="competence-label">Selectionnez le type d'oeuvre</span><select class="item-type">`;
|
let content = `<span class="competence-label">Selectionnez le type d'oeuvre</span><select class="item-type">`;
|
||||||
for (let typeName of typeObjets) {
|
for (let typeName of types) {
|
||||||
content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
|
content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
|
||||||
}
|
}
|
||||||
content += '</select>';
|
content += '</select>';
|
||||||
|
|||||||
2241
module/actor.js
2241
module/actor.js
File diff suppressed because it is too large
Load Diff
64
module/actor/base-actor-reve-sheet.js
Normal file
64
module/actor/base-actor-reve-sheet.js
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
||||||
|
import { RdDBaseActorSheet } from "./base-actor-sheet.js";
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Extend the basic ActorSheet with some very simple modifications
|
||||||
|
* @extends {ActorSheet}
|
||||||
|
*/
|
||||||
|
export class RdDBaseActorReveSheet extends RdDBaseActorSheet {
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
static get defaultOptions() {
|
||||||
|
return mergeObject(RdDBaseActorSheet.defaultOptions, {
|
||||||
|
width: 550
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/** @override */
|
||||||
|
activateListeners(html) {
|
||||||
|
super.activateListeners(html);
|
||||||
|
|
||||||
|
// Everything below here is only needed if the sheet is editable
|
||||||
|
if (!this.options.editable) return;
|
||||||
|
|
||||||
|
this.html.find('.encaisser-direct').click(async event => {
|
||||||
|
this.actor.encaisser();
|
||||||
|
})
|
||||||
|
this.html.find('.remise-a-neuf').click(async event => {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
this.actor.remiseANeuf();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.html.find('.carac-label a').click(async event => {
|
||||||
|
let caracName = event.currentTarget.attributes.name.value;
|
||||||
|
this.actor.rollCarac(caracName.toLowerCase());
|
||||||
|
});
|
||||||
|
|
||||||
|
this.html.find('a.competence-label').click(async event => {
|
||||||
|
this.actor.rollCompetence(RdDSheetUtility.getItemId(event));
|
||||||
|
});
|
||||||
|
|
||||||
|
this.html.find('.delete-active-effect').click(async event => {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
let effect = this.html.find(event.currentTarget).parents(".active-effect").data('effect');
|
||||||
|
this.actor.removeEffect(effect);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.html.find('.enlever-tous-effets').click(async event => {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
await this.actor.removeEffects();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.html.find('.endurance-plus').click(async event => {
|
||||||
|
this.actor.santeIncDec("endurance", 1);
|
||||||
|
});
|
||||||
|
this.html.find('.endurance-moins').click(async event => {
|
||||||
|
this.actor.santeIncDec("endurance", -1);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
509
module/actor/base-actor-reve.js
Normal file
509
module/actor/base-actor-reve.js
Normal file
@@ -0,0 +1,509 @@
|
|||||||
|
import { ChatUtility } from "../chat-utility.js";
|
||||||
|
import { DialogValidationEncaissement } from "../dialog-validation-encaissement.js";
|
||||||
|
import { Grammar } from "../grammar.js";
|
||||||
|
import { RdDItemCompetence } from "../item-competence.js";
|
||||||
|
import { Misc } from "../misc.js";
|
||||||
|
import { RdDEmpoignade } from "../rdd-empoignade.js";
|
||||||
|
import { RdDResolutionTable } from "../rdd-resolution-table.js";
|
||||||
|
import { RdDEncaisser } from "../rdd-roll-encaisser.js";
|
||||||
|
import { RdDRoll } from "../rdd-roll.js";
|
||||||
|
import { RdDUtility } from "../rdd-utility.js";
|
||||||
|
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
||||||
|
import { RdDBaseActor } from "./base-actor.js";
|
||||||
|
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
|
||||||
|
import { StatusEffects } from "../settings/status-effects.js";
|
||||||
|
import { TYPES } from "../item.js";
|
||||||
|
import { Targets } from "../targets.js";
|
||||||
|
import { RdDPossession } from "../rdd-possession.js";
|
||||||
|
import { RdDCombat } from "../rdd-combat.js";
|
||||||
|
import { RdDConfirm } from "../rdd-confirm.js";
|
||||||
|
import { ENTITE_INCARNE, SYSTEM_RDD } from "../constants.js";
|
||||||
|
import { RdDItemArme } from "../item-arme.js";
|
||||||
|
|
||||||
|
const POSSESSION_SANS_DRACONIC = {
|
||||||
|
img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp',
|
||||||
|
name: 'Sans draconic',
|
||||||
|
system: {
|
||||||
|
niveau: 0,
|
||||||
|
defaut_carac: "reve-actuel",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classe de base pour les acteurs disposant de rêve (donc, pas des objets)
|
||||||
|
* - Entités de rêve
|
||||||
|
* - Créatures de "sang": créatures et humanoides
|
||||||
|
*/
|
||||||
|
export class RdDBaseActorReve extends RdDBaseActor {
|
||||||
|
|
||||||
|
getCaracChanceActuelle() {
|
||||||
|
return {
|
||||||
|
label: 'Chance actuelle',
|
||||||
|
value: this.getChanceActuel(),
|
||||||
|
type: "number"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
getCaracReveActuel() {
|
||||||
|
return {
|
||||||
|
label: 'Rêve actuel',
|
||||||
|
value: this.getReveActuel(),
|
||||||
|
type: "number"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
getReveActuel() { return this.getReve() }
|
||||||
|
getChanceActuel() { return this.getChance() }
|
||||||
|
|
||||||
|
getReve() { return Number(this.system.carac.reve?.value ?? 0) }
|
||||||
|
getForce() { return this.getReve() }
|
||||||
|
getTaille() { return Number(this.system.carac.taille?.value ?? 0) }
|
||||||
|
getAgilite() { return this.getForce() }
|
||||||
|
getChance() { return this.getReve() }
|
||||||
|
getMoralTotal() { return 0 }
|
||||||
|
getBonusDegat() { return Number(this.system.attributs?.plusdom?.value ?? 0) }
|
||||||
|
getProtectionNaturelle() { return Number(this.system.attributs?.protection?.value ?? 0) }
|
||||||
|
getSConst() { return 0 }
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getEncombrementMax() { return 0 }
|
||||||
|
isSurenc() { return false }
|
||||||
|
computeMalusSurEncombrement() { return 0 }
|
||||||
|
|
||||||
|
ajustementAstrologique() { return 0 }
|
||||||
|
getMalusArmure() { return 0 }
|
||||||
|
|
||||||
|
getEnduranceActuelle() {
|
||||||
|
return Number(this.system.sante?.endurance?.value ?? 0);
|
||||||
|
}
|
||||||
|
async jetEndurance(resteEndurance = undefined) { return { jetEndurance: 0, sonne: false } }
|
||||||
|
isDead() { return false }
|
||||||
|
blessuresASoigner() { return [] }
|
||||||
|
getEtatGeneral(options = { ethylisme: false }) { return 0 }
|
||||||
|
|
||||||
|
async computeArmure(attackerRoll) { return this.getProtectionNaturelle() }
|
||||||
|
async remiseANeuf() { }
|
||||||
|
async appliquerAjoutExperience(rollData, hideChatMessage = 'show') { }
|
||||||
|
|
||||||
|
async santeIncDec(name, inc, isCritique = false) { }
|
||||||
|
|
||||||
|
async finDeRound(options = { terminer: false }) {
|
||||||
|
await this.$finDeRoundSuppressionEffetsTermines(options);
|
||||||
|
await this.finDeRoundBlessures();
|
||||||
|
await this.$finDeRoundSupprimerObsoletes();
|
||||||
|
await this.$finDeRoundEmpoignade();
|
||||||
|
}
|
||||||
|
|
||||||
|
async $finDeRoundSuppressionEffetsTermines(options) {
|
||||||
|
for (let effect of this.getEffects()) {
|
||||||
|
if (effect.duration.type !== 'none' && (effect.duration.remaining <= 0 || options.terminer)) {
|
||||||
|
await effect.delete();
|
||||||
|
ChatMessage.create({ content: `${this.name} n'est plus ${Misc.lowerFirst(game.i18n.localize(effect.system.label))} !` });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async finDeRoundBlessures() {
|
||||||
|
}
|
||||||
|
|
||||||
|
async $finDeRoundSupprimerObsoletes() {
|
||||||
|
const obsoletes = []
|
||||||
|
.concat(this.itemTypes[TYPES.empoignade].filter(it => it.system.pointsemp <= 0))
|
||||||
|
.concat(this.itemTypes[TYPES.possession].filter(it => it.system.compteur < -2 || it.system.compteur > 2))
|
||||||
|
.map(it => it.id);
|
||||||
|
await this.deleteEmbeddedDocuments('Item', obsoletes);
|
||||||
|
}
|
||||||
|
|
||||||
|
async $finDeRoundEmpoignade() {
|
||||||
|
const immobilisations = this.itemTypes[TYPES.empoignade].filter(it => it.system.pointsemp >= 2 && it.system.empoigneurid == this.id);
|
||||||
|
immobilisations.forEach(emp => RdDEmpoignade.onImmobilisation(this,
|
||||||
|
game.actors.get(emp.system.empoigneid),
|
||||||
|
emp
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSonne(sonne = true) { }
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getCompetence(idOrName, options = {}) {
|
||||||
|
if (idOrName instanceof Item) {
|
||||||
|
return idOrName.isCompetence() ? idOrName : undefined
|
||||||
|
}
|
||||||
|
return RdDItemCompetence.findCompetence(this.items, idOrName, options)
|
||||||
|
}
|
||||||
|
getCompetences(name) {
|
||||||
|
return RdDItemCompetence.findCompetences(this.items, name)
|
||||||
|
}
|
||||||
|
getCompetenceCorpsACorps(options = {}) {
|
||||||
|
return this.getCompetence("Corps à corps", options)
|
||||||
|
}
|
||||||
|
getCompetencesEsquive() {
|
||||||
|
return this.getCompetences("esquive")
|
||||||
|
}
|
||||||
|
|
||||||
|
getArmeParade(armeParadeId) {
|
||||||
|
const item = armeParadeId ? this.getEmbeddedDocument('Item', armeParadeId) : undefined;
|
||||||
|
return RdDItemArme.getArme(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
getDraconicOuPossession() {
|
||||||
|
return POSSESSION_SANS_DRACONIC
|
||||||
|
}
|
||||||
|
|
||||||
|
getPossession(possessionId) {
|
||||||
|
return this.itemTypes[TYPES.possession].find(it => it.system.possessionid == possessionId);
|
||||||
|
}
|
||||||
|
getPossessions() {
|
||||||
|
return this.itemTypes[TYPES.possession];
|
||||||
|
}
|
||||||
|
getEmpoignades() {
|
||||||
|
return this.itemTypes[TYPES.empoignade];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async updateCreatureCompetence(idOrName, fieldName, value) {
|
||||||
|
let competence = this.getCompetence(idOrName);
|
||||||
|
if (competence) {
|
||||||
|
function getFieldPath(fieldName) {
|
||||||
|
switch (fieldName) {
|
||||||
|
case "niveau": return 'system.niveau';
|
||||||
|
case "dommages": return 'system.dommages';
|
||||||
|
case "carac_value": return 'system.carac_value';
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
const path = getFieldPath(fieldName);
|
||||||
|
if (path) {
|
||||||
|
await this.updateEmbeddedDocuments('Item', [{ _id: competence.id, [path]: value }]); // updates one EmbeddedEntity
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
isEffectAllowed(statusId) { return true }
|
||||||
|
|
||||||
|
getEffects(filter = e => true) {
|
||||||
|
return this.getEmbeddedCollection("ActiveEffect").filter(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
getEffect(statusId) {
|
||||||
|
return this.getEmbeddedCollection("ActiveEffect").find(it => it.flags?.core?.statusId == statusId);
|
||||||
|
}
|
||||||
|
|
||||||
|
async setEffect(statusId, status) {
|
||||||
|
if (this.isEffectAllowed(statusId)) {
|
||||||
|
const effect = this.getEffect(statusId);
|
||||||
|
if (!status && effect) {
|
||||||
|
await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]);
|
||||||
|
}
|
||||||
|
if (status && !effect) {
|
||||||
|
await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.status(statusId)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeEffect(statusId) {
|
||||||
|
const effect = this.getEffect(statusId);
|
||||||
|
if (effect) {
|
||||||
|
await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeEffects(filter = e => true) {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
const ids = this.getEffects(filter).map(it => it.id);
|
||||||
|
await this.deleteEmbeddedDocuments('ActiveEffect', ids);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getSurprise(isCombat = undefined) {
|
||||||
|
let niveauSurprise = this.getEffects()
|
||||||
|
.map(effect => StatusEffects.valeurSurprise(effect, isCombat))
|
||||||
|
.reduce(Misc.sum(), 0);
|
||||||
|
if (niveauSurprise > 1) {
|
||||||
|
return 'totale';
|
||||||
|
}
|
||||||
|
if (niveauSurprise == 1) {
|
||||||
|
return 'demi';
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async computeEtatGeneral() {
|
||||||
|
// Par défaut, on ne calcule pas d'état général, seuls les personnages/créatures sont affectés
|
||||||
|
this.system.compteurs.etat.value = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async openRollDialog({ name, label, template, rollData, callbackAction }) {
|
||||||
|
const dialog = await RdDRoll.create(this, rollData,
|
||||||
|
{ html: template, close: async html => await this._onCloseRollDialog(html) },
|
||||||
|
{
|
||||||
|
name: name,
|
||||||
|
label: label,
|
||||||
|
callbacks: [
|
||||||
|
this.createCallbackExperience(),
|
||||||
|
this.createCallbackAppelAuMoral(),
|
||||||
|
{ action: callbackAction }
|
||||||
|
]
|
||||||
|
});
|
||||||
|
dialog.render(true);
|
||||||
|
return dialog
|
||||||
|
}
|
||||||
|
|
||||||
|
createEmptyCallback() {
|
||||||
|
return {
|
||||||
|
condition: r => false,
|
||||||
|
action: r => { }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
createCallbackExperience() { return this.createEmptyCallback(); }
|
||||||
|
createCallbackAppelAuMoral() { return this.createEmptyCallback(); }
|
||||||
|
async _onCloseRollDialog(html) { }
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async roll() {
|
||||||
|
RdDEmpoignade.checkEmpoignadeEnCours(this)
|
||||||
|
|
||||||
|
const carac = this.getCarac()
|
||||||
|
const selectedCaracName = ['apparence', 'perception', 'force', 'reve'].find(it => carac[it] != undefined)
|
||||||
|
|
||||||
|
await this.openRollDialog({
|
||||||
|
name: `jet-${this.id}`,
|
||||||
|
label: `Jet de ${this.name}`,
|
||||||
|
template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll.html',
|
||||||
|
rollData: {
|
||||||
|
carac: carac,
|
||||||
|
selectedCarac: carac[selectedCaracName],
|
||||||
|
selectedCaracName: selectedCaracName,
|
||||||
|
competences: this.itemTypes['competence']
|
||||||
|
},
|
||||||
|
callbackAction: r => this.$onRollCaracResult(r)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getCarac() {
|
||||||
|
// TODO: le niveau d'une entité de cauchemar devrait être exclu...
|
||||||
|
const carac = mergeObject(duplicate(this.system.carac),
|
||||||
|
{
|
||||||
|
'reve-actuel': this.getCaracReveActuel(),
|
||||||
|
'chance-actuelle': this.getCaracChanceActuelle()
|
||||||
|
});
|
||||||
|
return carac;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async rollCarac(caracName, jetResistance = undefined) {
|
||||||
|
RdDEmpoignade.checkEmpoignadeEnCours(this)
|
||||||
|
let selectedCarac = this.getCaracByName(caracName)
|
||||||
|
await this.openRollDialog({
|
||||||
|
name: 'jet-' + caracName,
|
||||||
|
label: 'Jet ' + Grammar.apostrophe('de', selectedCarac.label),
|
||||||
|
template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-carac.html',
|
||||||
|
rollData: {
|
||||||
|
selectedCarac: selectedCarac,
|
||||||
|
competences: this.itemTypes['competence'],
|
||||||
|
jetResistance: jetResistance ? caracName : undefined
|
||||||
|
},
|
||||||
|
callbackAction: r => this.$onRollCaracResult(r)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async $onRollCaracResult(rollData) {
|
||||||
|
// Final chat message
|
||||||
|
await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-general.html');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async rollCompetence(idOrName, options = { tryTarget: true }) {
|
||||||
|
RdDEmpoignade.checkEmpoignadeEnCours(this)
|
||||||
|
const competence = this.getCompetence(idOrName);
|
||||||
|
let rollData = { carac: this.system.carac, competence: competence }
|
||||||
|
if (competence.type == TYPES.competencecreature) {
|
||||||
|
const arme = RdDItemCompetenceCreature.armeCreature(competence)
|
||||||
|
if (arme && options.tryTarget && Targets.hasTargets()) {
|
||||||
|
Targets.selectOneToken(target => {
|
||||||
|
if (arme.action == "possession") {
|
||||||
|
RdDPossession.onAttaquePossession(target, this, competence)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
RdDCombat.rddCombatTarget(target, this).attaque(competence, arme)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Transformer la competence de créature
|
||||||
|
RdDItemCompetenceCreature.setRollDataCreature(rollData)
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.openRollDialog({
|
||||||
|
name: 'jet-competence',
|
||||||
|
label: 'Jet ' + Grammar.apostrophe('de', competence.name),
|
||||||
|
template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html',
|
||||||
|
rollData: rollData,
|
||||||
|
callbackAction: r => this.$onRollCompetence(r, options)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async $onRollCompetence(rollData, options) {
|
||||||
|
await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-competence.html')
|
||||||
|
if (options?.onRollAutomate) {
|
||||||
|
options.onRollAutomate(rollData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** --------------------------------------------
|
||||||
|
* @param {*} arme item d'arme/compétence de créature
|
||||||
|
* @param {*} categorieArme catégorie d'attaque à utiliser: competence (== melee), lancer, tir; naturelle, possession
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
rollArme(arme, categorieArme = "competence") {
|
||||||
|
let compToUse = this.$getCompetenceArme(arme, categorieArme)
|
||||||
|
if (!Targets.hasTargets()) {
|
||||||
|
RdDConfirm.confirmer({
|
||||||
|
settingConfirmer: "confirmer-combat-sans-cible",
|
||||||
|
content: `<p>Voulez vous faire un jet de ${compToUse} sans choisir de cible valide?
|
||||||
|
<br>Tous les jets de combats devront être gérés à la main
|
||||||
|
</p>`,
|
||||||
|
title: 'Ne pas utiliser les automatisation de combat',
|
||||||
|
buttonLabel: "Pas d'automatisation",
|
||||||
|
onAction: async () => {
|
||||||
|
this.rollCompetence(compToUse, { tryTarget: false })
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Targets.selectOneToken(target => {
|
||||||
|
if (Targets.isTargetEntite(target)) {
|
||||||
|
ui.notifications.warn(`Vous ne pouvez pas attaquer une entité non incarnée avec votre ${arme.name}!!!!`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const competence = this.getCompetence(compToUse)
|
||||||
|
//console.log("RollArme", competence, arme)
|
||||||
|
if (competence.isCompetencePossession()) {
|
||||||
|
return RdDPossession.onAttaquePossession(target, this, competence);
|
||||||
|
}
|
||||||
|
RdDCombat.rddCombatTarget(target, this).attaque(competence, arme);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$getCompetenceArme(arme, competenceName) {
|
||||||
|
switch (arme.type) {
|
||||||
|
case TYPES.competencecreature:
|
||||||
|
return arme.name
|
||||||
|
case TYPES.arme:
|
||||||
|
switch (competenceName) {
|
||||||
|
case 'competence': return arme.system.competence;
|
||||||
|
case 'unemain': return RdDItemArme.competence1Mains(arme);
|
||||||
|
case 'deuxmains': return RdDItemArme.competence2Mains(arme);
|
||||||
|
case 'tir': return arme.system.tir;
|
||||||
|
case 'lancer': return arme.system.lancer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
verifierForceMin(item) {
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async resetItemUse() { }
|
||||||
|
async incDecItemUse(itemId, inc = 1) { }
|
||||||
|
getItemUse(itemId) { return 0; }
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async encaisser() { await RdDEncaisser.encaisser(this) }
|
||||||
|
|
||||||
|
async encaisserDommages(rollData, attacker = undefined, show = undefined) {
|
||||||
|
if (attacker && !await attacker.accorder(this, 'avant-encaissement')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const attackerId = attacker?.id;
|
||||||
|
if (ReglesOptionnelles.isUsing('validation-encaissement-gr') && !game.user.isGM) {
|
||||||
|
RdDBaseActor.remoteActorCall({
|
||||||
|
tokenId: this.token?.id,
|
||||||
|
actorId: this.id,
|
||||||
|
method: 'appliquerEncaissement',
|
||||||
|
args: [rollData, show, attackerId]
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const armure = await this.computeArmure(rollData);
|
||||||
|
if (ReglesOptionnelles.isUsing('validation-encaissement-gr')) {
|
||||||
|
DialogValidationEncaissement.validerEncaissement(this, rollData, armure,
|
||||||
|
jet => this.$onEncaissement(jet, show, attacker));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const jet = await RdDUtility.jetEncaissement(rollData, armure, { showDice: SHOW_DICE });
|
||||||
|
await this.$onEncaissement(jet, show, attacker);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async $onEncaissement(jet, show, attacker) {
|
||||||
|
await this.onAppliquerJetEncaissement(jet, attacker);
|
||||||
|
await this.$afficherEncaissement(jet, show);
|
||||||
|
}
|
||||||
|
|
||||||
|
async onAppliquerJetEncaissement(encaissement, attacker) { }
|
||||||
|
|
||||||
|
async $afficherEncaissement(encaissement, show) {
|
||||||
|
mergeObject(encaissement, {
|
||||||
|
alias: this.name,
|
||||||
|
hasPlayerOwner: this.hasPlayerOwner,
|
||||||
|
show: show ?? {}
|
||||||
|
});
|
||||||
|
|
||||||
|
await ChatUtility.createChatWithRollMode(this.name, {
|
||||||
|
roll: encaissement.roll,
|
||||||
|
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html', encaissement)
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!encaissement.hasPlayerOwner && encaissement.endurance != 0) {
|
||||||
|
encaissement = duplicate(encaissement);
|
||||||
|
encaissement.isGM = true;
|
||||||
|
ChatMessage.create({
|
||||||
|
whisper: ChatMessage.getWhisperRecipients("GM"),
|
||||||
|
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html', encaissement)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async accorder(entite, when = 'avant-encaissement') {
|
||||||
|
if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar")
|
||||||
|
|| entite == undefined
|
||||||
|
|| !entite.isEntite([ENTITE_INCARNE])
|
||||||
|
|| entite.isEntiteAccordee(this)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
const rolled = await RdDResolutionTable.roll(this.getReveActuel(), - Number(entite.system.carac.niveau.value));
|
||||||
|
const rollData = {
|
||||||
|
alias: this.name,
|
||||||
|
rolled: rolled,
|
||||||
|
entite: entite.name,
|
||||||
|
selectedCarac: this.system.carac.reve
|
||||||
|
};
|
||||||
|
|
||||||
|
if (rolled.isSuccess) {
|
||||||
|
await entite.setEntiteReveAccordee(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-accorder-cauchemar.html');
|
||||||
|
if (rolled.isPart) {
|
||||||
|
await this.appliquerAjoutExperience(rollData, true);
|
||||||
|
}
|
||||||
|
return rolled.isSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
isEntiteAccordee(attacker) { return true }
|
||||||
|
|
||||||
|
async setEntiteReveAccordee(attacker) {
|
||||||
|
ui.notifications.error("Impossible de s'accorder à " + this.name + ": ce n'est pas une entite de cauchemer/rêve");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
275
module/actor/base-actor-sang.js
Normal file
275
module/actor/base-actor-sang.js
Normal file
@@ -0,0 +1,275 @@
|
|||||||
|
import { MAX_ENDURANCE_FATIGUE, RdDUtility } from "../rdd-utility.js";
|
||||||
|
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
||||||
|
import { STATUSES } from "../settings/status-effects.js";
|
||||||
|
import { TYPES } from "../item.js";
|
||||||
|
import { RdDBaseActorReve } from "./base-actor-reve.js";
|
||||||
|
import { RdDDice } from "../rdd-dice.js";
|
||||||
|
import { RdDItemBlessure } from "../item/blessure.js";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classe de base pour les acteurs qui peuvent subir des blessures
|
||||||
|
* - créatures
|
||||||
|
* - humanoides
|
||||||
|
*/
|
||||||
|
export class RdDBaseActorSang extends RdDBaseActorReve {
|
||||||
|
|
||||||
|
|
||||||
|
getForce() { return Number(this.system.carac.force?.value ?? 0) }
|
||||||
|
|
||||||
|
getBonusDegat() { return Number(this.system.attributs?.plusdom?.value ?? 0) }
|
||||||
|
getProtectionNaturelle() { return Number(this.system.attributs?.protection?.value ?? 0) }
|
||||||
|
getSConst() { return 0 }
|
||||||
|
|
||||||
|
getEnduranceMax() {
|
||||||
|
return Math.max(1, Math.min(this.system.sante.endurance.max, MAX_ENDURANCE_FATIGUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
getFatigueActuelle() {
|
||||||
|
if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
|
||||||
|
return Math.max(0, Math.min(this.getFatigueMax(), this.system.sante.fatigue?.value));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
getFatigueRestante() {
|
||||||
|
return this.getFatigueMax() - this.getFatigueActuelle();
|
||||||
|
}
|
||||||
|
|
||||||
|
getFatigueMin() {
|
||||||
|
return this.system.sante.endurance.max - this.system.sante.endurance.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
getFatigueMax() { return this.getEnduranceMax() * 2 }
|
||||||
|
|
||||||
|
malusFatigue() {
|
||||||
|
if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
|
||||||
|
return RdDUtility.calculMalusFatigue(this.getFatigueActuelle(), this.getEnduranceMax())
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getEncombrementMax() { return Number(this.system.attributs?.encombrement?.value ?? 0) }
|
||||||
|
isSurenc() { return this.computeMalusSurEncombrement() < 0 }
|
||||||
|
|
||||||
|
computeMalusSurEncombrement() {
|
||||||
|
return Math.min(0, Math.floor(this.getEncombrementMax() - this.encTotal));
|
||||||
|
}
|
||||||
|
|
||||||
|
isDead() {
|
||||||
|
return this.system.sante.vie.value < -this.getSConst()
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
computeResumeBlessure() {
|
||||||
|
const blessures = this.filterItems(it => it.system.gravite > 0, 'blessure')
|
||||||
|
|
||||||
|
const nbLegeres = blessures.filter(it => it.isLegere()).length;
|
||||||
|
const nbGraves = blessures.filter(it => it.isGrave()).length;
|
||||||
|
const nbCritiques = blessures.filter(it => it.isCritique()).length;
|
||||||
|
|
||||||
|
if (nbLegeres + nbGraves + nbCritiques == 0) {
|
||||||
|
return "Aucune blessure";
|
||||||
|
}
|
||||||
|
let resume = "Blessures:";
|
||||||
|
if (nbLegeres > 0) {
|
||||||
|
resume += " " + nbLegeres + " légère" + (nbLegeres > 1 ? "s" : "");
|
||||||
|
}
|
||||||
|
if (nbGraves > 0) {
|
||||||
|
if (nbLegeres > 0)
|
||||||
|
resume += ",";
|
||||||
|
resume += " " + nbGraves + " grave" + (nbGraves > 1 ? "s" : "");
|
||||||
|
}
|
||||||
|
if (nbCritiques > 0) {
|
||||||
|
if (nbGraves > 0 || nbLegeres > 0)
|
||||||
|
resume += ",";
|
||||||
|
resume += " une CRITIQUE !";
|
||||||
|
}
|
||||||
|
return resume;
|
||||||
|
}
|
||||||
|
|
||||||
|
blessuresASoigner() { return [] }
|
||||||
|
getEtatGeneral(options = { ethylisme: false }) { return 0 }
|
||||||
|
|
||||||
|
async computeArmure(attackerRoll) { return this.getProtectionNaturelle() }
|
||||||
|
async remiseANeuf() { }
|
||||||
|
async appliquerAjoutExperience(rollData, hideChatMessage = 'show') { }
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
|
async onAppliquerJetEncaissement(encaissement, attacker) {
|
||||||
|
const santeOrig = duplicate(this.system.sante);
|
||||||
|
const blessure = await this.ajouterBlessure(encaissement, attacker); // Will update the result table
|
||||||
|
const perteVie = await this.santeIncDec("vie", -encaissement.vie);
|
||||||
|
const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, blessure?.isCritique());
|
||||||
|
|
||||||
|
mergeObject(encaissement, {
|
||||||
|
resteEndurance: perteEndurance.newValue,
|
||||||
|
sonne: perteEndurance.sonne,
|
||||||
|
jetEndurance: perteEndurance.jetEndurance,
|
||||||
|
endurance: perteEndurance.perte,
|
||||||
|
vie: santeOrig.vie.value - perteVie.newValue,
|
||||||
|
blessure: blessure
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async santeIncDec(name, inc, isCritique = false) {
|
||||||
|
if (name == 'fatigue' && !ReglesOptionnelles.isUsing("appliquer-fatigue")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const sante = duplicate(this.system.sante)
|
||||||
|
let compteur = sante[name];
|
||||||
|
if (!compteur) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let result = {
|
||||||
|
sonne: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
let minValue = name == "vie" ? -this.getSConst() - 1 : 0;
|
||||||
|
|
||||||
|
result.newValue = Math.max(minValue, Math.min(compteur.value + inc, compteur.max));
|
||||||
|
//console.log("New value ", inc, minValue, result.newValue);
|
||||||
|
let fatigue = 0;
|
||||||
|
if (name == "endurance") {
|
||||||
|
if (result.newValue == 0 && inc < 0 && !isCritique) { // perte endurance et endurance devient 0 (sauf critique) -> -1 vie
|
||||||
|
sante.vie.value--;
|
||||||
|
result.perteVie = true;
|
||||||
|
}
|
||||||
|
result.newValue = Math.max(0, result.newValue);
|
||||||
|
if (inc > 0) { // le max d'endurance s'applique seulement à la récupération
|
||||||
|
result.newValue = Math.min(result.newValue, this._computeEnduranceMax())
|
||||||
|
}
|
||||||
|
const perte = compteur.value - result.newValue;
|
||||||
|
result.perte = perte;
|
||||||
|
if (perte > 1) {
|
||||||
|
// Peut-être sonné si 2 points d'endurance perdus d'un coup
|
||||||
|
mergeObject(result, await this.jetEndurance(result.newValue));
|
||||||
|
} else if (inc > 0) {
|
||||||
|
await this.setSonne(false);
|
||||||
|
}
|
||||||
|
if (sante.fatigue && inc < 0) { // Each endurance lost -> fatigue lost
|
||||||
|
fatigue = perte;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compteur.value = result.newValue;
|
||||||
|
// If endurance lost, then the same amount of fatigue cannot be recovered
|
||||||
|
if (ReglesOptionnelles.isUsing("appliquer-fatigue") && sante.fatigue && fatigue > 0) {
|
||||||
|
sante.fatigue.value = Math.max(sante.fatigue.value + fatigue, this.getFatigueMin());
|
||||||
|
}
|
||||||
|
await this.update({ "system.sante": sante })
|
||||||
|
if (this.isDead()) {
|
||||||
|
await this.setEffect(STATUSES.StatusComma, true);
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async ajouterBlessure(encaissement, attacker = undefined) {
|
||||||
|
if (encaissement.gravite < 0) return;
|
||||||
|
if (encaissement.gravite > 0) {
|
||||||
|
while (this.countBlessures(it => it.system.gravite == encaissement.gravite) >= RdDItemBlessure.maxBlessures(encaissement.gravite) && encaissement.gravite <= 6) {
|
||||||
|
// Aggravation
|
||||||
|
encaissement.gravite += 2
|
||||||
|
if (encaissement.gravite > 2) {
|
||||||
|
encaissement.vie += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const endActuelle = this.getEnduranceActuelle();
|
||||||
|
const blessure = await RdDItemBlessure.createBlessure(this, encaissement.gravite, encaissement.dmg.loc.label, attacker);
|
||||||
|
if (blessure.isCritique()) {
|
||||||
|
encaissement.endurance = endActuelle;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blessure.isMort()) {
|
||||||
|
this.setEffect(STATUSES.StatusComma, true);
|
||||||
|
encaissement.mort = true;
|
||||||
|
ChatMessage.create({
|
||||||
|
content: `<img class="chat-icon" src="icons/svg/skull.svg" alt="charge" />
|
||||||
|
<strong>${this.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !</strong>`
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return blessure;
|
||||||
|
}
|
||||||
|
|
||||||
|
async supprimerBlessures(filterToDelete) {
|
||||||
|
const toDelete = this.filterItems(filterToDelete, TYPES.blessure)
|
||||||
|
.map(it => it.id);
|
||||||
|
await this.deleteEmbeddedDocuments('Item', toDelete);
|
||||||
|
}
|
||||||
|
|
||||||
|
countBlessures(filter = it => !it.isContusion()) {
|
||||||
|
return this.filterItems(filter, 'blessure').length
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async jetVie() {
|
||||||
|
let roll = await RdDDice.roll("1d20");
|
||||||
|
let msgText = "Jet de Vie : " + roll.total + " / " + this.system.sante.vie.value + "<br>";
|
||||||
|
if (roll.total <= this.system.sante.vie.value) {
|
||||||
|
msgText += "Jet réussi, pas de perte de point de vie (prochain jet dans 1 round pour 1 critique, SC minutes pour une grave)";
|
||||||
|
if (roll.total == 1) {
|
||||||
|
msgText += "La durée entre 2 jets de vie est multipliée par 20 (20 rounds pour une critique, SCx20 minutes pour une grave)";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
msgText += "Jet échoué, vous perdez 1 point de vie";
|
||||||
|
await this.santeIncDec("vie", -1);
|
||||||
|
if (roll.total == 20) {
|
||||||
|
msgText += "Votre personnage est mort !!!!!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const message = {
|
||||||
|
content: msgText,
|
||||||
|
whisper: ChatMessage.getWhisperRecipients(this.name)
|
||||||
|
};
|
||||||
|
ChatMessage.create(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async jetEndurance(resteEndurance = undefined) {
|
||||||
|
const jetEndurance = (await RdDDice.roll("1d20")).total;
|
||||||
|
const sonne = jetEndurance == 20 || jetEndurance > (resteEndurance ?? this.system.sante.endurance.value)
|
||||||
|
if (sonne) {
|
||||||
|
await this.setSonne();
|
||||||
|
}
|
||||||
|
return { jetEndurance, sonne }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async finDeRoundBlessures() {
|
||||||
|
const nbGraves = this.filterItems(it => it.isGrave(), 'blessure').length;
|
||||||
|
if (nbGraves > 0) {
|
||||||
|
// Gestion blessure graves : -1 pt endurance par blessure grave
|
||||||
|
await this.santeIncDec("endurance", -nbGraves);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSonne(sonne = true) {
|
||||||
|
if (!game.combat && sonne) {
|
||||||
|
ui.notifications.info(`${this.name} est hors combat, il ne reste donc pas sonné`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await this.setEffect(STATUSES.StatusStunned, sonne);
|
||||||
|
}
|
||||||
|
|
||||||
|
getSonne() {
|
||||||
|
return this.getEffect(STATUSES.StatusStunned);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async computeEtatGeneral() {
|
||||||
|
this.system.compteurs.etat.value = this.malusVie() + this.malusFatigue() + this.malusEthylisme();
|
||||||
|
}
|
||||||
|
|
||||||
|
malusVie() {
|
||||||
|
return Math.min(this.system.sante.vie.value - this.system.sante.vie.max, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
malusEthylisme() { return 0 }
|
||||||
|
malusFatigue() { return 0 }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,7 +3,8 @@ import { Misc } from "../misc.js";
|
|||||||
import { DialogSplitItem } from "../dialog-split-item.js";
|
import { DialogSplitItem } from "../dialog-split-item.js";
|
||||||
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
||||||
import { Monnaie } from "../item-monnaie.js";
|
import { Monnaie } from "../item-monnaie.js";
|
||||||
import { RdDItem } from "../item.js";
|
import { RdDItem, TYPES } from "../item.js";
|
||||||
|
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/**
|
/**
|
||||||
@@ -15,13 +16,10 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
RdDUtility.initAfficheContenu();
|
RdDUtility.initAfficheContenu();
|
||||||
return mergeObject(super.defaultOptions, {
|
return mergeObject(ActorSheet.defaultOptions, {
|
||||||
classes: ["rdd", "sheet", "actor"],
|
classes: ["rdd", "sheet", "actor"],
|
||||||
template: "systems/foundryvtt-reve-de-dragon/templates/actor-sheet.html",
|
|
||||||
width: 550,
|
|
||||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
|
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
|
||||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }],
|
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }],
|
||||||
showCompNiveauBase: false,
|
|
||||||
vueDetaillee: false
|
vueDetaillee: false
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -30,7 +28,7 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
async getData() {
|
async getData() {
|
||||||
Monnaie.validerMonnaies(this.actor.itemTypes['monnaie']);
|
Monnaie.validerMonnaies(this.actor.itemTypes['monnaie']);
|
||||||
|
|
||||||
this.actor.recompute();
|
this.actor.computeEtatGeneral();
|
||||||
let formData = {
|
let formData = {
|
||||||
title: this.title,
|
title: this.title,
|
||||||
id: this.actor.id,
|
id: this.actor.id,
|
||||||
@@ -50,16 +48,18 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
encTotal: await this.actor.computeEncTotal(),
|
encTotal: await this.actor.computeEncTotal(),
|
||||||
}
|
}
|
||||||
|
|
||||||
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.inventaires);
|
||||||
|
this._appliquerRechercheObjets(formData.conteneurs, formData.inventaires);
|
||||||
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
|
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
|
||||||
this._appliquerRechercheObjets(formData.objets, formData.conteneurs);
|
formData.competences.filter(it => it.type == TYPES.competencecreature)
|
||||||
|
.forEach(it => it.isdommages = RdDItemCompetenceCreature.isDommages(it))
|
||||||
return formData;
|
return formData;
|
||||||
}
|
}
|
||||||
|
|
||||||
_appliquerRechercheObjets(objets, conteneurs) {
|
_appliquerRechercheObjets(conteneurs, inventaires) {
|
||||||
if (this.options.recherche?.text) {
|
if (this.options.recherche?.text) {
|
||||||
const recherche = this.options.recherche;
|
const recherche = this.options.recherche;
|
||||||
const allVisible = objets.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id);
|
const allVisible = inventaires.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id);
|
||||||
let addVisible = conteneurs.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id)
|
let addVisible = conteneurs.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id)
|
||||||
do {
|
do {
|
||||||
allVisible.push(...addVisible)
|
allVisible.push(...addVisible)
|
||||||
@@ -67,17 +67,18 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
addVisible = parentsIds.filter(id => !allVisible.includes(id))
|
addVisible = parentsIds.filter(id => !allVisible.includes(id))
|
||||||
}
|
}
|
||||||
while (addVisible.length > 0)
|
while (addVisible.length > 0)
|
||||||
objets.forEach(it => it.system.isHidden = !allVisible.includes(it.id))
|
inventaires.forEach(it => it.system.isHidden = !allVisible.includes(it.id))
|
||||||
conteneurs.forEach(it => it.system.isHidden = !allVisible.includes(it.id))
|
conteneurs.forEach(it => it.system.isHidden = !allVisible.includes(it.id))
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
objets.forEach(it => it.system.isHidden = false)
|
inventaires.forEach(it => it.system.isHidden = false)
|
||||||
conteneurs.forEach(it => it.system.isHidden = false)
|
conteneurs.forEach(it => it.system.isHidden = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static filterItemsPerTypeForSheet(formData, itemTypes) {
|
static filterItemsPerTypeForSheet(formData, itemTypes) {
|
||||||
|
formData.blessures = Misc.arrayOrEmpty(itemTypes['blessure']);
|
||||||
formData.recettescuisine = Misc.arrayOrEmpty(itemTypes['recettecuisine']);
|
formData.recettescuisine = Misc.arrayOrEmpty(itemTypes['recettecuisine']);
|
||||||
formData.recettesAlchimiques = Misc.arrayOrEmpty(itemTypes['recettealchimique']);
|
formData.recettesAlchimiques = Misc.arrayOrEmpty(itemTypes['recettealchimique']);
|
||||||
formData.maladies = Misc.arrayOrEmpty(itemTypes['maladie']);
|
formData.maladies = Misc.arrayOrEmpty(itemTypes['maladie']);
|
||||||
@@ -117,9 +118,10 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
formData.herbes = Misc.arrayOrEmpty(itemTypes['herbe']);
|
formData.herbes = Misc.arrayOrEmpty(itemTypes['herbe']);
|
||||||
formData.nourritureboissons = Misc.arrayOrEmpty(itemTypes['nourritureboisson']);
|
formData.nourritureboissons = Misc.arrayOrEmpty(itemTypes['nourritureboisson']);
|
||||||
formData.gemmes = Misc.arrayOrEmpty(itemTypes['gemme']);
|
formData.gemmes = Misc.arrayOrEmpty(itemTypes['gemme']);
|
||||||
formData.monnaie = Misc.arrayOrEmpty(itemTypes['monnaie']).sort(Monnaie.triValeurEntiere());
|
formData.monnaies = Misc.arrayOrEmpty(itemTypes['monnaie']).sort(Monnaie.triValeurEntiere());
|
||||||
|
formData.objets = Misc.arrayOrEmpty(itemTypes['objet'])
|
||||||
|
|
||||||
formData.objets = RdDItem.getItemTypesInventaire('all')
|
formData.inventaires = RdDItem.getItemTypesInventaire('all')
|
||||||
.map(t => Misc.arrayOrEmpty(itemTypes[t]))
|
.map(t => Misc.arrayOrEmpty(itemTypes[t]))
|
||||||
.reduce((a, b) => a.concat(b), [])
|
.reduce((a, b) => a.concat(b), [])
|
||||||
.sort(Misc.ascending(it => it.name));
|
.sort(Misc.ascending(it => it.name));
|
||||||
@@ -130,6 +132,13 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
this.html = html;
|
this.html = html;
|
||||||
|
|
||||||
|
if (!this.options.editable) return;
|
||||||
|
|
||||||
|
this.html.find('.item-action').click(async event => {
|
||||||
|
const item = RdDSheetUtility.getItem(event, this.actor);
|
||||||
|
item?.actionPrincipale(this.actor, async () => this.render())
|
||||||
|
});
|
||||||
|
|
||||||
this.html.find('.conteneur-name a').click(async event => {
|
this.html.find('.conteneur-name a').click(async event => {
|
||||||
RdDUtility.toggleAfficheContenu(this.getItemId(event));
|
RdDUtility.toggleAfficheContenu(this.getItemId(event));
|
||||||
this.render(true);
|
this.render(true);
|
||||||
@@ -137,7 +146,13 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
this.html.find('.item-edit').click(async event => this.getItem(event)?.sheet.render(true))
|
this.html.find('.item-edit').click(async event => this.getItem(event)?.sheet.render(true))
|
||||||
this.html.find('.item-montrer').click(async event => this.getItem(event)?.postItemToChat());
|
this.html.find('.item-montrer').click(async event => this.getItem(event)?.postItemToChat());
|
||||||
this.html.find('.actor-montrer').click(async event => this.actor.postActorToChat());
|
this.html.find('.actor-montrer').click(async event => this.actor.postActorToChat());
|
||||||
|
this.html.find('.recherche')
|
||||||
|
.each((index, field) => {
|
||||||
|
this._rechercheSelectArea(field);
|
||||||
|
})
|
||||||
|
.keyup(async event => this._rechercherKeyup(event))
|
||||||
|
.change(async event => this._rechercherKeyup(event));
|
||||||
|
this.html.find('.recherche').prop("disabled", false);
|
||||||
// Everything below here is only needed if the sheet is editable
|
// Everything below here is only needed if the sheet is editable
|
||||||
if (!this.options.editable) return;
|
if (!this.options.editable) return;
|
||||||
|
|
||||||
@@ -145,6 +160,8 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
const item = this.getItem(event);
|
const item = this.getItem(event);
|
||||||
RdDSheetUtility.splitItem(item, this.actor);
|
RdDSheetUtility.splitItem(item, this.actor);
|
||||||
});
|
});
|
||||||
|
this.html.find('.item-quantite-plus').click(async event => this.actor.itemQuantiteIncDec(this.getItemId(event), 1));
|
||||||
|
this.html.find('.item-quantite-moins').click(async event => this.actor.itemQuantiteIncDec(this.getItemId(event), -1));
|
||||||
this.html.find('.item-delete').click(async event => RdDUtility.confirmActorItemDelete(this, this.getItem(event)));
|
this.html.find('.item-delete').click(async event => RdDUtility.confirmActorItemDelete(this, this.getItem(event)));
|
||||||
this.html.find('.item-vendre').click(async event => this.vendre(this.getItem(event)));
|
this.html.find('.item-vendre').click(async event => this.vendre(this.getItem(event)));
|
||||||
|
|
||||||
@@ -154,18 +171,26 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
this.html.find('.nettoyer-conteneurs').click(async event => {
|
this.html.find('.nettoyer-conteneurs').click(async event => {
|
||||||
this.actor.nettoyerConteneurs();
|
this.actor.nettoyerConteneurs();
|
||||||
});
|
});
|
||||||
this.html.find('.monnaie-plus').click(async event => {
|
|
||||||
this.actor.monnaieIncDec(this.getItemId(event), 1);
|
this.html.find('.vue-detaillee').click(async event => {
|
||||||
|
this.options.vueDetaillee = !this.options.vueDetaillee;
|
||||||
|
this.render(true);
|
||||||
});
|
});
|
||||||
this.html.find('.monnaie-moins').click(async event => {
|
|
||||||
this.actor.monnaieIncDec(this.getItemId(event), -1);
|
if (this.options.vueDetaillee) {
|
||||||
});
|
// On carac change
|
||||||
this.html.find('.recherche')
|
this.html.find('.carac-value').change(async event => {
|
||||||
.each((index, field) => {
|
let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "");
|
||||||
this._rechercheSelectArea(field);
|
this.actor.updateCarac(caracName, parseInt(event.target.value));
|
||||||
})
|
});
|
||||||
.keyup(async event => this._rechercherKeyup(event))
|
// On competence change
|
||||||
.change(async event => this._rechercherKeyup(event));
|
this.html.find('.competence-value').change(async event => {
|
||||||
|
let compName = event.currentTarget.attributes.compname.value;
|
||||||
|
//console.log("Competence changed :", compName);
|
||||||
|
this.actor.updateCompetence(compName, parseInt(event.target.value));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_rechercherKeyup(event) {
|
_rechercherKeyup(event) {
|
||||||
@@ -233,9 +258,9 @@ export class RdDBaseActorSheet extends ActorSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async selectObjetTypeToCreate() {
|
async selectObjetTypeToCreate() {
|
||||||
let typeObjets = this.getTypesInventaire().sort(Misc.ascending(type => Misc.typeName('Item', type)));
|
let types = this.getTypesInventaire().sort(Misc.ascending(type => Misc.typeName('Item', type)));
|
||||||
let content = `<span class="competence-label">Selectionnez le type d'équipement</span><select class="item-type">`;
|
let content = `<span class="competence-label">Selectionnez le type d'équipement</span><select class="item-type">`;
|
||||||
for (let typeName of typeObjets) {
|
for (let typeName of types) {
|
||||||
content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
|
content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
|
||||||
}
|
}
|
||||||
content += '</select>';
|
content += '</select>';
|
||||||
|
|||||||
@@ -1,12 +1,43 @@
|
|||||||
import { ChatUtility } from "../chat-utility.js";
|
import { ChatUtility } from "../chat-utility.js";
|
||||||
import { SYSTEM_SOCKET_ID } from "../constants.js";
|
import { SYSTEM_SOCKET_ID } from "../constants.js";
|
||||||
|
import { Grammar } from "../grammar.js";
|
||||||
import { Monnaie } from "../item-monnaie.js";
|
import { Monnaie } from "../item-monnaie.js";
|
||||||
|
import { TYPES } from "../item.js";
|
||||||
import { Misc } from "../misc.js";
|
import { Misc } from "../misc.js";
|
||||||
import { RdDAudio } from "../rdd-audio.js";
|
import { RdDAudio } from "../rdd-audio.js";
|
||||||
|
import { RdDConfirm } from "../rdd-confirm.js";
|
||||||
import { RdDUtility } from "../rdd-utility.js";
|
import { RdDUtility } from "../rdd-utility.js";
|
||||||
import { SystemCompendiums } from "../settings/system-compendiums.js";
|
import { SystemCompendiums } from "../settings/system-compendiums.js";
|
||||||
|
import { APP_ASTROLOGIE_REFRESH } from "../sommeil/app-astrologie.js";
|
||||||
|
|
||||||
export class RdDBaseActor extends Actor {
|
export class RdDBaseActor extends Actor {
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static _findCaracByName(carac, name) {
|
||||||
|
name = Grammar.toLowerCaseNoAccent(name);
|
||||||
|
switch (name) {
|
||||||
|
case 'reve-actuel': case 'reve actuel':
|
||||||
|
return carac.reve;
|
||||||
|
case 'chance-actuelle': case 'chance actuelle':
|
||||||
|
return carac.chance;
|
||||||
|
}
|
||||||
|
|
||||||
|
const caracList = Object.entries(carac);
|
||||||
|
let entry = Misc.findFirstLike(name, caracList, { mapper: it => it[0], description: 'caractéristique' });
|
||||||
|
if (!entry || entry.length == 0) {
|
||||||
|
entry = Misc.findFirstLike(name, caracList, { mapper: it => it[1].label, description: 'caractéristique' });
|
||||||
|
}
|
||||||
|
return entry && entry.length > 0 ? carac[entry[0]] : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
getCaracByName(name) {
|
||||||
|
switch (Grammar.toLowerCaseNoAccent(name)) {
|
||||||
|
case 'reve-actuel': case 'reve actuel':
|
||||||
|
return this.getCaracReveActuel();
|
||||||
|
case 'chance-actuelle': case 'chance-actuelle':
|
||||||
|
return this.getCaracChanceActuelle();
|
||||||
|
}
|
||||||
|
return RdDBaseActor._findCaracByName(this.system.carac, name);
|
||||||
|
}
|
||||||
|
|
||||||
static getDefaultImg(itemType) {
|
static getDefaultImg(itemType) {
|
||||||
return game.system.rdd.actorClasses[itemType]?.defaultIcon ?? defaultItemImg[itemType];
|
return game.system.rdd.actorClasses[itemType]?.defaultIcon ?? defaultItemImg[itemType];
|
||||||
@@ -20,14 +51,16 @@ export class RdDBaseActor extends Actor {
|
|||||||
Hooks.on("updateActor", (actor, change, options, actorId) => actor.onUpdateActor(change, options, actorId));
|
Hooks.on("updateActor", (actor, change, options, actorId) => actor.onUpdateActor(change, options, actorId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static onSocketMessage(sockmsg) {
|
static onSocketMessage(sockmsg) {
|
||||||
switch (sockmsg.msg) {
|
switch (sockmsg.msg) {
|
||||||
case "msg_remote_actor_call":
|
case "msg_remote_actor_call":
|
||||||
return RdDBaseActor.onRemoteActorCall(sockmsg.data, sockmsg.userId);
|
return RdDBaseActor.onRemoteActorCall(sockmsg.data, sockmsg.userId);
|
||||||
case "msg_reset_nombre_astral":
|
case "msg_reset_nombre_astral":
|
||||||
console.log("RESET ASTRAL", game.user.character);
|
game.user.character.resetNombresAstraux();
|
||||||
game.user.character.resetNombreAstral();
|
game.system.rdd.calendrier.notifyChangeNombresAstraux();
|
||||||
|
return;
|
||||||
|
case "msg_refresh_nombre_astral":
|
||||||
|
Hooks.callAll(APP_ASTROLOGIE_REFRESH);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -46,7 +79,13 @@ export class RdDBaseActor extends Actor {
|
|||||||
|
|
||||||
static onRemoteActorCall(callData, userId) {
|
static onRemoteActorCall(callData, userId) {
|
||||||
if (userId == game.user.id) {
|
if (userId == game.user.id) {
|
||||||
const actor = game.actors.get(callData?.actorId);
|
let actor = game.actors.get(callData?.actorId);
|
||||||
|
if (callData.tokenId) {
|
||||||
|
let token = canvas.tokens.placeables.find(t => t.id == callData.tokenId)
|
||||||
|
if (token) {
|
||||||
|
actor = token.actor
|
||||||
|
}
|
||||||
|
}
|
||||||
if (Misc.isOwnerPlayerOrUniqueConnectedGM(actor)) { // Seul le joueur choisi effectue l'appel: le joueur courant si propriétaire de l'actor, ou le MJ sinon
|
if (Misc.isOwnerPlayerOrUniqueConnectedGM(actor)) { // Seul le joueur choisi effectue l'appel: le joueur courant si propriétaire de l'actor, ou le MJ sinon
|
||||||
const args = callData.args;
|
const args = callData.args;
|
||||||
console.info(`RdDBaseActor.onRemoteActorCall: pour l'Actor ${callData.actorId}, appel de RdDBaseActor.${callData.method}(`, ...args, ')');
|
console.info(`RdDBaseActor.onRemoteActorCall: pour l'Actor ${callData.actorId}, appel de RdDBaseActor.${callData.method}(`, ...args, ')');
|
||||||
@@ -101,12 +140,39 @@ export class RdDBaseActor extends Actor {
|
|||||||
super(docData, context);
|
super(docData, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
isCreatureEntite() { return this.type == 'creature' || this.type == 'entite'; }
|
/* -------------------------------------------- */
|
||||||
isCreature() { return this.type == 'creature'; }
|
async _preCreate(data, options, user) {
|
||||||
isEntite() { return this.type == 'entite'; }
|
await super._preCreate(data, options, user);
|
||||||
isPersonnage() { return this.type == 'personnage'; }
|
|
||||||
isVehicule() { return this.type == 'vehicule'; }
|
|
||||||
|
|
||||||
|
// Configure prototype token settings
|
||||||
|
const prototypeToken = {};
|
||||||
|
if (this.type === "personnage") Object.assign(prototypeToken, {
|
||||||
|
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
|
||||||
|
});
|
||||||
|
this.updateSource({ prototypeToken });
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
prepareData() {
|
||||||
|
super.prepareData()
|
||||||
|
this.prepareActorData()
|
||||||
|
this.cleanupConteneurs()
|
||||||
|
this.computeEtatGeneral()
|
||||||
|
this.computeEncTotal()
|
||||||
|
}
|
||||||
|
|
||||||
|
async prepareActorData() { }
|
||||||
|
async computeEtatGeneral() { }
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
findPlayer() {
|
||||||
|
return game.users.players.find(player => player.active && player.character?.id == this.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
isCreatureEntite() { return this.isCreature() || this.isEntite() }
|
||||||
|
isCreature() { return false }
|
||||||
|
isEntite(typeentite = []) { return false }
|
||||||
|
isVehicule() { return false }
|
||||||
|
isPersonnage() { return false }
|
||||||
getItem(id, type = undefined) {
|
getItem(id, type = undefined) {
|
||||||
const item = this.items.get(id);
|
const item = this.items.get(id);
|
||||||
if (type == undefined || (item?.type == type)) {
|
if (type == undefined || (item?.type == type)) {
|
||||||
@@ -116,16 +182,14 @@ export class RdDBaseActor extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
listItems(type = undefined) { return (type ? this.itemTypes[type] : this.items); }
|
listItems(type = undefined) { return (type ? this.itemTypes[type] : this.items); }
|
||||||
filterItems(filter, type = undefined) { return this.listItems(type)?.filter(filter) ?? []; }
|
filterItems(filter, type = undefined) { return (type ? this.itemTypes[type] : this.items)?.filter(filter) ?? []; }
|
||||||
findItemLike(idOrName, type) {
|
findItemLike(idOrName, type) {
|
||||||
return this.getItem(idOrName, type)
|
return this.getItem(idOrName, type)
|
||||||
?? Misc.findFirstLike(idOrName, this.listItems(type), { description: Misc.typeName('Item', type) });
|
?? Misc.findFirstLike(idOrName, this.listItems(type), { description: Misc.typeName('Item', type) });
|
||||||
}
|
}
|
||||||
|
|
||||||
getMonnaie(id) { return this.findItemLike(id, 'monnaie'); }
|
getMonnaie(id) { return this.findItemLike(id, 'monnaie'); }
|
||||||
|
getEncombrementMax() { return 0 }
|
||||||
recompute() { }
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async onPreUpdateItem(item, change, options, id) { }
|
async onPreUpdateItem(item, change, options, id) { }
|
||||||
@@ -141,17 +205,40 @@ export class RdDBaseActor extends Actor {
|
|||||||
.forEach(async it => await it.onFinPeriodeTemporel(oldTimestamp, newTimestamp))
|
.forEach(async it => await it.onFinPeriodeTemporel(oldTimestamp, newTimestamp))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async creerObjetParMJ(object) {
|
||||||
|
if (!Misc.isUniqueConnectedGM()) {
|
||||||
|
RdDBaseActor.remoteActorCall({
|
||||||
|
tokenId: this.token?.id,
|
||||||
|
actorId: this.id,
|
||||||
|
method: 'creerObjetParMJ',
|
||||||
|
args: [object]
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await this.createEmbeddedDocuments('Item', [object])
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async cleanupConteneurs() {
|
||||||
|
let updates = this.itemTypes['conteneur']
|
||||||
|
.filter(c => c.system.contenu.filter(id => this.getItem(id) == undefined).length > 0)
|
||||||
|
.map(c => { return { _id: c._id, 'system.contenu': c.system.contenu.filter(id => this.getItem(id) != undefined) } });
|
||||||
|
if (updates.length > 0) {
|
||||||
|
await this.updateEmbeddedDocuments("Item", updates)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getFortune() {
|
getFortune() {
|
||||||
return Monnaie.getFortune(this.itemTypes['monnaie']);
|
return Monnaie.getFortune(this.itemTypes['monnaie']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async monnaieIncDec(id, value) {
|
async itemQuantiteIncDec(id, value) {
|
||||||
let monnaie = this.getMonnaie(id);
|
let item = this.getItem(id);
|
||||||
if (monnaie) {
|
if (item && item.isInventaire()) {
|
||||||
const quantite = Math.max(0, monnaie.system.quantite + value);
|
const quantite = Math.max(0, item.system.quantite + value);
|
||||||
await this.updateEmbeddedDocuments('Item', [{ _id: monnaie.id, 'system.quantite': quantite }]);
|
await this.updateEmbeddedDocuments('Item', [{ _id: item.id, 'system.quantite': quantite }]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,6 +292,7 @@ export class RdDBaseActor extends Actor {
|
|||||||
if (fromActorId && !game.user.isGM) {
|
if (fromActorId && !game.user.isGM) {
|
||||||
RdDBaseActor.remoteActorCall({
|
RdDBaseActor.remoteActorCall({
|
||||||
userId: Misc.connectedGMOrUser(),
|
userId: Misc.connectedGMOrUser(),
|
||||||
|
tokenId: this.token?.id,
|
||||||
actorId: this.id,
|
actorId: this.id,
|
||||||
method: 'ajouterSols', args: [sols, fromActorId]
|
method: 'ajouterSols', args: [sols, fromActorId]
|
||||||
});
|
});
|
||||||
@@ -241,14 +329,16 @@ export class RdDBaseActor extends Actor {
|
|||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const cout = Number(achat.prixTotal ?? 0);
|
const cout = Number(achat.prixTotal ?? 0);
|
||||||
const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined;
|
const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined;
|
||||||
const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined;
|
const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined;
|
||||||
const vente = achat.vente;
|
const quantite = (achat.choix.nombreLots ?? 1) * (achat.vente.tailleLot);
|
||||||
const quantite = (achat.choix.nombreLots ?? 1) * (vente.tailleLot);
|
const itemVendu = vendeur?.getItem(achat.vente.item._id) ?? game.items.get(achat.vente.item._id);
|
||||||
const itemVendu = vendeur?.getItem(vente.item._id);
|
if (!itemVendu) {
|
||||||
if (!this.verifierQuantite(vendeur, itemVendu, quantite)) {
|
ChatUtility.notifyUser(achat.userId, 'warn', vendeur ? `Le vendeur n'a pas plus de ${achat.vente.item.name} !` : `Impossible de retrouver: ${achat.vente.item.name} !`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (vendeur && !vendeur.verifierQuantite(itemVendu, quantite)) {
|
||||||
ChatUtility.notifyUser(achat.userId, 'warn', `Le vendeur n'a pas assez de ${itemVendu.name} !`);
|
ChatUtility.notifyUser(achat.userId, 'warn', `Le vendeur n'a pas assez de ${itemVendu.name} !`);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -259,13 +349,13 @@ export class RdDBaseActor extends Actor {
|
|||||||
await this.decrementerVente(vendeur, itemVendu, quantite, cout);
|
await this.decrementerVente(vendeur, itemVendu, quantite, cout);
|
||||||
if (acheteur) {
|
if (acheteur) {
|
||||||
await acheteur.depenserSols(cout);
|
await acheteur.depenserSols(cout);
|
||||||
const createdItemId = await acheteur.creerQuantiteItem(vente.item, quantite);
|
const createdItemId = await acheteur.creerQuantiteItem(itemVendu, quantite);
|
||||||
await acheteur.consommerNourritureAchetee(achat, vente, createdItemId);
|
await acheteur.consommerNourritureAchetee(achat, achat.vente, createdItemId);
|
||||||
}
|
}
|
||||||
if (cout > 0) {
|
if (cout > 0) {
|
||||||
RdDAudio.PlayContextAudio("argent");
|
RdDAudio.PlayContextAudio("argent");
|
||||||
}
|
}
|
||||||
const chatAchatItem = duplicate(vente);
|
const chatAchatItem = duplicate(achat.vente);
|
||||||
chatAchatItem.quantiteTotal = quantite;
|
chatAchatItem.quantiteTotal = quantite;
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
user: achat.userId,
|
user: achat.userId,
|
||||||
@@ -274,16 +364,16 @@ export class RdDBaseActor extends Actor {
|
|||||||
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.html', chatAchatItem)
|
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.html', chatAchatItem)
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!vente.quantiteIllimite) {
|
if (!achat.vente.quantiteIllimite) {
|
||||||
if (vente.quantiteNbLots <= achat.choix.nombreLots) {
|
if (achat.vente.quantiteNbLots <= achat.choix.nombreLots) {
|
||||||
ChatUtility.removeChatMessageId(achat.chatMessageIdVente);
|
ChatUtility.removeChatMessageId(achat.chatMessageIdVente);
|
||||||
}
|
}
|
||||||
else if (achat.chatMessageIdVente) {
|
else if (achat.chatMessageIdVente) {
|
||||||
vente["properties"] = itemVendu.getProprietes();
|
achat.vente.properties = itemVendu.getProprietes();
|
||||||
vente.quantiteNbLots -= achat.choix.nombreLots;
|
achat.vente.quantiteNbLots -= achat.choix.nombreLots;
|
||||||
vente.jsondata = JSON.stringify(vente.item);
|
achat.vente.jsondata = JSON.stringify(achat.vente.item);
|
||||||
const messageVente = game.messages.get(achat.chatMessageIdVente);
|
const messageVente = game.messages.get(achat.chatMessageIdVente);
|
||||||
messageVente.update({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente) });
|
messageVente.update({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', achat.vente) });
|
||||||
messageVente.render(true);
|
messageVente.render(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -300,9 +390,9 @@ export class RdDBaseActor extends Actor {
|
|||||||
return this.getFortune() >= cout;
|
return this.getFortune() >= cout;
|
||||||
}
|
}
|
||||||
|
|
||||||
verifierQuantite(vendeur, item, quantiteTotal) {
|
verifierQuantite(item, quantiteDemande) {
|
||||||
const disponible = vendeur?.getQuantiteDisponible(item);
|
const disponible = this.getQuantiteDisponible(item);
|
||||||
return disponible == undefined || disponible >= quantiteTotal;
|
return disponible == undefined || disponible >= quantiteDemande;
|
||||||
}
|
}
|
||||||
|
|
||||||
async consommerNourritureAchetee(achat, vente, createdItemId) {
|
async consommerNourritureAchetee(achat, vente, createdItemId) {
|
||||||
@@ -350,14 +440,6 @@ export class RdDBaseActor extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
computeMalusSurEncombrement() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
getEncombrementMax() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
async computeEncTotal() {
|
async computeEncTotal() {
|
||||||
if (!this.pack) {
|
if (!this.pack) {
|
||||||
this.encTotal = this.items.map(it => it.getEncTotal()).reduce(Misc.sum(), 0);
|
this.encTotal = this.items.map(it => it.getEncTotal()).reduce(Misc.sum(), 0);
|
||||||
@@ -366,6 +448,10 @@ export class RdDBaseActor extends Actor {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getEncTotal() {
|
||||||
|
return Math.floor(this.encTotal ?? 0);
|
||||||
|
}
|
||||||
|
|
||||||
async createItem(type, name = undefined) {
|
async createItem(type, name = undefined) {
|
||||||
if (!name) {
|
if (!name) {
|
||||||
name = 'Nouveau ' + Misc.typeName('Item', type);
|
name = 'Nouveau ' + Misc.typeName('Item', type);
|
||||||
@@ -430,62 +516,33 @@ export class RdDBaseActor extends Actor {
|
|||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
conteneurPeutContenir(dest, item) {
|
conteneurPeutContenir(dest, moved) {
|
||||||
if (!dest) {
|
if (!dest) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!dest.isConteneur()) {
|
if (!dest.isConteneur()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const destData = dest
|
if (moved.isConteneurContenu(dest)) {
|
||||||
if (this._isConteneurContenu(item, dest)) {
|
ui.notifications.warn(`Impossible de déplacer un conteneur parent (${moved.name}) dans un de ses contenus ${dest.name} !`);
|
||||||
ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${destData.name} !`);
|
return false;
|
||||||
return false; // Loop detected !
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculer le total actuel des contenus
|
// Calculer le total actuel des contenus
|
||||||
let encContenu = this.getRecursiveEnc(dest) - Number(destData.system.encombrement);
|
const encContenu = dest.getEncContenu();
|
||||||
let newEnc = this.getRecursiveEnc(item); // Calculer le total actuel du nouvel objet
|
const newEnc = moved.getEncTotal(); // Calculer le total actuel du nouvel objet
|
||||||
|
const placeDisponible = Math.roundDecimals(dest.system.capacite - encContenu - newEnc, 4)
|
||||||
|
|
||||||
// Teste si le conteneur de destination a suffisament de capacité pour recevoir le nouvel objet
|
// Teste si le conteneur de destination a suffisament de capacité pour recevoir le nouvel objet
|
||||||
if (Number(destData.system.capacite) < encContenu + newEnc) {
|
if (placeDisponible < 0) {
|
||||||
ui.notifications.warn(
|
ui.notifications.warn(
|
||||||
`Le conteneur ${dest.name} a une capacité de ${destData.system.capacite}, et contient déjà ${encContenu}.
|
`Le conteneur ${dest.name} a une capacité de ${dest.system.capacite}, et contient déjà ${encContenu}.
|
||||||
Impossible d'y ranger: ${item.name} d'encombrement ${newEnc}!`);
|
Impossible d'y ranger: ${moved.name} d'encombrement ${newEnc}!`);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
_isConteneurContenu(item, conteneur) {
|
|
||||||
if (item?.isConteneur()) { // Si c'est un conteneur, il faut vérifier qu'on ne le déplace pas vers un sous-conteneur lui appartenant
|
|
||||||
for (let id of item.system.contenu) {
|
|
||||||
let subObjet = this.getItem(id);
|
|
||||||
if (subObjet?.id == conteneur.id) {
|
|
||||||
return true; // Loop detected !
|
|
||||||
}
|
|
||||||
if (subObjet?.isConteneur()) {
|
|
||||||
return this._isConteneurContenu(subObjet, conteneur);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getRecursiveEnc(objet) {
|
|
||||||
if (!objet) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
const tplData = objet.system;
|
|
||||||
if (objet.type != 'conteneur') {
|
|
||||||
return Number(tplData.encombrement) * Number(tplData.quantite);
|
|
||||||
}
|
|
||||||
const encContenus = tplData.contenu.map(idContenu => this.getRecursiveEnc(this.getItem(idContenu)));
|
|
||||||
return encContenus.reduce(Misc.sum(), 0)
|
|
||||||
+ Number(tplData.encombrement) /* TODO? Number(tplData.quantite) -- on pourrait avoir plusieurs conteneurs...*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/** Ajoute un item dans un conteneur, sur la base
|
/** Ajoute un item dans un conteneur, sur la base
|
||||||
* de leurs ID */
|
* de leurs ID */
|
||||||
@@ -623,5 +680,20 @@ export class RdDBaseActor extends Actor {
|
|||||||
.then(html => ChatMessage.create(RdDUtility.chatDataSetup(html, modeOverride)));
|
.then(html => ChatMessage.create(RdDUtility.chatDataSetup(html, modeOverride)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
actionImpossible(action) {
|
||||||
|
ui.notifications.info(`${this.name} ne peut pas faire cette action: ${action}`)
|
||||||
|
|
||||||
|
}
|
||||||
|
async roll() { this.actionImpossible("jet de caractéristiques") }
|
||||||
|
async jetEthylisme() { this.actionImpossible("jet d'éthylisme") }
|
||||||
|
async rollAppelChance() { this.actionImpossible("appel à la chance") }
|
||||||
|
async jetDeMoral() { this.actionImpossible("jet de moral") }
|
||||||
|
|
||||||
|
async actionPrincipale(item, onActionItem = async () => { }) {
|
||||||
|
switch (item.type) {
|
||||||
|
case TYPES.conteneur: return await item.sheet.render(true);
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
import { DialogItemAchat } from "../dialog-item-achat.js";
|
import { DialogItemAchat } from "../dialog-item-achat.js";
|
||||||
import { RdDItem } from "../item.js";
|
import { RdDItem } from "../item.js";
|
||||||
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
|
||||||
import { RdDUtility } from "../rdd-utility.js";
|
import { RdDUtility } from "../rdd-utility.js";
|
||||||
import { RdDBaseActorSheet } from "./base-actor-sheet.js";
|
import { RdDBaseActorSheet } from "./base-actor-sheet.js";
|
||||||
import { RdDCommerce } from "./commerce.js";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend the basic ActorSheet with some very simple modifications
|
* Extend the basic ActorSheet with some very simple modifications
|
||||||
@@ -14,12 +12,9 @@ export class RdDCommerceSheet extends RdDBaseActorSheet {
|
|||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
return mergeObject(super.defaultOptions, {
|
return mergeObject(super.defaultOptions, {
|
||||||
classes: ["rdd", "sheet", "actor"],
|
|
||||||
template: "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-actor-sheet.html",
|
template: "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-actor-sheet.html",
|
||||||
width: 600,
|
width: 600, height: 720,
|
||||||
height: 720,
|
tabs: []
|
||||||
tabs: [],
|
|
||||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }]
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
get title() {
|
get title() {
|
||||||
|
|||||||
@@ -7,27 +7,18 @@ export class RdDCommerce extends RdDBaseActor {
|
|||||||
return "systems/foundryvtt-reve-de-dragon/icons/services/commerce.webp";
|
return "systems/foundryvtt-reve-de-dragon/icons/services/commerce.webp";
|
||||||
}
|
}
|
||||||
|
|
||||||
prepareData() {
|
|
||||||
super.prepareData();
|
|
||||||
}
|
|
||||||
prepareDerivedData() {
|
|
||||||
super.prepareDerivedData();
|
|
||||||
}
|
|
||||||
|
|
||||||
canReceive(item) {
|
canReceive(item) {
|
||||||
if (item.isInventaire('all')) {
|
return item.isInventaire('all');
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return super.canReceive(item);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getQuantiteDisponible(item) {
|
getQuantiteDisponible(item) {
|
||||||
return this.system.illimite || item.isService() ? undefined : item.getQuantite();
|
return (this.system.illimite || item?.isService()) ? undefined : item.getQuantite();
|
||||||
}
|
}
|
||||||
|
|
||||||
verifierFortune(cout) {
|
verifierFortune(cout) {
|
||||||
return this.system.illimite || super.verifierFortune(cout);
|
return this.system.illimite || super.verifierFortune(cout);
|
||||||
}
|
}
|
||||||
|
|
||||||
async depenserSols(cout) {
|
async depenserSols(cout) {
|
||||||
if (this.system.illimite) {
|
if (this.system.illimite) {
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -1,20 +1,16 @@
|
|||||||
import { RdDActorSheet } from "./actor-sheet.js";
|
import { RdDBaseActorReveSheet } from "./base-actor-reve-sheet.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend the basic ActorSheet with some very simple modifications
|
* Extend the basic ActorSheet with some very simple modifications
|
||||||
* @extends {ActorSheet}
|
* @extends {ActorSheet}
|
||||||
*/
|
*/
|
||||||
export class RdDActorCreatureSheet extends RdDActorSheet {
|
export class RdDCreatureSheet extends RdDBaseActorReveSheet {
|
||||||
|
|
||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
return mergeObject(super.defaultOptions, {
|
return mergeObject(RdDBaseActorReveSheet.defaultOptions, {
|
||||||
classes: ["rdd", "sheet", "actor"],
|
|
||||||
template: "systems/foundryvtt-reve-de-dragon/templates/actor-creature-sheet.html",
|
template: "systems/foundryvtt-reve-de-dragon/templates/actor-creature-sheet.html",
|
||||||
width: 640,
|
width: 640, height: 720
|
||||||
height: 720,
|
|
||||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
|
|
||||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }]
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
65
module/actor/creature.js
Normal file
65
module/actor/creature.js
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
import { ENTITE_INCARNE } from "../constants.js";
|
||||||
|
import { STATUSES } from "../settings/status-effects.js";
|
||||||
|
import { RdDBaseActorSang } from "./base-actor-sang.js";
|
||||||
|
|
||||||
|
export class RdDCreature extends RdDBaseActorSang {
|
||||||
|
|
||||||
|
static get defaultIcon() {
|
||||||
|
return "systems/foundryvtt-reve-de-dragon/icons/creatures/bramart.svg";
|
||||||
|
}
|
||||||
|
|
||||||
|
isCreature() { return true }
|
||||||
|
|
||||||
|
canReceive(item) {
|
||||||
|
return item.type == TYPES.competencecreature || item.isInventaire();
|
||||||
|
}
|
||||||
|
|
||||||
|
async remiseANeuf() {
|
||||||
|
await this.removeEffects(e => true);
|
||||||
|
await this.supprimerBlessures(it => true);
|
||||||
|
const updates = {
|
||||||
|
'system.sante.endurance.value': this.system.sante.endurance.max,
|
||||||
|
'system.sante.vie.value': this.system.sante.vie.max,
|
||||||
|
'system.sante.fatigue.value': 0
|
||||||
|
};
|
||||||
|
await this.update(updates);
|
||||||
|
}
|
||||||
|
|
||||||
|
async finDeRoundBlessures() {
|
||||||
|
const nbGraves = this.filterItems(it => it.isGrave(), 'blessure').length;
|
||||||
|
if (nbGraves > 0) {
|
||||||
|
// Gestion blessure graves : -1 pt endurance par blessure grave
|
||||||
|
await this.santeIncDec("endurance", -nbGraves);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isEffectAllowed(statusId) {
|
||||||
|
return [STATUSES.StatusComma].includes(statusId);
|
||||||
|
}
|
||||||
|
|
||||||
|
isEntiteAccordee(attacker) {
|
||||||
|
if (this.isEntite([ENTITE_INCARNE])) {
|
||||||
|
let resonnance = this.system.sante.resonnance
|
||||||
|
return (resonnance.actors.find(it => it == attacker.id))
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async setEntiteReveAccordee(attacker) {
|
||||||
|
if (this.isEntite([ENTITE_INCARNE])) {
|
||||||
|
let resonnance = duplicate(this.system.sante.resonnance);
|
||||||
|
if (resonnance.actors.find(it => it == attacker.id)) {
|
||||||
|
// déjà accordé
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resonnance.actors.push(attacker.id);
|
||||||
|
await this.update({ "system.sante.resonnance": resonnance });
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
super.setEntiteReveAccordee(attacker)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
62
module/actor/entite-sheet.js
Normal file
62
module/actor/entite-sheet.js
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
import { RdDBaseActorReveSheet } from "./base-actor-reve-sheet.js";
|
||||||
|
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
|
||||||
|
import { RdDUtility } from "../rdd-utility.js";
|
||||||
|
|
||||||
|
export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
static get defaultOptions() {
|
||||||
|
return mergeObject(RdDBaseActorReveSheet.defaultOptions, {
|
||||||
|
template: "systems/foundryvtt-reve-de-dragon/templates/actor-entite-sheet.html",
|
||||||
|
width: 640, height: 720,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async getData() {
|
||||||
|
let formData = await super.getData();
|
||||||
|
formData.resonances = this.actor.system.sante.resonnance.actors.map(actorId => game.actors.get(actorId))
|
||||||
|
.map(actor => { return { id: actor.id, name: actor.name, img: actor.img } })
|
||||||
|
return formData
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/** @override */
|
||||||
|
activateListeners(html) {
|
||||||
|
super.activateListeners(html);
|
||||||
|
|
||||||
|
// Everything below here is only needed if the sheet is editable
|
||||||
|
if (!this.options.editable) return;
|
||||||
|
|
||||||
|
// On competence change
|
||||||
|
this.html.find('.creature-carac').change(async event => {
|
||||||
|
let compName = event.currentTarget.attributes.compname.value;
|
||||||
|
this.actor.updateCreatureCompetence(compName, "carac_value", parseInt(event.target.value));
|
||||||
|
});
|
||||||
|
this.html.find('.creature-niveau').change(async event => {
|
||||||
|
let compName = event.currentTarget.attributes.compname.value;
|
||||||
|
this.actor.updateCreatureCompetence(compName, "niveau", parseInt(event.target.value));
|
||||||
|
});
|
||||||
|
this.html.find('.creature-dommages').change(async event => {
|
||||||
|
let compName = event.currentTarget.attributes.compname.value;
|
||||||
|
this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value));
|
||||||
|
});
|
||||||
|
this.html.find('.resonance-delete').click(async event => {
|
||||||
|
const li = RdDSheetUtility.getEventElement(event);
|
||||||
|
const actorId = li.data("actor-id");
|
||||||
|
if (actorId) {
|
||||||
|
const actorResonance = game.actors.get(actorId);
|
||||||
|
RdDUtility.confirmerSuppressionSubacteur(this, actorResonance, li, () => {
|
||||||
|
console.log('Delete : ', actorId);
|
||||||
|
this.removeSubacteur(actorId);
|
||||||
|
RdDUtility.slideOnDelete(this, li);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeSubacteur(actorId) {
|
||||||
|
let newResonances = this.actor.system.sante.resonnance.actors.filter(id => id != actorId);
|
||||||
|
await this.actor.update({ 'system.sante.resonnance.actors': newResonances }, { renderSheet: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
110
module/actor/entite.js
Normal file
110
module/actor/entite.js
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
|
||||||
|
import { TYPES } from "../item.js";
|
||||||
|
import { Misc } from "../misc.js";
|
||||||
|
import { RdDEncaisser } from "../rdd-roll-encaisser.js";
|
||||||
|
import { STATUSES } from "../settings/status-effects.js";
|
||||||
|
import { RdDBaseActorReve } from "./base-actor-reve.js";
|
||||||
|
|
||||||
|
export class RdDEntite extends RdDBaseActorReve {
|
||||||
|
|
||||||
|
static get defaultIcon() {
|
||||||
|
return "systems/foundryvtt-reve-de-dragon/icons/entites/darquoine.webp";
|
||||||
|
}
|
||||||
|
|
||||||
|
canReceive(item) {
|
||||||
|
return item.type == TYPES.competencecreature
|
||||||
|
}
|
||||||
|
|
||||||
|
isEntite(typeentite = []) {
|
||||||
|
return (typeentite.length == 0 || typeentite.includes(this.system.definition.typeentite));
|
||||||
|
}
|
||||||
|
isNonIncarnee() { return this.isEntite([ENTITE_NONINCARNE]) }
|
||||||
|
|
||||||
|
getReveActuel() {
|
||||||
|
return Misc.toInt(this.system.carac.reve?.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
getForce() { return this.getReve() }
|
||||||
|
getAgilite() { return this.getReve() }
|
||||||
|
getChance() { return this.getReve() }
|
||||||
|
|
||||||
|
getDraconicOuPossession() {
|
||||||
|
return this.itemTypes[TYPES.competencecreature]
|
||||||
|
.filter(it => it.system.categorie == 'possession')
|
||||||
|
.sort(Misc.descending(it => it.system.niveau))
|
||||||
|
.find(it => true);
|
||||||
|
}
|
||||||
|
|
||||||
|
async remiseANeuf() {
|
||||||
|
await this.removeEffects(e => true);
|
||||||
|
if (!this.isNonIncarnee()) {
|
||||||
|
await this.update({
|
||||||
|
'system.sante.endurance.value': this.system.sante.endurance.max
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isDead() {
|
||||||
|
return this.isNonIncarnee() ? false : this.system.sante.endurance.value <= 0
|
||||||
|
}
|
||||||
|
|
||||||
|
async santeIncDec(name, inc, isCritique = false) {
|
||||||
|
if (name == 'endurance' && !this.isNonIncarnee()) {
|
||||||
|
const oldValue = this.system.sante.endurance.value;
|
||||||
|
const endurance = Math.max(0,
|
||||||
|
Math.min(oldValue + inc,
|
||||||
|
this.system.sante.endurance.max));
|
||||||
|
await this.update({ "system.sante.endurance.value": endurance })
|
||||||
|
await this.setEffect(STATUSES.StatusComma, endurance <= 0);
|
||||||
|
return {
|
||||||
|
perte: oldValue - endurance,
|
||||||
|
newValue: endurance
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
async encaisser() {
|
||||||
|
if (this.isNonIncarnee()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
await RdDEncaisser.encaisser(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
isEffectAllowed(statusId) {
|
||||||
|
return [STATUSES.StatusComma].includes(statusId);
|
||||||
|
}
|
||||||
|
|
||||||
|
async onAppliquerJetEncaissement(encaissement, attacker) {
|
||||||
|
const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance);
|
||||||
|
mergeObject(encaissement, {
|
||||||
|
resteEndurance: perteEndurance.newValue,
|
||||||
|
endurance: perteEndurance.perte
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
isEntiteAccordee(attacker) {
|
||||||
|
if (this.isEntite([ENTITE_INCARNE])) {
|
||||||
|
let resonnance = this.system.sante.resonnance
|
||||||
|
return (resonnance.actors.find(it => it == attacker.id))
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async setEntiteReveAccordee(attacker) {
|
||||||
|
if (this.isEntite([ENTITE_INCARNE])) {
|
||||||
|
let resonnance = duplicate(this.system.sante.resonnance);
|
||||||
|
if (resonnance.actors.find(it => it == attacker.id)) {
|
||||||
|
// déjà accordé
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resonnance.actors.push(attacker.id);
|
||||||
|
await this.update({ "system.sante.resonnance": resonnance });
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
super.setEntiteReveAccordee(attacker)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
39
module/actor/experience-log.js
Normal file
39
module/actor/experience-log.js
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
export const XP_TOPIC = {
|
||||||
|
XP: { code: 'xp', label: 'xp' },
|
||||||
|
XPSORT: { code: 'xpsort', label: 'xp sort' },
|
||||||
|
NIVEAU: { code: 'niveau', label: 'Niveau' },
|
||||||
|
XPCARAC: { code: 'xpcarac', label: 'xp carac' },
|
||||||
|
CARAC: { code: 'carac', label: 'Carac' },
|
||||||
|
STRESS: { code: 'stress', label: 'Stress' },
|
||||||
|
TRANSFORM: { code: 'xps', label: 'Transformé' },
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ExperienceLog {
|
||||||
|
|
||||||
|
static async add(actor, topic, from, to, raison, manuel = false) {
|
||||||
|
if (!actor.hasPlayerOwner || !actor.isPersonnage()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (from == to) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const newXpLog = {
|
||||||
|
mode: topic?.code ?? topic,
|
||||||
|
raison: (manuel ? '(manuel) ' : '') + raison,
|
||||||
|
from: from,
|
||||||
|
to: to,
|
||||||
|
valeur: to - from,
|
||||||
|
daterdd: game.system.rdd.calendrier.dateCourante(),
|
||||||
|
datereel: game.system.rdd.calendrier.dateReel().replace('T', ' ')
|
||||||
|
};
|
||||||
|
console.log('ExperienceLog.add', newXpLog)
|
||||||
|
const newExperienceLog = (actor.system.experiencelog ?? []).concat([newXpLog]);
|
||||||
|
await actor.update({ [`system.experiencelog`]: newExperienceLog });
|
||||||
|
}
|
||||||
|
|
||||||
|
static labelTopic(topic) {
|
||||||
|
const xpt = Object.values(XP_TOPIC).find(it => it.code == topic);
|
||||||
|
return xpt?.label ?? xpt?.code ?? topic;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,23 +1,35 @@
|
|||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "../rdd-utility.js";
|
||||||
import { RdDActorSheet } from "./actor-sheet.js";
|
import { RdDBaseActorSheet } from "./base-actor-sheet.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDActorVehiculeSheet extends RdDActorSheet {
|
export class RdDActorVehiculeSheet extends RdDBaseActorSheet {
|
||||||
|
|
||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
RdDUtility.initAfficheContenu();
|
RdDUtility.initAfficheContenu();
|
||||||
|
|
||||||
return mergeObject(super.defaultOptions, {
|
return mergeObject(RdDBaseActorSheet.defaultOptions, {
|
||||||
classes: ["rdd", "sheet", "actor"],
|
|
||||||
template: "systems/foundryvtt-reve-de-dragon/templates/actor-vehicule-sheet.html",
|
template: "systems/foundryvtt-reve-de-dragon/templates/actor-vehicule-sheet.html",
|
||||||
width: 640,
|
width: 640, height: 720,
|
||||||
height: 720,
|
|
||||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
|
|
||||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }]
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async getData() {
|
||||||
|
let formData = await super.getData();
|
||||||
|
mergeObject(formData,
|
||||||
|
{
|
||||||
|
editable: this.isEditable,
|
||||||
|
cssClass: this.isEditable ? "editable" : "locked",
|
||||||
|
effects: this.actor.effects.map(e => foundry.utils.deepClone(e)),
|
||||||
|
limited: this.actor.limited,
|
||||||
|
owner: this.actor.isOwner,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.timerRecherche = undefined;
|
||||||
|
return formData;
|
||||||
|
}
|
||||||
|
|
||||||
activateListeners(html) {
|
activateListeners(html) {
|
||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
if (!this.options.editable) return;
|
if (!this.options.editable) return;
|
||||||
28
module/actor/vehicule.js
Normal file
28
module/actor/vehicule.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { RdDBaseActor } from "./base-actor.js";
|
||||||
|
|
||||||
|
export class RdDVehicule extends RdDBaseActor {
|
||||||
|
|
||||||
|
static get defaultIcon() {
|
||||||
|
return "systems/foundryvtt-reve-de-dragon/icons/vehicules/charette.webp";
|
||||||
|
}
|
||||||
|
isVehicule() { return true }
|
||||||
|
|
||||||
|
canReceive(item) {
|
||||||
|
return item.isInventaire();
|
||||||
|
}
|
||||||
|
|
||||||
|
getEncombrementMax() {
|
||||||
|
return this.system.capacite_encombrement;
|
||||||
|
}
|
||||||
|
|
||||||
|
async vehicleIncDec(name, inc) {
|
||||||
|
if (!['resistance', 'structure'].includes(name)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const newValue = this.system.etat[name].value + inc;
|
||||||
|
if (0 <= newValue && newValue <= this.system.etat[name].max) {
|
||||||
|
await this.update({ [`system.etat.${name}.value`]: newValue })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -78,11 +78,7 @@ export class ChatUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async createChatWithRollMode(name, chatOptions) {
|
static async createChatWithRollMode(name, chatOptions) {
|
||||||
return await ChatUtility.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions);
|
let rollMode = game.settings.get("core", "rollMode")
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static async createChatMessage(name, rollMode, chatOptions) {
|
|
||||||
switch (rollMode) {
|
switch (rollMode) {
|
||||||
case "blindroll": // GM only
|
case "blindroll": // GM only
|
||||||
if (!game.user.isGM) {
|
if (!game.user.isGM) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { SYSTEM_RDD } from "./constants.js";
|
import { SYSTEM_RDD } from "./constants.js";
|
||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { HtmlUtility } from "./html-utility.js";
|
import { HtmlUtility } from "./html-utility.js";
|
||||||
import { RdDTimestamp } from "./rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
|
|
||||||
|
|
||||||
const LATEST_USED_JOURNAL_ID = "chronologie-dernier-journal";
|
const LATEST_USED_JOURNAL_ID = "chronologie-dernier-journal";
|
||||||
@@ -25,23 +25,13 @@ export class DialogChronologie extends Dialog {
|
|||||||
journalId: game.settings.get(SYSTEM_RDD, LATEST_USED_JOURNAL_ID),
|
journalId: game.settings.get(SYSTEM_RDD, LATEST_USED_JOURNAL_ID),
|
||||||
journaux: game.journal.filter(it => it.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)),
|
journaux: game.journal.filter(it => it.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)),
|
||||||
timestamp: game.system.rdd.calendrier.timestamp,
|
timestamp: game.system.rdd.calendrier.timestamp,
|
||||||
dateReel: DialogChronologie.getCurrentDateTime()
|
dateReel: game.system.rdd.calendrier.dateReel()
|
||||||
};
|
};
|
||||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-chronologie.html", dialogData);
|
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-chronologie.html", dialogData);
|
||||||
const dialog = new DialogChronologie(html, dialogData);
|
const dialog = new DialogChronologie(html, dialogData);
|
||||||
dialog.render(true);
|
dialog.render(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static getCurrentDateTime() {
|
|
||||||
return new Date().toLocaleString("sv-SE", {
|
|
||||||
year: "numeric",
|
|
||||||
month: "2-digit",
|
|
||||||
day: "2-digit",
|
|
||||||
hour: "2-digit",
|
|
||||||
minute: "2-digit"
|
|
||||||
}).replace(" ", "T");
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(html, dialogData) {
|
constructor(html, dialogData) {
|
||||||
const options = {
|
const options = {
|
||||||
classes: ["DialogChronologie"],
|
classes: ["DialogChronologie"],
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ export class DialogCreateSigneDraconique extends Dialog {
|
|||||||
.map(actor => ({
|
.map(actor => ({
|
||||||
id: actor.id,
|
id: actor.id,
|
||||||
name: actor.name,
|
name: actor.name,
|
||||||
selected: true
|
selected: false
|
||||||
}))
|
}))
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ export class DialogCreateSigneDraconique extends Dialog {
|
|||||||
|
|
||||||
onSelectTmr(event) {
|
onSelectTmr(event) {
|
||||||
const tmrName = this.html.find(event.currentTarget)?.data("tmr-name");
|
const tmrName = this.html.find(event.currentTarget)?.data("tmr-name");
|
||||||
const onTmr = this.tmrs.find(it => it.name == tmrName);
|
const onTmr = this.dialogData.tmrs.find(it => it.name == tmrName);
|
||||||
if (onTmr){
|
if (onTmr){
|
||||||
onTmr.selected = event.currentTarget.checked;
|
onTmr.selected = event.currentTarget.checked;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { RdDUtility } from "./rdd-utility.js";
|
|||||||
export class DialogFabriquerPotion extends Dialog {
|
export class DialogFabriquerPotion extends Dialog {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async create(actor, item, dialogConfig) {
|
static async create(actor, item, onActionItem) {
|
||||||
const min = DialogFabriquerPotion.nombreBrinsMinimum(item);
|
const min = DialogFabriquerPotion.nombreBrinsMinimum(item);
|
||||||
if (item.system.quantite < min) {
|
if (item.system.quantite < min) {
|
||||||
ui.notifications.warn(`Vous avez ${item.system.quantite} brins de ${item.name}, il en faut au moins ${min} pour faire une potion!`);
|
ui.notifications.warn(`Vous avez ${item.system.quantite} brins de ${item.name}, il en faut au moins ${min} pour faire une potion!`);
|
||||||
@@ -13,12 +13,10 @@ export class DialogFabriquerPotion extends Dialog {
|
|||||||
}
|
}
|
||||||
let potionData = DialogFabriquerPotion.prepareData(actor, item);
|
let potionData = DialogFabriquerPotion.prepareData(actor, item);
|
||||||
|
|
||||||
const html = await renderTemplate(dialogConfig.html, potionData);
|
const html = await renderTemplate( 'systems/foundryvtt-reve-de-dragon/templates/dialog-fabriquer-potion-base.html', potionData);
|
||||||
|
|
||||||
let options = { classes: ["dialogfabriquerpotion"], width: 600, height: 160, 'z-index': 99999 };
|
let options = { classes: ["dialogfabriquerpotion"], width: 600, height: 160, 'z-index': 99999 };
|
||||||
mergeObject(options, dialogConfig.options ?? {}, { overwrite: true })
|
new DialogFabriquerPotion(actor, potionData, onActionItem, html, options).render(true);
|
||||||
|
|
||||||
new DialogFabriquerPotion(actor, potionData, html, options).render(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -34,14 +32,14 @@ export class DialogFabriquerPotion extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
constructor(actor, potionData, html, options) {
|
constructor(actor, potionData, onActionItem, html, options) {
|
||||||
const conf = {
|
const conf = {
|
||||||
title: `Fabriquer une potion de ${potionData.system.categorie}`,
|
title: `Fabriquer une potion de ${potionData.system.categorie}`,
|
||||||
content: html,
|
content: html,
|
||||||
default: 'fabriquer',
|
default: 'fabriquer',
|
||||||
buttons: {
|
buttons: {
|
||||||
'fabriquer': {
|
'fabriquer': {
|
||||||
label: potionData.buttonName, callback: it => this.onFabriquer(html)
|
label: potionData.buttonName, callback: it => this.onFabriquer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -50,6 +48,7 @@ export class DialogFabriquerPotion extends Dialog {
|
|||||||
|
|
||||||
this.actor = actor;
|
this.actor = actor;
|
||||||
this.potionData = potionData;
|
this.potionData = potionData;
|
||||||
|
this.onActionItem = onActionItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -64,10 +63,11 @@ export class DialogFabriquerPotion extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async onFabriquer(html) {
|
async onFabriquer() {
|
||||||
await this.html.find("[name='nbBrins']").change();
|
await this.html.find("[name='nbBrins']").change();
|
||||||
this.actor.fabriquerPotion(this.potionData);
|
await this.actor.fabriquerPotion(this.potionData);
|
||||||
this.close();
|
this.close();
|
||||||
|
await this.onActionItem()
|
||||||
}
|
}
|
||||||
|
|
||||||
static nombreBrinsMinimum(herbeData) {
|
static nombreBrinsMinimum(herbeData) {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export class DialogItemAchat extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
item: (json ? JSON.parse(json) : undefined),
|
item: JSON.parse(json),
|
||||||
vendeur,
|
vendeur,
|
||||||
acheteur,
|
acheteur,
|
||||||
nbLots: parseInt(chatButton.attributes['data-quantiteNbLots']?.value),
|
nbLots: parseInt(chatButton.attributes['data-quantiteNbLots']?.value),
|
||||||
@@ -34,7 +34,6 @@ export class DialogItemAchat extends Dialog {
|
|||||||
const venteData = {
|
const venteData = {
|
||||||
item,
|
item,
|
||||||
actingUserId: game.user.id,
|
actingUserId: game.user.id,
|
||||||
vendeurId: vendeur?.id,
|
|
||||||
vendeur,
|
vendeur,
|
||||||
acheteur,
|
acheteur,
|
||||||
tailleLot,
|
tailleLot,
|
||||||
|
|||||||
@@ -1,57 +0,0 @@
|
|||||||
|
|
||||||
export class DialogRepos extends Dialog {
|
|
||||||
|
|
||||||
static async create(actor) {
|
|
||||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-repos.html", actor);
|
|
||||||
const dialog = new DialogRepos(html, actor);
|
|
||||||
dialog.render(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(html, actor) {
|
|
||||||
let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 400, height: 'fit-content', 'z-index': 99999 };
|
|
||||||
let conf = {
|
|
||||||
title: "Se reposer",
|
|
||||||
content: html,
|
|
||||||
default: "repos",
|
|
||||||
buttons: {
|
|
||||||
"repos": { label: "Se reposer", callback: async it => { this.repos(); } }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
super(conf, options);
|
|
||||||
this.actor = actor;
|
|
||||||
}
|
|
||||||
activateListeners(html) {
|
|
||||||
super.activateListeners(html);
|
|
||||||
this.html = html;
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
|
|
||||||
async repos() {
|
|
||||||
await this.html.find("[name='nb-heures']").change();
|
|
||||||
await this.html.find("[name='nb-jours']").change();
|
|
||||||
const selection = await this.html.find("[name='repos']:checked").val();
|
|
||||||
const nbHeures = Number.parseInt(await this.html.find("[name='nb-heures']").val());
|
|
||||||
const nbJours = Number.parseInt(await this.html.find("[name='nb-jours']").val());
|
|
||||||
console.log("ACTOR", this.actor)
|
|
||||||
switch (selection) {
|
|
||||||
case "sieste": {
|
|
||||||
await this.actor.dormir(nbHeures);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case "nuit": {
|
|
||||||
let heuresDormies = await this.actor.dormir(nbHeures);
|
|
||||||
if (heuresDormies == nbHeures) {
|
|
||||||
await this.actor.dormirChateauDormant();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case "chateau-dormant":
|
|
||||||
await this.actor.dormirChateauDormant();
|
|
||||||
return;
|
|
||||||
case "gris-reve": {
|
|
||||||
await this.actor.grisReve(nbJours);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,23 +7,22 @@ import { RdDUtility } from "./rdd-utility.js";
|
|||||||
*/
|
*/
|
||||||
export class DialogValidationEncaissement extends Dialog {
|
export class DialogValidationEncaissement extends Dialog {
|
||||||
|
|
||||||
static async validerEncaissement(actor, rollData, armure, show, onEncaisser) {
|
static async validerEncaissement(actor, rollData, armure, onEncaisser) {
|
||||||
let encaissement = await RdDUtility.jetEncaissement(rollData, armure, { showDice: HIDE_DICE });
|
let encaissement = await RdDUtility.jetEncaissement(rollData, armure, { showDice: HIDE_DICE });
|
||||||
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-validation-encaissement.html', {
|
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-validation-encaissement.html', {
|
||||||
actor: actor,
|
actor: actor,
|
||||||
rollData: rollData,
|
rollData: rollData,
|
||||||
encaissement: encaissement,
|
encaissement: encaissement
|
||||||
show: show
|
|
||||||
});
|
});
|
||||||
const dialog = new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, show, onEncaisser);
|
const dialog = new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, onEncaisser);
|
||||||
dialog.render(true);
|
dialog.render(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
constructor(html, actor, rollData, armure, encaissement, show, onEncaisser) {
|
constructor(html, actor, rollData, armure, encaissement, onEncaisser) {
|
||||||
// Common conf
|
// Common conf
|
||||||
let buttons = {
|
let buttons = {
|
||||||
"valider": { label: "Valider", callback: html => this.validerEncaissement() },
|
"valider": { label: "Valider", callback: html => this.onValider() },
|
||||||
"annuler": { label: "Annuler", callback: html => { } },
|
"annuler": { label: "Annuler", callback: html => { } },
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -47,7 +46,6 @@ export class DialogValidationEncaissement extends Dialog {
|
|||||||
this.rollData = rollData;
|
this.rollData = rollData;
|
||||||
this.armure = armure;
|
this.armure = armure;
|
||||||
this.encaissement = encaissement;
|
this.encaissement = encaissement;
|
||||||
this.show = show;
|
|
||||||
this.onEncaisser = onEncaisser;
|
this.onEncaisser = onEncaisser;
|
||||||
this.forceDiceResult = {total: encaissement.roll.result };
|
this.forceDiceResult = {total: encaissement.roll.result };
|
||||||
}
|
}
|
||||||
@@ -64,8 +62,8 @@ export class DialogValidationEncaissement extends Dialog {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async validerEncaissement() {
|
async onValider() {
|
||||||
this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: SHOW_DICE, forceDiceResult: this.forceDiceResult});
|
this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: SHOW_DICE, forceDiceResult: this.forceDiceResult});
|
||||||
this.onEncaisser(this.encaissement, this.show)
|
this.onEncaisser(this.encaissement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { RdDItemCompetenceCreature } from "./item-competencecreature.js"
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js"
|
||||||
|
import { TYPES } from "./item.js";
|
||||||
import { RdDCombatManager } from "./rdd-combat.js";
|
import { RdDCombatManager } from "./rdd-combat.js";
|
||||||
|
|
||||||
const nomCategorieParade = {
|
const nomCategorieParade = {
|
||||||
@@ -19,15 +20,15 @@ const nomCategorieParade = {
|
|||||||
export class RdDItemArme extends Item {
|
export class RdDItemArme extends Item {
|
||||||
|
|
||||||
static isArme(item) {
|
static isArme(item) {
|
||||||
return (item.type == 'competencecreature' && item.system.iscombat) || item.type == 'arme';
|
return item.type == TYPES.arme || RdDItemCompetenceCreature.getCategorieAttaque(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getArme(arme) {
|
static getArme(arme) {
|
||||||
switch (arme ? arme.type : '') {
|
switch (arme ? arme.type : '') {
|
||||||
case 'arme': return arme;
|
case TYPES.arme: return arme;
|
||||||
case 'competencecreature':
|
case TYPES.competencecreature:
|
||||||
return RdDItemCompetenceCreature.armeNaturelle(arme);
|
return RdDItemCompetenceCreature.armeCreature(arme);
|
||||||
}
|
}
|
||||||
return RdDItemArme.mainsNues();
|
return RdDItemArme.mainsNues();
|
||||||
}
|
}
|
||||||
@@ -67,14 +68,14 @@ export class RdDItemArme extends Item {
|
|||||||
return armeData.system.categorie_parade;
|
return armeData.system.categorie_parade;
|
||||||
}
|
}
|
||||||
// pour compatibilité avec des personnages existants
|
// pour compatibilité avec des personnages existants
|
||||||
if (armeData.type == 'competencecreature' || armeData.system.categorie == 'creature') {
|
if (armeData.type == TYPES.competencecreature || armeData.system.categorie == 'creature') {
|
||||||
return armeData.system.categorie_parade || (armeData.system.isparade ? 'armes-naturelles' : '');
|
return armeData.system.categorie_parade || (armeData.system.isparade ? 'armes-naturelles' : '');
|
||||||
}
|
}
|
||||||
if (!armeData.type.match(/arme|competencecreature/)) {
|
if (!armeData.type.match(/arme|competencecreature/)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
if (armeData.system.competence == undefined) {
|
if (armeData.system.competence == undefined) {
|
||||||
return 'competencecreature';
|
return TYPES.competencecreature;
|
||||||
}
|
}
|
||||||
let compname = armeData.system.competence.toLowerCase();
|
let compname = armeData.system.competence.toLowerCase();
|
||||||
if (compname.match(/^(dague de jet|javelot|fouet|arc|arbalête|fronde|hache de jet|fléau)$/)) return '';
|
if (compname.match(/^(dague de jet|javelot|fouet|arc|arbalête|fronde|hache de jet|fléau)$/)) return '';
|
||||||
@@ -156,23 +157,33 @@ export class RdDItemArme extends Item {
|
|||||||
}
|
}
|
||||||
return armeData;
|
return armeData;
|
||||||
}
|
}
|
||||||
|
static competence2Mains(arme) {
|
||||||
|
return arme.system.competence.replace(" 1 main", " 2 mains");
|
||||||
|
}
|
||||||
|
|
||||||
|
static competence1Mains(arme) {
|
||||||
|
return arme.system.competence.replace(" 2 mains", " 1 main");
|
||||||
|
}
|
||||||
|
|
||||||
static isArmeUtilisable(arme) {
|
static isArmeUtilisable(arme) {
|
||||||
return arme.type == 'arme' && arme.system.equipe && (arme.system.resistance > 0 || arme.system.portee_courte > 0);
|
return arme.type == 'arme' && arme.system.equipe && (arme.system.resistance > 0 || arme.system.portee_courte > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ajoutCorpsACorps(armes, competences, carac) {
|
static ajoutCorpsACorps(armes, actor) {
|
||||||
let corpsACorps = competences.find(it => it.name == 'Corps à corps') ?? { system: { niveau: -6 } };
|
armes.push(RdDItemArme.mainsNues(actor));
|
||||||
let init = RdDCombatManager.calculInitiative(corpsACorps.system.niveau, carac['melee'].value);
|
armes.push(RdDItemArme.empoignade(actor));
|
||||||
armes.push(RdDItemArme.mainsNues({ niveau: corpsACorps.system.niveau, initiative: init }));
|
|
||||||
//armes.push(RdDItemArme.empoignade({ niveau: corpsACorps.system.niveau, initiative: init }));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static corpsACorps(mainsNuesActor) {
|
static corpsACorps(actor) {
|
||||||
const corpsACorps = {
|
let competence = actor?.getCompetenceCorpsACorps() ?? { system: { niveau: -6 } };
|
||||||
|
let melee = actor? actor.system.carac['melee'].value : 0
|
||||||
|
return {
|
||||||
|
_id: competence?.id,
|
||||||
name: 'Corps à corps',
|
name: 'Corps à corps',
|
||||||
|
type: TYPES.arme,
|
||||||
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp',
|
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp',
|
||||||
system: {
|
system: {
|
||||||
|
initiative: RdDCombatManager.calculInitiative(competence.system.niveau, melee),
|
||||||
equipe: true,
|
equipe: true,
|
||||||
rapide: true,
|
rapide: true,
|
||||||
force: 0,
|
force: 0,
|
||||||
@@ -180,23 +191,22 @@ export class RdDItemArme extends Item {
|
|||||||
dommagesReels: 0,
|
dommagesReels: 0,
|
||||||
mortalite: 'non-mortel',
|
mortalite: 'non-mortel',
|
||||||
competence: 'Corps à corps',
|
competence: 'Corps à corps',
|
||||||
|
deuxmains: true,
|
||||||
categorie_parade: 'sans-armes'
|
categorie_parade: 'sans-armes'
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
mergeObject(corpsACorps.system, mainsNuesActor ?? {}, { overwrite: false });
|
|
||||||
return corpsACorps;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static mainsNues(mainsNuesActor) {
|
static mainsNues(actor) {
|
||||||
const mainsNues = RdDItemArme.corpsACorps(mainsNuesActor)
|
const mainsNues = RdDItemArme.corpsACorps(actor)
|
||||||
mainsNues.name = 'Mains nues'
|
mainsNues.name = 'Mains nues'
|
||||||
mainsNues.system.cac = 'pugilat'
|
mainsNues.system.cac = 'pugilat'
|
||||||
mainsNues.system.baseInit = 4
|
mainsNues.system.baseInit = 4
|
||||||
return mainsNues;
|
return mainsNues;
|
||||||
}
|
}
|
||||||
|
|
||||||
static empoignade(mainsNuesActor) {
|
static empoignade(actor) {
|
||||||
const empoignade = RdDItemArme.corpsACorps(mainsNuesActor)
|
const empoignade = RdDItemArme.corpsACorps(actor)
|
||||||
empoignade.name = 'Empoignade'
|
empoignade.name = 'Empoignade'
|
||||||
empoignade.system.cac = 'empoignade'
|
empoignade.system.cac = 'empoignade'
|
||||||
empoignade.system.baseInit = 3
|
empoignade.system.baseInit = 3
|
||||||
|
|||||||
@@ -8,22 +8,22 @@ const xp_par_niveau = [5, 5, 5, 10, 10, 10, 10, 15, 15, 15, 15, 20, 20, 20, 20,
|
|||||||
const niveau_max = xp_par_niveau.length - 10;
|
const niveau_max = xp_par_niveau.length - 10;
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const limitesArchetypes = [
|
const limitesArchetypes = [
|
||||||
{ "niveau": 0, "nombreMax": 100, "reste": 100 },
|
{ niveau: 0, nombreMax: 100 },
|
||||||
{ "niveau": 1, "nombreMax": 10, "reste": 10 },
|
{ niveau: 1, nombreMax: 10 },
|
||||||
{ "niveau": 2, "nombreMax": 9, "reste": 9 },
|
{ niveau: 2, nombreMax: 9 },
|
||||||
{ "niveau": 3, "nombreMax": 8, "reste": 8 },
|
{ niveau: 3, nombreMax: 8 },
|
||||||
{ "niveau": 4, "nombreMax": 7, "reste": 7 },
|
{ niveau: 4, nombreMax: 7 },
|
||||||
{ "niveau": 5, "nombreMax": 6, "reste": 6 },
|
{ niveau: 5, nombreMax: 6 },
|
||||||
{ "niveau": 6, "nombreMax": 5, "reste": 5 },
|
{ niveau: 6, nombreMax: 5 },
|
||||||
{ "niveau": 7, "nombreMax": 4, "reste": 4 },
|
{ niveau: 7, nombreMax: 4 },
|
||||||
{ "niveau": 8, "nombreMax": 3, "reste": 3 },
|
{ niveau: 8, nombreMax: 3 },
|
||||||
{ "niveau": 9, "nombreMax": 2, "reste": 2 },
|
{ niveau: 9, nombreMax: 2 },
|
||||||
{ "niveau": 10, "nombreMax": 1, "reste": 1 },
|
{ niveau: 10, nombreMax: 1 },
|
||||||
{ "niveau": 11, "nombreMax": 1, "reste": 1 }
|
{ niveau: 11, nombreMax: 1 },
|
||||||
];
|
];
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const categorieCompetences = {
|
const categoriesCompetences = {
|
||||||
"generale": { base: -4, label: "Générales" },
|
"generale": { base: -4, label: "Générales" },
|
||||||
"particuliere": { base: -8, label: "Particulières" },
|
"particuliere": { base: -8, label: "Particulières" },
|
||||||
"specialisee": { base: -11, label: "Spécialisées" },
|
"specialisee": { base: -11, label: "Spécialisées" },
|
||||||
@@ -49,16 +49,16 @@ const competence_xp_cumul = _buildCumulXP();
|
|||||||
|
|
||||||
export class RdDItemCompetence extends Item {
|
export class RdDItemCompetence extends Item {
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getCategorieCompetences() {
|
static getCategories() {
|
||||||
return categorieCompetences;
|
return categoriesCompetences;
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static getNiveauBase(category) {
|
|
||||||
return categorieCompetences[category].base;
|
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getLabelCategorie(category) {
|
static getLabelCategorie(category) {
|
||||||
return categorieCompetences[category].label;
|
return categoriesCompetences[category].label;
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getNiveauBase(category, categories = categoriesCompetences) {
|
||||||
|
return categories[category]?.base ?? 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -79,10 +79,9 @@ export class RdDItemCompetence extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isCompetenceArme(competence) {
|
static isCompetenceArme(competence) {
|
||||||
if (competence.isCompetence()) {
|
if (competence.isCompetence() && !competence.isCorpsACorps() && !competence.isEsquive()) {
|
||||||
switch (competence.system.categorie) {
|
switch (competence.system.categorie) {
|
||||||
case 'melee':
|
case 'melee':
|
||||||
return !Grammar.toLowerCaseNoAccent(competence.name).includes('esquive');
|
|
||||||
case 'tir':
|
case 'tir':
|
||||||
case 'lancer':
|
case 'lancer':
|
||||||
return true;
|
return true;
|
||||||
@@ -93,10 +92,10 @@ export class RdDItemCompetence extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isArmeUneMain(competence) {
|
static isArmeUneMain(competence) {
|
||||||
return RdDItemCompetence.isCompetenceArme(competence) && competence.name.toLowerCase().includes("1 main");
|
return competence.isCompetenceArme() && competence.name.toLowerCase().includes("1 main");
|
||||||
}
|
}
|
||||||
static isArme2Main(competence) {
|
static isArme2Main(competence) {
|
||||||
return RdDItemCompetence.isCompetenceArme(competence) && competence.name.toLowerCase().includes("2 main");
|
return competence.isCompetenceArme() && competence.name.toLowerCase().includes("2 main");
|
||||||
}
|
}
|
||||||
|
|
||||||
static isThanatos(competence) {
|
static isThanatos(competence) {
|
||||||
@@ -192,7 +191,7 @@ export class RdDItemCompetence extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isNiveauBase(item) {
|
static isNiveauBase(item) {
|
||||||
return Number(item.system.niveau) == RdDItemCompetence.getNiveauBase(item.system.categorie);
|
return Number(item.system.niveau) == RdDItemCompetence.getNiveauBase(item.system.categorie, item.getCategories());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -259,13 +258,17 @@ export class RdDItemCompetence extends Item {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static computeResumeArchetype(competences) {
|
static computeResumeArchetype(competences) {
|
||||||
const computed = duplicate(limitesArchetypes);
|
const computed = duplicate(limitesArchetypes);
|
||||||
|
computed.forEach(it => { it.nombre = 0; it.reste = it.nombreMax; });
|
||||||
|
|
||||||
competences.map(it => Math.max(0, it.system.niveau_archetype))
|
competences.map(it => Math.max(0, it.system.niveau_archetype))
|
||||||
.filter(n => n > 0)
|
.filter(n => n > 0)
|
||||||
.forEach(n => {
|
.forEach(n => {
|
||||||
computed[n] = computed[n] ?? { niveau: n, nombreMax: 0, reste: 0 };
|
computed[n] = computed[n] ?? { niveau: n, nombreMax: 0, reste: 0, nombre: 0 };
|
||||||
computed[n].reste = computed[n].reste - 1;
|
computed[n].reste--;
|
||||||
|
computed[n].nombre++;
|
||||||
|
|
||||||
});
|
});
|
||||||
return computed.filter(it => it.reste > 0 && it.niveau > 0);
|
return computed.filter(it => it.niveau > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|||||||
@@ -1,51 +1,112 @@
|
|||||||
|
|
||||||
|
import { TYPES } from "./item.js";
|
||||||
import { RdDCombatManager } from "./rdd-combat.js";
|
import { RdDCombatManager } from "./rdd-combat.js";
|
||||||
|
|
||||||
|
const categories = {
|
||||||
|
"generale": { base: 0, label: "Générale" },
|
||||||
|
"naturelle": { base: 0, label: "Arme naturelle" },
|
||||||
|
"melee": { base: 0, label: "Mêlée" },
|
||||||
|
"parade": { base: 0, label: "Parade" },
|
||||||
|
"tir": { base: 0, label: "Tir" },
|
||||||
|
"lancer": { base: 0, label: "Lancer" },
|
||||||
|
"possession": { base: 0, label: "Possession" },
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDItemCompetenceCreature extends Item {
|
export class RdDItemCompetenceCreature extends Item {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
static getCategories() {
|
||||||
static setRollDataCreature(rollData) {
|
return categories;
|
||||||
rollData.competence = rollData.competence
|
|
||||||
rollData.carac = { "carac_creature": { label: rollData.competence.name, value: rollData.competence.system.carac_value } }
|
|
||||||
rollData.competence.system.defaut_carac = "carac_creature"
|
|
||||||
rollData.competence.system.categorie = "creature"
|
|
||||||
rollData.selectedCarac = rollData.carac.carac_creature
|
|
||||||
if (rollData.competence.system.iscombat) {
|
|
||||||
rollData.arme = RdDItemCompetenceCreature.armeNaturelle(rollData.competence);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static armeNaturelle(competencecreature) {
|
static setRollDataCreature(rollData) {
|
||||||
if (RdDItemCompetenceCreature.isCompetenceAttaque(competencecreature)) {
|
rollData.carac = { "carac_creature": { label: rollData.competence.name, value: rollData.competence.system.carac_value } }
|
||||||
// si c'est un Item compétence: cloner pour ne pas modifier lma compétence
|
rollData.competence.system.defaut_carac = "carac_creature"
|
||||||
let arme = (competencecreature instanceof Item) ? competencecreature.clone(): competencecreature;
|
rollData.selectedCarac = rollData.carac.carac_creature
|
||||||
mergeObject(arme.system,
|
rollData.arme = RdDItemCompetenceCreature.armeCreature(rollData.competence);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static armeCreature(item) {
|
||||||
|
const categorieAttaque = RdDItemCompetenceCreature.getCategorieAttaque(item)
|
||||||
|
if (categorieAttaque != undefined) {
|
||||||
|
// si c'est un Item compétence: cloner pour ne pas modifier la compétence
|
||||||
|
let arme = item.clone();
|
||||||
|
mergeObject(arme,
|
||||||
{
|
{
|
||||||
competence: arme.name,
|
action: item.isCompetencePossession() ? 'possession' : 'attaque',
|
||||||
initiative: RdDCombatManager.calculInitiative(competencecreature.system.niveau, competencecreature.system.carac_value),
|
system: {
|
||||||
niveau: competencecreature.system.niveau,
|
competence: arme.name,
|
||||||
equipe: true,
|
cac: categorieAttaque == "naturelle" ? "naturelle" : "",
|
||||||
resistance: 100,
|
niveau: item.system.niveau,
|
||||||
dommagesReels: arme.system.dommages,
|
initiative: RdDCombatManager.calculInitiative(item.system.niveau, item.system.carac_value),
|
||||||
penetration: 0,
|
equipe: true,
|
||||||
force: 0,
|
resistance: 100,
|
||||||
rapide: true,
|
dommagesReels: arme.system.dommages,
|
||||||
cac: competencecreature.system.isnaturelle ? "naturelle" : "",
|
penetration: 0,
|
||||||
action: 'attaque'
|
force: 0,
|
||||||
|
rapide: true,
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return arme;
|
return arme;
|
||||||
}
|
}
|
||||||
console.error("RdDItemCompetenceCreature.toActionArme(", competencecreature, ") : impossible de transformer l'Item en arme");
|
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isCompetenceAttaque(item) {
|
static isCompetenceAttaque(item) {
|
||||||
return item.type == 'competencecreature' && item.system.iscombat;
|
if (item.type == TYPES.competencecreature) {
|
||||||
|
switch (item.system.categorie) {
|
||||||
|
case "melee":
|
||||||
|
case "tir":
|
||||||
|
case "lancer":
|
||||||
|
case "naturelle":
|
||||||
|
case "possession":
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static getCategorieAttaque(item) {
|
||||||
|
if (item.type == TYPES.competencecreature) {
|
||||||
|
switch (item.system.categorie) {
|
||||||
|
case "melee":
|
||||||
|
case "tir":
|
||||||
|
case "lancer":
|
||||||
|
case "naturelle":
|
||||||
|
case "possession":
|
||||||
|
case "parade":
|
||||||
|
return item.system.categorie
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
static isDommages(item) {
|
||||||
|
if (item.type == TYPES.competencecreature) {
|
||||||
|
switch (item.system.categorie) {
|
||||||
|
case "melee":
|
||||||
|
case "tir":
|
||||||
|
case "lancer":
|
||||||
|
case "naturelle":
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
static isParade(item) {
|
||||||
|
if (item.type == TYPES.competencecreature) {
|
||||||
|
switch (item.system.categorie) {
|
||||||
|
case "melee":
|
||||||
|
case "naturelle":
|
||||||
|
case "parade":
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isCompetenceParade(item) {
|
static isCompetenceParade(item) {
|
||||||
return item.type == 'competencecreature' && item.system.categorie_parade !== "";
|
return item.type == 'competencecreature' && item.system.categorie_parade !== "";
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ import { RdDItemCompetence } from "./item-competence.js";
|
|||||||
import { RdDHerbes } from "./rdd-herbes.js";
|
import { RdDHerbes } from "./rdd-herbes.js";
|
||||||
import { RdDGemme } from "./rdd-gemme.js";
|
import { RdDGemme } from "./rdd-gemme.js";
|
||||||
import { HtmlUtility } from "./html-utility.js";
|
import { HtmlUtility } from "./html-utility.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
import { SYSTEM_RDD } from "./constants.js";
|
import { SYSTEM_RDD } from "./constants.js";
|
||||||
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
|
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
|
||||||
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { RdDTimestamp } from "./rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
|
import { TYPES } from "./item.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend the basic ItemSheet for RdD specific items
|
* Extend the basic ItemSheet for RdD specific items
|
||||||
@@ -98,16 +100,20 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
isComestible: this.item.getUtilisationCuisine(),
|
isComestible: this.item.getUtilisationCuisine(),
|
||||||
options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable)
|
options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable)
|
||||||
}
|
}
|
||||||
|
if (this.item.type == TYPES.competencecreature) {
|
||||||
|
formData.isparade = RdDItemCompetenceCreature.isParade(this.item)
|
||||||
|
formData.isdommages = RdDItemCompetenceCreature.isDommages(this.item)
|
||||||
|
}
|
||||||
|
|
||||||
const competences = await SystemCompendiums.getCompetences(this.actor?.type);
|
const competences = await SystemCompendiums.getCompetences('personnage');
|
||||||
formData.categorieCompetences = RdDItemCompetence.getCategorieCompetences()
|
formData.categories = this.item.getCategories()
|
||||||
if (this.item.type == 'tache' || this.item.type == 'livre' || this.item.type == 'meditation' || this.item.type == 'oeuvre') {
|
if (this.item.type == 'tache' || this.item.type == 'livre' || this.item.type == 'meditation' || this.item.type == 'oeuvre') {
|
||||||
formData.caracList = duplicate(game.system.model.Actor.personnage.carac)
|
formData.caracList = duplicate(game.system.model.Actor.personnage.carac)
|
||||||
formData.caracList["reve-actuel"] = duplicate(game.system.model.Actor.personnage.reve.reve)
|
formData.caracList["reve-actuel"] = duplicate(game.system.model.Actor.personnage.reve.reve)
|
||||||
formData.competences = competences;
|
formData.competences = competences;
|
||||||
}
|
}
|
||||||
if (this.item.type == 'arme') {
|
if (this.item.type == 'arme') {
|
||||||
formData.competences = competences.filter(it => RdDItemCompetence.isCompetenceArme(it));
|
formData.competences = competences.filter(it => it.isCompetenceArme())
|
||||||
}
|
}
|
||||||
if (['sort', 'sortreserve'].includes(this.item.type)) {
|
if (['sort', 'sortreserve'].includes(this.item.type)) {
|
||||||
formData.competences = competences.filter(it => RdDItemCompetence.isDraconic(it));
|
formData.competences = competences.filter(it => RdDItemCompetence.isDraconic(it));
|
||||||
@@ -151,7 +157,7 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
this.html = html;
|
this.html = html;
|
||||||
|
|
||||||
HtmlUtility.showControlWhen(this.html.find(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs')
|
HtmlUtility.showControlWhen(this.html.find(".item-cout"), ReglesOptionnelles.isUsing('afficher-prix-joueurs')
|
||||||
|| game.user.isGM
|
|| game.user.isGM
|
||||||
|| !this.item.isOwned);
|
|| !this.item.isOwned);
|
||||||
HtmlUtility.showControlWhen(this.html.find(".item-magique"), this.item.isMagique());
|
HtmlUtility.showControlWhen(this.html.find(".item-magique"), this.item.isMagique());
|
||||||
@@ -188,8 +194,8 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.html.find('.creer-tache-livre').click((event) => this._getEventActor(event).creerTacheDepuisLivre(this.item));
|
this.html.find('.creer-tache-livre').click((event) => this._getEventActor(event).creerTacheDepuisLivre(this.item));
|
||||||
this.html.find('.consommer-potion').click((event) => this._getEventActor(event).consommerPotion(this.item));
|
this.html.find('.consommer-potion').click((event) => this._getEventActor(event).consommerPotion(this.item, this.getActionRenderItem()));
|
||||||
this.html.find('.creer-potion-base').click((event) => this._getEventActor(event).dialogFabriquerPotion(this.item));
|
this.html.find('.creer-potion-base').click((event) => this._getEventActor(event).actionHerbe(this.item));
|
||||||
|
|
||||||
this.html.find('.alchimie-tache a').click((event) => {
|
this.html.find('.alchimie-tache a').click((event) => {
|
||||||
let actor = this._getEventActor(event);
|
let actor = this._getEventActor(event);
|
||||||
@@ -203,12 +209,23 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, async () => this.render(true)));
|
if (this.actor) {
|
||||||
this.html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true));
|
this.html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, this.getActionRenderItem()));
|
||||||
this.html.find('.item-delete').click(async event => RdDUtility.confirmActorItemDelete(this, RdDSheetUtility.getItem(event, this.actor)));
|
this.html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true));
|
||||||
this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente());
|
this.html.find('.item-delete').click(async event => RdDUtility.confirmActorItemDelete(this, RdDSheetUtility.getItem(event, this.actor)));
|
||||||
this.html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItemToChat());
|
this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente());
|
||||||
this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor, async () => this.render(true)));
|
this.html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItemToChat());
|
||||||
|
this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor, this.getActionRenderItem()));
|
||||||
|
|
||||||
|
this.html.find('.item-quantite-plus').click(async event => {
|
||||||
|
await this.actor.itemQuantiteIncDec(RdDSheetUtility.getItemId(event), 1)
|
||||||
|
this.render();
|
||||||
|
});
|
||||||
|
this.html.find('.item-quantite-moins').click(async event => {
|
||||||
|
await this.actor.itemQuantiteIncDec(RdDSheetUtility.getItemId(event), -1)
|
||||||
|
this.render();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const updateItemTimestamp = (path, timestamp) => this.item.update({ [path]: duplicate(timestamp) })
|
const updateItemTimestamp = (path, timestamp) => this.item.update({ [path]: duplicate(timestamp) })
|
||||||
|
|
||||||
@@ -216,6 +233,16 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
RdDTimestamp.handleTimestampEditor(this.html, 'system.temporel.fin', updateItemTimestamp);
|
RdDTimestamp.handleTimestampEditor(this.html, 'system.temporel.fin', updateItemTimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getActionRenderItem() {
|
||||||
|
return async () => {
|
||||||
|
let item = this.item;
|
||||||
|
while (item) {
|
||||||
|
await item.sheet?.render()
|
||||||
|
item = this.actor.getContenant(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_getEventActor(event) {
|
_getEventActor(event) {
|
||||||
let actorId = event.currentTarget.attributes['data-actor-id'].value;
|
let actorId = event.currentTarget.attributes['data-actor-id'].value;
|
||||||
let actor = game.actors.get(actorId);
|
let actor = game.actors.get(actorId);
|
||||||
@@ -228,7 +255,8 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
if (this.item.isCompetence()) {
|
if (this.item.isCompetence()) {
|
||||||
let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);
|
const categorie = event.currentTarget.value;
|
||||||
|
const level = RdDItemCompetence.getNiveauBase(categorie, this.item.getCategories());
|
||||||
this.item.system.base = level;
|
this.item.system.base = level;
|
||||||
this.html.find('[name="system.base"]').val(level);
|
this.html.find('[name="system.base"]').val(level);
|
||||||
}
|
}
|
||||||
@@ -239,9 +267,8 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
_updateObject(event, formData) {
|
_updateObject(event, formData) {
|
||||||
if (this.item.type == 'sort') {
|
if (this.item.type == 'sort') {
|
||||||
// Données de bonus de cases ?
|
// Données de bonus de cases ?
|
||||||
formData['system.bonuscase'] = RdDItemSort.buildBonusCaseStringFromFormData(formData.bonusValue, formData.caseValue);
|
formData['system.bonuscase'] = RdDItemSort.buildBonuscaseFromArrays(formData.bonusValue, formData.caseValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.item.update(formData);
|
return this.item.update(formData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
/* -------------------------------------------- */
|
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { TMRUtility } from "./tmr-utility.js";
|
import { TMRUtility } from "./tmr-utility.js";
|
||||||
|
|
||||||
@@ -14,9 +13,9 @@ export class RdDItemSort extends Item {
|
|||||||
static isCoutVariable(sort) {
|
static isCoutVariable(sort) {
|
||||||
return sort && (sort.system.ptreve.toLowerCase() == "variable" || sort.system.ptreve.indexOf("+") >= 0);
|
return sort && (sort.system.ptreve.toLowerCase() == "variable" || sort.system.ptreve.indexOf("+") >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static setCoutReveReel(sort){
|
static setCoutReveReel(sort) {
|
||||||
if (sort) {
|
if (sort) {
|
||||||
sort.system.ptreve_reel = this.isCoutVariable(sort) ? 1 : sort.system.ptreve;
|
sort.system.ptreve_reel = this.isCoutVariable(sort) ? 1 : sort.system.ptreve;
|
||||||
}
|
}
|
||||||
@@ -25,94 +24,91 @@ export class RdDItemSort extends Item {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getDifficulte(sort, variable) {
|
static getDifficulte(sort, variable) {
|
||||||
if (sort && !RdDItemSort.isDifficulteVariable(sort)) {
|
if (sort && !RdDItemSort.isDifficulteVariable(sort)) {
|
||||||
return Misc.toInt(sort.system.difficulte);
|
return Misc.toInt(sort.system.difficulte);
|
||||||
}
|
}
|
||||||
return variable;
|
return variable;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static buildBonusCaseList( caseBonusString, newCase ) {
|
static buildBonusCaseList(bonuscase, newCase) {
|
||||||
if (caseBonusString == undefined) {
|
const list = RdDItemSort._bonuscaseStringToList(bonuscase)
|
||||||
return [];
|
if (newCase) {
|
||||||
}
|
return list.concat({ case: "Nouvelle", bonus: 0 });
|
||||||
let bonusCaseList = [];
|
|
||||||
let bonusCaseArray = caseBonusString == undefined ? [] : caseBonusString.split(',');
|
|
||||||
for( let bonusCase of bonusCaseArray) {
|
|
||||||
let bonusSplit = bonusCase.split(':');
|
|
||||||
bonusCaseList.push( { case: bonusSplit[0], bonus: bonusSplit[1] } );
|
|
||||||
}
|
|
||||||
if ( newCase )
|
|
||||||
bonusCaseList.push( {case: "Nouvelle", bonus: 0} );
|
|
||||||
return bonusCaseList;
|
|
||||||
}
|
}
|
||||||
|
return list;
|
||||||
/* -------------------------------------------- */
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retourne une liste de bonus/case pour un item-sheet
|
* Retourne une liste de bonus/case pour un item-sheet
|
||||||
* @param {} item
|
* @param {} item
|
||||||
*/
|
*/
|
||||||
static getBonusCaseList( item, newCase = false ) {
|
static getBonusCaseList(item, newCase = false) {
|
||||||
// Gestion spéciale case bonus
|
// Gestion spéciale case bonus
|
||||||
if ( item.type == 'sort') {
|
if (item.type == 'sort') {
|
||||||
return this.buildBonusCaseList(item.system.bonuscase, newCase );
|
return RdDItemSort.buildBonusCaseList(item.system.bonuscase, newCase);
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/** Met à jour les données de formulaire
|
/** Met à jour les données de formulaire
|
||||||
* si static des bonus de cases sont présents
|
* si static des bonus de cases sont présents
|
||||||
* */
|
* */
|
||||||
static buildBonusCaseStringFromFormData( bonuses, cases ) {
|
static buildBonuscaseFromArrays(bonuses, coords) {
|
||||||
if ( bonuses ) {
|
if (bonuses) {
|
||||||
let list = [];
|
const list = [];
|
||||||
let caseCheck = {};
|
const caseCheck = {};
|
||||||
for (let i=0; i<bonuses.length; i++) {
|
for (let i = 0; i < bonuses.length && i < coords.length; i++) {
|
||||||
let coord = cases[i]?.toUpperCase() || 'A1';
|
const coord = coords[i] == 'Fleuve' ? 'Fleuve' : (coords[i]?.toUpperCase() ?? 'A1');
|
||||||
let bonus = bonuses[i] || 0;
|
const bonus = bonuses[i] || 0;
|
||||||
if ( TMRUtility.verifyTMRCoord( coord ) && bonus > 0 && caseCheck[coord] == undefined ) {
|
if (TMRUtility.verifyTMRCoord(coord) && bonus > 0 && caseCheck[coord] == undefined) {
|
||||||
caseCheck[coord] = bonus;
|
caseCheck[coord] = bonus;
|
||||||
list.push( coord+":"+bonus );
|
list.push({ case: coord, bonus: bonus });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return list.toString();
|
return RdDItemSort._bonuscaseListToString(list);
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static incrementBonusCase( actor, sort, coord ) {
|
static incrementBonusCase(actor, sort, coord) {
|
||||||
let bonusCaseList = this.buildBonusCaseList(sort.system.bonuscase, false);
|
if (TMRUtility.getTMR(coord).type == "fleuve") {
|
||||||
//console.log("ITEMSORT", sort, bonusCaseList);
|
coord = 'Fleuve';
|
||||||
|
|
||||||
let found = false;
|
|
||||||
let StringList = [];
|
|
||||||
for( let bc of bonusCaseList) {
|
|
||||||
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(coord+':1');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sauvegarde/update
|
|
||||||
let bonuscase = StringList.toString();
|
|
||||||
//console.log("Bonus cae :", bonuscase);
|
|
||||||
actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'system.bonuscase': bonuscase }] );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static getCaseBonus( sort, coord) {
|
|
||||||
let bonusCaseList = this.buildBonusCaseList(sort.system.bonuscase, false);
|
|
||||||
for( let bc of bonusCaseList) {
|
|
||||||
if (bc.case == coord) { // Case existante
|
|
||||||
return Number(bc.bonus);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
const list = RdDItemSort.buildBonusCaseList(sort.system.bonuscase, false);
|
||||||
|
const bonus = Number(list.find(it => it.case == coord)?.bonus ?? 0);
|
||||||
|
const modified = { case: coord, bonus: bonus + 1 };
|
||||||
|
|
||||||
|
const bonuscase = RdDItemSort._bonuscaseListToString(
|
||||||
|
list.filter(it => it.case != coord).concat(modified)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Sauvegarde/update
|
||||||
|
actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'system.bonuscase': bonuscase }]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getCaseBonus(sort, coord) {
|
||||||
|
const isFleuve = TMRUtility.getTMR(coord).type == "fleuve";
|
||||||
|
|
||||||
|
let bc = RdDItemSort.buildBonusCaseList(sort.system.bonuscase, false)
|
||||||
|
.filter(it => it.case == coord || (isFleuve && it.case == 'Fleuve'))
|
||||||
|
.find(it => true)
|
||||||
|
return Number(bc?.bonus ?? 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static _bonuscaseListToString(list) {
|
||||||
|
return list.map(it => `${it.case}:${it.bonus}`)
|
||||||
|
.sort(Misc.ascending())
|
||||||
|
.join(',');
|
||||||
|
}
|
||||||
|
static _bonuscaseStringToList(bonuscase) {
|
||||||
|
return (bonuscase ?? '').split(',').map(it => {
|
||||||
|
const b = it.split(':');
|
||||||
|
return { case: b[0], bonus: b[1] };
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
const BASE_TACHE_SOIN_BLESSURE = { type: "tache", img: 'systems/foundryvtt-reve-de-dragon/icons/competence_chirurgie.webp', system: { carac: "dexterite", competence: "Chirurgie", periodicite: "1 round", fatigue: 0, } }
|
|
||||||
const TACHES_SOIN_BLESSURE = {
|
|
||||||
'critique': { name: 'Blessure critique', system: { difficulte: -6, points_de_tache: 6 } },
|
|
||||||
'grave': { name: 'Blessure grave', system: { difficulte: -4, points_de_tache: 4 } },
|
|
||||||
'legere': { name: 'Blessure légère', system: { difficulte: -2, points_de_tache: 2 } },
|
|
||||||
}
|
|
||||||
|
|
||||||
export class RdDItemTache extends Item {
|
|
||||||
|
|
||||||
static prepareTacheSoin(gravite) {
|
|
||||||
const blessure = TACHES_SOIN_BLESSURE[gravite]
|
|
||||||
if (blessure) {
|
|
||||||
return mergeObject(duplicate(BASE_TACHE_SOIN_BLESSURE), blessure)
|
|
||||||
}
|
|
||||||
ui.notifications.warn(`Pas de tâche de soins pour une blessure ${gravite}`)
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
240
module/item.js
240
module/item.js
@@ -2,38 +2,87 @@ import { DialogItemVente } from "./dialog-item-vente.js";
|
|||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { RdDHerbes } from "./rdd-herbes.js";
|
import { RdDHerbes } from "./rdd-herbes.js";
|
||||||
import { RdDTimestamp } from "./rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
||||||
import { RdDRaretes } from "./item/raretes.js";
|
import { RdDRaretes } from "./item/raretes.js";
|
||||||
|
import { RdDItemCompetence } from "./item-competence.js";
|
||||||
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
|
|
||||||
|
export const TYPES = {
|
||||||
|
competence: 'competence',
|
||||||
|
competencecreature: 'competencecreature',
|
||||||
|
empoignade: 'empoignade',
|
||||||
|
possession: 'possession',
|
||||||
|
blessure: 'blessure',
|
||||||
|
maladie: 'maladie',
|
||||||
|
poison: 'poison',
|
||||||
|
arme: 'arme',
|
||||||
|
armure: 'armure',
|
||||||
|
conteneur: 'conteneur',
|
||||||
|
objet: 'objet',
|
||||||
|
monnaie: 'monnaie',
|
||||||
|
gemme: 'gemme',
|
||||||
|
munition: 'munition',
|
||||||
|
nourritureboisson: 'nourritureboisson',
|
||||||
|
herbe: 'herbe',
|
||||||
|
plante: 'plante',
|
||||||
|
ingredient: 'ingredient',
|
||||||
|
faune: 'faune',
|
||||||
|
livre: 'livre',
|
||||||
|
potion: 'potion',
|
||||||
|
service: 'service',
|
||||||
|
musique: 'musique',
|
||||||
|
danse: 'danse',
|
||||||
|
chant: 'chant',
|
||||||
|
jeu: 'jeu',
|
||||||
|
recettecuisine: 'recettecuisine',
|
||||||
|
oeuvre: 'oeuvre',
|
||||||
|
recettealchimique: 'recettealchimique',
|
||||||
|
tache: 'tache',
|
||||||
|
sort: 'sort',
|
||||||
|
sortreserve: 'sortreserve',
|
||||||
|
rencontre: 'rencontre',
|
||||||
|
queue: 'queue',
|
||||||
|
ombre: 'ombre',
|
||||||
|
souffle: 'souffle',
|
||||||
|
tete: 'tete',
|
||||||
|
casetmr: 'casetmr',
|
||||||
|
meditation: 'meditation',
|
||||||
|
signedraconique: 'signedraconique',
|
||||||
|
tarot: 'tarot',
|
||||||
|
nombreastral: 'nombreastral',
|
||||||
|
extraitpoetique: 'extraitpoetique',
|
||||||
|
}
|
||||||
|
|
||||||
const typesInventaireMateriel = [
|
const typesInventaireMateriel = [
|
||||||
"arme",
|
TYPES.arme,
|
||||||
"armure",
|
TYPES.armure,
|
||||||
"conteneur",
|
TYPES.conteneur,
|
||||||
"faune",
|
TYPES.faune,
|
||||||
"gemme",
|
TYPES.gemme,
|
||||||
"herbe",
|
TYPES.herbe,
|
||||||
"plante",
|
TYPES.plante,
|
||||||
"ingredient",
|
TYPES.ingredient,
|
||||||
"livre",
|
TYPES.livre,
|
||||||
"monnaie",
|
TYPES.monnaie,
|
||||||
"munition",
|
TYPES.munition,
|
||||||
"nourritureboisson",
|
TYPES.nourritureboisson,
|
||||||
"objet",
|
TYPES.objet,
|
||||||
"potion",
|
TYPES.potion,
|
||||||
]
|
]
|
||||||
const typesInventaire = {
|
const typesInventaire = {
|
||||||
materiel: typesInventaireMateriel,
|
materiel: typesInventaireMateriel,
|
||||||
all: ['service'].concat(typesInventaireMateriel),
|
all: ['service'].concat(typesInventaireMateriel),
|
||||||
}
|
}
|
||||||
|
|
||||||
const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu"]
|
const typesObjetsOeuvres = [TYPES.oeuvre, TYPES.recettecuisine, TYPES.musique, TYPES.chant, TYPES.danse, TYPES.jeu]
|
||||||
const typesObjetsDraconiques = ["queue", "ombre", "souffle", "tete", "signedraconique", "sortreserve", "rencontre"]
|
const typesObjetsDraconiques = [TYPES.queue, TYPES.ombre, TYPES.souffle, TYPES.tete, TYPES.signedraconique, TYPES.sortreserve, TYPES.rencontre]
|
||||||
const typesObjetsConnaissance = ["meditation", "recettealchimique", "sort"]
|
const typesObjetsConnaissance = [TYPES.meditation, TYPES.recettealchimique, TYPES.sort]
|
||||||
const typesObjetsEffet = ["possession", "poison", "maladie"]
|
const typesObjetsEffet = [TYPES.possession, TYPES.poison, TYPES.maladie, TYPES.blessure]
|
||||||
const typesObjetsCompetence = ["competence", "competencecreature"]
|
const typesObjetsCompetence = [TYPES.competence, TYPES.competencecreature]
|
||||||
const typesObjetsTemporels = ["poison", "maladie", "queue", "ombre", "souffle", "signedraconique", "rencontre"]
|
const typesObjetsTemporels = [TYPES.blessure, TYPES.poison, TYPES.maladie, TYPES.queue, TYPES.ombre, TYPES.souffle, TYPES.signedraconique, TYPES.rencontre]
|
||||||
|
const typesObjetsEquipable = [TYPES.arme, TYPES.armure, TYPES.objet];
|
||||||
const typesEnvironnement = typesInventaireMateriel;
|
const typesEnvironnement = typesInventaireMateriel;
|
||||||
const encBrin = 0.00005; // un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc
|
const encBrin = 0.00005; // un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc
|
||||||
const encPepin = 0.0007; /* un pépin de gemme = 1/10 cm3 = 1/1000 l = 3.5/1000 kg = 7/2000 kg = 7/1000 enc
|
const encPepin = 0.0007; /* un pépin de gemme = 1/10 cm3 = 1/1000 l = 3.5/1000 kg = 7/2000 kg = 7/1000 enc
|
||||||
@@ -75,11 +124,16 @@ export const defaultItemImg = {
|
|||||||
sortreserve: "systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp",
|
sortreserve: "systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp",
|
||||||
extraitpoetique: "systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp",
|
extraitpoetique: "systems/foundryvtt-reve-de-dragon/icons/competence_ecriture.webp",
|
||||||
tarot: "systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp",
|
tarot: "systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp",
|
||||||
|
empoignade: "systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp"
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDItem extends Item {
|
export class RdDItem extends Item {
|
||||||
|
|
||||||
|
static get defaultIcon() {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
static getDefaultImg(itemType) {
|
static getDefaultImg(itemType) {
|
||||||
return game.system.rdd.itemClasses[itemType]?.defaultIcon ?? defaultItemImg[itemType];
|
return game.system.rdd.itemClasses[itemType]?.defaultIcon ?? defaultItemImg[itemType];
|
||||||
}
|
}
|
||||||
@@ -87,12 +141,12 @@ export class RdDItem extends Item {
|
|||||||
static isFieldInventaireModifiable(type, field) {
|
static isFieldInventaireModifiable(type, field) {
|
||||||
switch (field) {
|
switch (field) {
|
||||||
case 'quantite':
|
case 'quantite':
|
||||||
if (['conteneur'].includes(type)) {
|
if ([TYPES.conteneur].includes(type)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'cout':
|
case 'cout':
|
||||||
if (['monnaie'].includes(type)) {
|
if ([TYPES.monnaie].includes(type)) {
|
||||||
return game.user.isGM;
|
return game.user.isGM;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -138,48 +192,84 @@ export class RdDItem extends Item {
|
|||||||
super(docData, context);
|
super(docData, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static get defaultIcon() {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
getUniteQuantite() {
|
getUniteQuantite() {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case "monnaie": return "(Pièces)"
|
case TYPES.monnaie: return "(Pièces)"
|
||||||
case "herbe":
|
case TYPES.herbe:
|
||||||
switch (this.system.categorie) {
|
switch (this.system.categorie) {
|
||||||
case 'Alchimie': case 'Repos': case 'Soin':
|
case 'Alchimie': case 'Repos': case 'Soin':
|
||||||
return "(Brins)"
|
return "(Brins)"
|
||||||
case 'Cuisine': return '';
|
case 'Cuisine': return '';
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
case "ingredient": return "(Pépins ou Brins)"
|
case TYPES.ingredient: return "(Pépins ou Brins)"
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
isCompetencePersonnage() { return this.type == 'competence' }
|
isEquipable() {
|
||||||
isCompetenceCreature() { return this.type == 'competencecreature' }
|
return typesObjetsEquipable.includes(this.type)
|
||||||
isConteneur() { return this.type == 'conteneur'; }
|
}
|
||||||
isMonnaie() { return this.type == 'monnaie'; }
|
|
||||||
isPotion() { return this.type == 'potion'; }
|
isCompetencePersonnage() { return this.type == TYPES.competence }
|
||||||
isNourritureBoisson() { return this.type == 'nourritureboisson'; }
|
isCompetenceCreature() { return this.type == TYPES.competencecreature }
|
||||||
isService() { return this.type == 'service'; }
|
isConteneur() { return this.type == TYPES.conteneur; }
|
||||||
|
isMonnaie() { return this.type == TYPES.monnaie; }
|
||||||
|
isPotion() { return this.type == TYPES.potion; }
|
||||||
|
isNourritureBoisson() { return this.type == TYPES.nourritureboisson; }
|
||||||
|
isService() { return this.type == TYPES.service; }
|
||||||
|
|
||||||
isCompetence() { return typesObjetsCompetence.includes(this.type) }
|
isCompetence() { return typesObjetsCompetence.includes(this.type) }
|
||||||
|
isEsquive() {
|
||||||
|
return (this.isCompetence()
|
||||||
|
&& this.system.categorie == 'melee'
|
||||||
|
&& Grammar.includesLowerCaseNoAccent(this.name, 'Esquive'));
|
||||||
|
}
|
||||||
|
|
||||||
|
isCorpsACorps() {
|
||||||
|
return (this.isCompetence()
|
||||||
|
&& this.system.categorie == 'melee'
|
||||||
|
&& Grammar.includesLowerCaseNoAccent(this.name, 'Corps à Corps'));
|
||||||
|
}
|
||||||
|
|
||||||
|
isCompetenceArme() {
|
||||||
|
if (this.isCompetence()) {
|
||||||
|
switch (this.system.categorie) {
|
||||||
|
case 'melee':
|
||||||
|
return !this.isCorpsACorps() && !this.isEsquive()
|
||||||
|
case 'tir':
|
||||||
|
case 'lancer':
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
isCompetencePossession() { return TYPES.competencecreature == this.type && this.system.categorie == "possession" }
|
||||||
isTemporel() { return typesObjetsTemporels.includes(this.type) }
|
isTemporel() { return typesObjetsTemporels.includes(this.type) }
|
||||||
isOeuvre() { return typesObjetsOeuvres.includes(this.type) }
|
isOeuvre() { return typesObjetsOeuvres.includes(this.type) }
|
||||||
isDraconique() { return RdDItem.getItemTypesDraconiques().includes(this.type) }
|
isDraconique() { return RdDItem.getItemTypesDraconiques().includes(this.type) }
|
||||||
|
isQueueDragon() { return [TYPES.queue, TYPES.ombre].includes(this.type) }
|
||||||
isEffet() { return typesObjetsEffet.includes(this.type) }
|
isEffet() { return typesObjetsEffet.includes(this.type) }
|
||||||
isConnaissance() { return typesObjetsConnaissance.includes(this.type) }
|
isConnaissance() { return typesObjetsConnaissance.includes(this.type) }
|
||||||
|
|
||||||
isInventaire(mode = 'materiel') { return RdDItem.getItemTypesInventaire(mode).includes(this.type); }
|
isInventaire(mode = 'materiel') { return RdDItem.getItemTypesInventaire(mode).includes(this.type); }
|
||||||
isBoisson() { return this.isNourritureBoisson() && this.system.boisson; }
|
isBoisson() { return this.isNourritureBoisson() && this.system.boisson; }
|
||||||
isAlcool() { return this.isNourritureBoisson() && this.system.boisson && this.system.alcoolise; }
|
isAlcool() { return this.isNourritureBoisson() && this.system.boisson && this.system.alcoolise; }
|
||||||
isHerbeAPotion() { return this.type == 'herbe' && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); }
|
isHerbeAPotion() { return this.type == TYPES.herbe && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); }
|
||||||
|
isBlessure() { return this.type == TYPES.blessure }
|
||||||
|
|
||||||
isPresentDansMilieux(milieux) {
|
isPresentDansMilieux(milieux) {
|
||||||
return this.getEnvironnements(milieux).length > 0
|
return this.getEnvironnements(milieux).length > 0
|
||||||
}
|
}
|
||||||
|
getCategories() {
|
||||||
|
switch (this.type) {
|
||||||
|
case TYPES.competence: return RdDItemCompetence.getCategories()
|
||||||
|
case TYPES.competencecreature: return RdDItemCompetenceCreature.getCategories()
|
||||||
|
}
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
|
||||||
getEnvironnements(milieux = undefined) {
|
getEnvironnements(milieux = undefined) {
|
||||||
const environnements = this.isInventaire() ? this.system.environnement : undefined;
|
const environnements = this.isInventaire() ? this.system.environnement : undefined;
|
||||||
@@ -260,15 +350,15 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
getUtilisation() {
|
getUtilisation() {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case 'potion':
|
case TYPES.potion:
|
||||||
switch (this.system.categorie) {
|
switch (this.system.categorie) {
|
||||||
case 'Alchimie': case 'AlchimieEnchante': case 'AlchimieAutre': return 'alchimie'
|
case 'Alchimie': case 'AlchimieEnchante': case 'AlchimieAutre': return 'alchimie'
|
||||||
case 'Cuisine': return 'cuisine'
|
case 'Cuisine': return 'cuisine'
|
||||||
case 'Remede': case 'Repos': case 'ReposEnchante': case 'Soin': case 'SoinEnchante': return 'soins'
|
case 'Remede': case 'Repos': case 'ReposEnchante': case 'Soin': case 'SoinEnchante': return 'soins'
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
case 'nourritureboisson': return 'cuisine';
|
case TYPES.nourritureboisson: return 'cuisine';
|
||||||
case 'herbe': case 'faune': case 'ingredient': case 'plante':
|
case TYPES.herbe: case TYPES.faune: case TYPES.ingredient: case TYPES.plante:
|
||||||
switch (this.system.categorie) {
|
switch (this.system.categorie) {
|
||||||
case 'Cuisine': return 'cuisine';
|
case 'Cuisine': return 'cuisine';
|
||||||
case 'Toxique': case 'Poison': return 'poison';
|
case 'Toxique': case 'Poison': return 'poison';
|
||||||
@@ -283,9 +373,9 @@ export class RdDItem extends Item {
|
|||||||
getUtilisationCuisine() {
|
getUtilisationCuisine() {
|
||||||
if (this.getUtilisation() == 'cuisine') {
|
if (this.getUtilisation() == 'cuisine') {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case 'nourritureboisson':
|
case TYPES.nourritureboisson:
|
||||||
return 'pret';
|
return 'pret';
|
||||||
case 'herbe': case 'faune': case 'ingredient': case 'plante':
|
case TYPES.herbe: case TYPES.faune: case TYPES.ingredient: case TYPES.plante:
|
||||||
return 'brut';
|
return 'brut';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -293,7 +383,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isCristalAlchimique() {
|
isCristalAlchimique() {
|
||||||
return this.type == 'objet' && Grammar.toLowerCaseNoAccent(this.name) == 'cristal alchimique' && this.system.quantite > 0;
|
return this.type == TYPES.objet && Grammar.includesLowerCaseNoAccent(this.name, 'cristal alchimique') && this.system.quantite > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
isMagique() {
|
isMagique() {
|
||||||
@@ -316,21 +406,31 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getEncTotal() {
|
getEncTotal() {
|
||||||
return (this.isService() ? 0 : this.getQuantite()) * this.getEnc();
|
return (this.getQuantite() ?? 0) * this.getEnc();
|
||||||
}
|
}
|
||||||
|
|
||||||
getEnc() {
|
getEnc() {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case 'service':
|
case TYPES.service:
|
||||||
return 0;
|
return 0;
|
||||||
case 'herbe':
|
case TYPES.herbe:
|
||||||
return this.getEncHerbe();
|
return this.getEncHerbe();
|
||||||
case 'gemme':
|
case TYPES.gemme:
|
||||||
return encPepin * this.system.taille;
|
return encPepin * this.system.taille;
|
||||||
}
|
}
|
||||||
return Math.max(this.system.encombrement ?? 0, 0);
|
return Math.max(this.system.encombrement ?? 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getEncContenu() {
|
||||||
|
return this.getContenu()
|
||||||
|
.map(it => it.getRecursiveEnc())
|
||||||
|
.reduce(Misc.sum(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
getRecursiveEnc() {
|
||||||
|
return this.getEncTotal() + this.getEncContenu()
|
||||||
|
}
|
||||||
|
|
||||||
getEncHerbe() {
|
getEncHerbe() {
|
||||||
switch (this.system.categorie) {
|
switch (this.system.categorie) {
|
||||||
case 'Repos': case 'Soin': case 'Alchimie':
|
case 'Repos': case 'Soin': case 'Alchimie':
|
||||||
@@ -340,6 +440,18 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getContenu() {
|
||||||
|
if (this.isConteneur()) {
|
||||||
|
return this.system.contenu.map(idContenu => this.actor.getItem(idContenu));
|
||||||
|
}
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
isConteneurContenu(conteneur) {
|
||||||
|
return this.getContenu()
|
||||||
|
.find(it => it.id == conteneur.id || it.isConteneurContenu(conteneur))
|
||||||
|
}
|
||||||
|
|
||||||
valeurTotale() {
|
valeurTotale() {
|
||||||
return (this.isService() ? 1 : this.getQuantite()) * this.valeur()
|
return (this.isService() ? 1 : this.getQuantite()) * this.valeur()
|
||||||
}
|
}
|
||||||
@@ -365,6 +477,7 @@ export class RdDItem extends Item {
|
|||||||
}
|
}
|
||||||
this.system.actionPrincipale = this.getActionPrincipale({ warnIfNot: false });
|
this.system.actionPrincipale = this.getActionPrincipale({ warnIfNot: false });
|
||||||
}
|
}
|
||||||
|
this.equipable = this.isEquipable();
|
||||||
}
|
}
|
||||||
|
|
||||||
prepareDataPotion() {
|
prepareDataPotion() {
|
||||||
@@ -380,19 +493,19 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
getActionPrincipale(options = { warnIfNot: true }) {
|
getActionPrincipale(options = { warnIfNot: true }) {
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case 'conteneur': return 'Ouvrir';
|
case TYPES.conteneur: return 'Ouvrir';
|
||||||
}
|
}
|
||||||
if (this.actor?.isPersonnage()) {
|
if (this.actor?.isPersonnage()) {
|
||||||
const warn = options.warnIfNot;
|
const warn = options.warnIfNot;
|
||||||
if (this.getUtilisationCuisine() == 'brut') {
|
if (this.getUtilisationCuisine() == 'brut') {
|
||||||
return 'Utiliser';
|
return 'Cuisiner';
|
||||||
}
|
}
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case 'nourritureboisson': return this._actionOrWarnQuantiteZero(this.system.boisson ? 'Boire' : 'Manger', warn);
|
case TYPES.nourritureboisson: return this._actionOrWarnQuantiteZero(this.system.boisson ? 'Boire' : 'Manger', warn);
|
||||||
case 'potion': return this._actionOrWarnQuantiteZero('Boire', warn);
|
case TYPES.potion: return this._actionOrWarnQuantiteZero('Consommer', warn);
|
||||||
case 'livre': return this._actionOrWarnQuantiteZero('Lire', warn);
|
case TYPES.livre: return this._actionOrWarnQuantiteZero('Lire', warn);
|
||||||
case 'herbe': return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined;
|
case TYPES.herbe: return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined;
|
||||||
case 'queue': case 'ombre': return this.system.refoulement > 0 ? 'Refouler' : undefined;
|
case TYPES.queue: case TYPES.ombre: return this.system.refoulement > 0 ? 'Refouler' : undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
@@ -400,19 +513,8 @@ export class RdDItem extends Item {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async actionPrincipale(actor, onActionItem = async () => { }) {
|
async actionPrincipale(actor, onActionItem = async () => { }) {
|
||||||
if (!this.getActionPrincipale()) {
|
if (!this.getActionPrincipale()) { return }
|
||||||
return;
|
await actor?.actionPrincipale(this, onActionItem);
|
||||||
}
|
|
||||||
if (await actor.actionNourritureboisson(this, onActionItem)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (this.type) {
|
|
||||||
case 'potion': return await actor.consommerPotion(this, onActionItem);
|
|
||||||
case 'livre': return await actor.actionLire(this);
|
|
||||||
case 'conteneur': return await this.sheet.render(true);
|
|
||||||
case 'herbe': return await actor.actionHerbe(this);
|
|
||||||
case 'queue': case 'ombre': return await actor.actionRefoulement(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_actionOrWarnQuantiteZero(actionName, warn) {
|
_actionOrWarnQuantiteZero(actionName, warn) {
|
||||||
@@ -610,7 +712,7 @@ export class RdDItem extends Item {
|
|||||||
_armeChatData() {
|
_armeChatData() {
|
||||||
return [
|
return [
|
||||||
`<b>Compétence</b>: ${this.system.competence}`,
|
`<b>Compétence</b>: ${this.system.competence}`,
|
||||||
`<b>Dommages</b>: ${this.system.dommages}`,
|
`<b>Dommages</b>: ${this.system.dommages} ${this.system.mortalite == 'non-mortel' ? '(Non mortel)' : ''}`,
|
||||||
`<b>Force minimum</b>: ${this.system.force}`,
|
`<b>Force minimum</b>: ${this.system.force}`,
|
||||||
`<b>Resistance</b>: ${this.system.resistance}`,
|
`<b>Resistance</b>: ${this.system.resistance}`,
|
||||||
...this._inventaireTemplateChatData()
|
...this._inventaireTemplateChatData()
|
||||||
|
|||||||
51
module/item/armure.js
Normal file
51
module/item/armure.js
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
import { RdDItem } from "../item.js";
|
||||||
|
import { Misc } from "../misc.js";
|
||||||
|
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
||||||
|
|
||||||
|
export class RdDItemArmure extends RdDItem {
|
||||||
|
|
||||||
|
static get defaultIcon() {
|
||||||
|
return "systems/foundryvtt-reve-de-dragon/icons/armes_armures/armure_plaques.webp";
|
||||||
|
}
|
||||||
|
|
||||||
|
deteriorerArmure(dmg) {
|
||||||
|
if (!ReglesOptionnelles.isUsing('deteriorationArmure') || this.system.protection == '0') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let deterioration = (this.system.deterioration ?? 0) + dmg;
|
||||||
|
let protection = this.system.protection;
|
||||||
|
|
||||||
|
if (deterioration >= 10) {
|
||||||
|
deterioration -= 10;
|
||||||
|
protection = this.calculProtectionDeterioree();
|
||||||
|
ChatMessage.create({ content: `Votre armure ${this.name} s'est détériorée, elle protège maintenant de ${protection}` });
|
||||||
|
}
|
||||||
|
this.update({
|
||||||
|
system: {
|
||||||
|
deterioration: deterioration,
|
||||||
|
protection: protection
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
calculProtectionDeterioree() {
|
||||||
|
const protectionCourante = this.system.protection;
|
||||||
|
let res = /(\d+)?d(\d+)(\-\d+)?/.exec(protectionCourante);
|
||||||
|
if (res) {
|
||||||
|
let protection = Misc.toInt(res[2]);
|
||||||
|
let malus = Misc.toInt(res[3]) - 1;
|
||||||
|
if (protection + malus <= 0) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return `1d${protection}${malus}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (/\d+/.exec(protectionCourante)) {
|
||||||
|
return `1d${protectionCourante}`;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ui.notifications.warn(`La valeur d'armure de votre ${this.name} est incorrecte`);
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
199
module/item/blessure.js
Normal file
199
module/item/blessure.js
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
import { RdDItem } from "../item.js";
|
||||||
|
import { Misc } from "../misc.js";
|
||||||
|
import { RdDTimestamp } from "../time/rdd-timestamp.js";
|
||||||
|
|
||||||
|
const BASE_TACHE_SOIN_BLESSURE = {
|
||||||
|
type: "tache",
|
||||||
|
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_chirurgie.webp',
|
||||||
|
system: { carac: "dexterite", competence: "Chirurgie", periodicite: "1 round", fatigue: 0, }
|
||||||
|
}
|
||||||
|
const TACHES_SOIN_BLESSURE = {
|
||||||
|
6: { name: 'Blessure critique', system: { difficulte: -6, points_de_tache: 6 } },
|
||||||
|
4: { name: 'Blessure grave', system: { difficulte: -4, points_de_tache: 4 } },
|
||||||
|
2: { name: 'Blessure légère', system: { difficulte: -2, points_de_tache: 2 } },
|
||||||
|
}
|
||||||
|
|
||||||
|
const definitionsBlessures = [
|
||||||
|
{ type: "contusion", gravite: 0, label: 'Contusion/éraflure', max: 100, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/eraflure.webp" },
|
||||||
|
{ type: "legere", gravite: 2, label: 'Légère', max: 5, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/blessure.webp" },
|
||||||
|
{ type: "grave", gravite: 4, label: 'Grave', max: 2, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/blessure.webp" },
|
||||||
|
{ type: "critique", gravite: 6, label: 'Critique', max: 1, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/blessure.webp" },
|
||||||
|
{ type: "mort", gravite: 8, label: 'Mort', max: 1, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/mort.webp" }
|
||||||
|
]
|
||||||
|
|
||||||
|
export class RdDItemBlessure extends RdDItem {
|
||||||
|
|
||||||
|
static get defaultIcon() {
|
||||||
|
return "systems/foundryvtt-reve-de-dragon/icons/sante/blessure.webp";
|
||||||
|
}
|
||||||
|
|
||||||
|
prepareDerivedData() {
|
||||||
|
super.prepareDerivedData();
|
||||||
|
this.system.label = this.getLabelGravite()
|
||||||
|
}
|
||||||
|
|
||||||
|
static prepareTacheSoin(gravite) {
|
||||||
|
const tache = TACHES_SOIN_BLESSURE[gravite]
|
||||||
|
if (!tache) {
|
||||||
|
ui.notifications.warn(`Pas de tâche de soins pour une blessure ${gravite}`)
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return mergeObject(duplicate(BASE_TACHE_SOIN_BLESSURE), tache)
|
||||||
|
}
|
||||||
|
static async createBlessure(actor, gravite, localisation = '', attacker) {
|
||||||
|
const definition = RdDItemBlessure.getDefinition(gravite)
|
||||||
|
const blessure = {
|
||||||
|
name: definition.label,
|
||||||
|
type: 'blessure',
|
||||||
|
img: definition.icon,
|
||||||
|
system: {
|
||||||
|
gravite: gravite,
|
||||||
|
difficulte: - gravite,
|
||||||
|
localisation: localisation,
|
||||||
|
origine: attacker?.name ?? ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const blessures = await actor.createEmbeddedDocuments('Item', [blessure])
|
||||||
|
return blessures[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
static async createTacheSoinBlessure(actor, gravite) {
|
||||||
|
const tache = RdDItemBlessure.prepareTacheSoin(gravite)
|
||||||
|
if (tache) {
|
||||||
|
const taches = await actor.createEmbeddedDocuments('Item', [tache], { renderSheet: false });
|
||||||
|
return taches[0];
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateTacheSoinBlessure(tache) {
|
||||||
|
if (tache) {
|
||||||
|
await tache.update({
|
||||||
|
system: {
|
||||||
|
itemId: this.id,
|
||||||
|
difficulte: Math.min(this.system.difficulte, tache.system.difficulte),
|
||||||
|
points_de_tache_courant: Math.max(0, this.system.premierssoins.tache)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSoinsBlessure(systemUpdate = {}) {
|
||||||
|
systemUpdate = mergeObject(systemUpdate, this.system, { overwrite: false }),
|
||||||
|
systemUpdate.soinscomplets.done = systemUpdate.premierssoins.done && systemUpdate.soinscomplets.done
|
||||||
|
await this.update({
|
||||||
|
img: this.getImgSoins(systemUpdate.gravite, systemUpdate.soinscomplets.done),
|
||||||
|
system: systemUpdate
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async recuperationBlessure({ actor, timestamp, message, isMaladeEmpoisonne, blessures }) {
|
||||||
|
if (this.parent != actor || actor == undefined) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (new RdDTimestamp(this.system.temporel.fin).compare(timestamp) > 0) {
|
||||||
|
// attente periode
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (this.system.gravite > 0) {
|
||||||
|
const update = { system: { premierssoins: { bonus: 0 }, soinscomplets: { bonus: 0 } } }
|
||||||
|
const gravite = this.system.gravite;
|
||||||
|
const graviteMoindre = gravite - 2;
|
||||||
|
const moindres = blessures.filter(it => it.system.gravite == graviteMoindre, 'blessures').length
|
||||||
|
const label = this.getLabelGravite();
|
||||||
|
|
||||||
|
let rolled = await actor.jetRecuperationConstitution(this.system.soinscomplets.bonus, message);
|
||||||
|
|
||||||
|
if (rolled.isETotal) {
|
||||||
|
message.content += ` -- une blessure ${label} s'infecte (temps de guérison augmenté de ${gravite} jours, perte de vie)`;
|
||||||
|
await actor.santeIncDec("vie", -1);
|
||||||
|
mergeObject(update, {
|
||||||
|
system: { fin: { indexDate: timestamp.addJours(gravite).indexDate } }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!isMaladeEmpoisonne && rolled.isSuccess && this.peutRetrograder(graviteMoindre, moindres)) {
|
||||||
|
message.content += ` -- une blessure ${label} cicatrise`;
|
||||||
|
mergeObject(update, {
|
||||||
|
system: { gravite: graviteMoindre, fin: { indexDate: timestamp.addJours(graviteMoindre).indexDate } }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
message.content += ` -- une blessure ${label} reste stable`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await this.update(update);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
peutRetrograder(graviteMoindre, moindres) {
|
||||||
|
return moindres < RdDItemBlessure.getDefinition(graviteMoindre).max
|
||||||
|
}
|
||||||
|
|
||||||
|
async calculerFinPeriodeTemporel(debut) {
|
||||||
|
return await debut.nouveauJour().addJours(this.system.gravite);
|
||||||
|
}
|
||||||
|
|
||||||
|
async onFinPeriode(oldTimestamp, newTimestamp) {
|
||||||
|
if (this.system.gravite <= 0) {
|
||||||
|
await super.onFinPeriode(oldTimestamp, newTimestamp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getImgSoins(gravite, soins) {
|
||||||
|
let img = 'blessure'
|
||||||
|
if (gravite > 6) {
|
||||||
|
img = 'mort'
|
||||||
|
}
|
||||||
|
if (gravite <= 0) {
|
||||||
|
img = 'eraflure'
|
||||||
|
}
|
||||||
|
return `systems/foundryvtt-reve-de-dragon/icons/sante/${soins ? 'blessure-soins' : img}.webp`
|
||||||
|
}
|
||||||
|
|
||||||
|
getLabelGravite() {
|
||||||
|
return RdDItemBlessure.getDefinition(this.system.gravite).label
|
||||||
|
}
|
||||||
|
|
||||||
|
static getDefinition(gravite) {
|
||||||
|
return definitionsBlessures.sort(Misc.ascending(it => it.gravite))
|
||||||
|
.find(it => it.gravite >= gravite);
|
||||||
|
}
|
||||||
|
static maxBlessures(gravite) {
|
||||||
|
return RdDItemBlessure.getDefinition(gravite).max
|
||||||
|
}
|
||||||
|
|
||||||
|
isContusion() {
|
||||||
|
return this.system.gravite <= 0
|
||||||
|
}
|
||||||
|
isLegere() {
|
||||||
|
return this.system.gravite > 0 && this.system.gravite <= 2
|
||||||
|
}
|
||||||
|
isGrave() {
|
||||||
|
return this.system.gravite > 2 && this.system.gravite <= 4
|
||||||
|
}
|
||||||
|
isCritique() {
|
||||||
|
return this.system.gravite > 4 && this.system.gravite <= 6
|
||||||
|
}
|
||||||
|
isMort() {
|
||||||
|
return this.system.gravite > 6
|
||||||
|
}
|
||||||
|
|
||||||
|
getProprietes() {
|
||||||
|
return [
|
||||||
|
RdDItem.propertyIfDefined('Causée par', this.system.origine, this.system.origine),
|
||||||
|
`<b>Heure et Date</b>: ${new RdDTimestamp(this.system.temporel.debut).formatDateHeure()}`,
|
||||||
|
RdDItem.propertyIfDefined('Blessé', this.parent?.name, this.parent),
|
||||||
|
`<b>Localisation</b>: ${this.system.localisation}`,
|
||||||
|
`<b>Gravité</b>: ${RdDItemBlessure.getDefinition(this.system.gravite).label}`,
|
||||||
|
`<b>Difficulté des soins</b>: ${this.system.difficulte}`,
|
||||||
|
(this.system.soinscomplets.done ?
|
||||||
|
`<b>Bonus soins complets</b>: ${this.system.soinscomplets.bonus}` :
|
||||||
|
(this.system.premierssoins.done ?
|
||||||
|
`<b>Bonus premiers soins</b>: ${this.system.premierssoins.bonus}` :
|
||||||
|
`<b>Points de tâche</b>: ${this.system.premierssoins.tache}`
|
||||||
|
)
|
||||||
|
),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { RdDItem } from "../item.js";
|
import { RdDItem } from "../item.js";
|
||||||
import { Misc } from "../misc.js";
|
import { Misc } from "../misc.js";
|
||||||
import { RdDTimestamp } from "../rdd-timestamp.js";
|
import { RdDTimestamp } from "../time/rdd-timestamp.js";
|
||||||
|
|
||||||
export class RdDItemMaladie extends RdDItem {
|
export class RdDItemMaladie extends RdDItem {
|
||||||
|
|
||||||
|
|||||||
29
module/item/sheet-blessure.js
Normal file
29
module/item/sheet-blessure.js
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { RdDItemSheet } from "../item-sheet.js";
|
||||||
|
|
||||||
|
export class RdDBlessureItemSheet extends RdDItemSheet {
|
||||||
|
|
||||||
|
static get ITEM_TYPE() { return "blessure" };
|
||||||
|
|
||||||
|
async getData() {
|
||||||
|
const formData = await super.getData();
|
||||||
|
formData.disabled = formData.options.isGM || formData.options.isOwned ? '' : 'disabled';
|
||||||
|
return formData;
|
||||||
|
}
|
||||||
|
|
||||||
|
activateListeners(html) {
|
||||||
|
super.activateListeners(html);
|
||||||
|
|
||||||
|
if (!this.options.editable) return;
|
||||||
|
|
||||||
|
this.html.find('[name="premierssoins-done"]').change(async event => {
|
||||||
|
await this.item.setSoinsBlessure({ premierssoins: { done: event.currentTarget.checked } });
|
||||||
|
});
|
||||||
|
this.html.find('[name="soinscomplets-done"]').change(async event => {
|
||||||
|
await this.item.setSoinsBlessure({ soinscomplets: { done: event.currentTarget.checked } })
|
||||||
|
});
|
||||||
|
this.html.find('[name="system-gravite"]').change(async event => {
|
||||||
|
const gravite = Number(event.currentTarget.value)
|
||||||
|
await this.item.setSoinsBlessure({ gravite: gravite, difficulte: - gravite })
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,7 +29,7 @@ export class RdDConteneurItemSheet extends RdDItemInventaireSheet {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
prepareConteneurData(formData) {
|
prepareConteneurData(formData) {
|
||||||
RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
|
RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
|
||||||
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
|
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.inventaires);
|
||||||
formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems;
|
formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { RdDItem, defaultItemImg } from "../item.js";
|
|||||||
import { Misc } from "../misc.js";
|
import { Misc } from "../misc.js";
|
||||||
import { RdDDice } from "../rdd-dice.js";
|
import { RdDDice } from "../rdd-dice.js";
|
||||||
import { RdDRollTables } from "../rdd-rolltables.js";
|
import { RdDRollTables } from "../rdd-rolltables.js";
|
||||||
import { RdDTimestamp } from "../rdd-timestamp.js";
|
import { RdDTimestamp } from "../time/rdd-timestamp.js";
|
||||||
import { TMRType, TMRUtility } from "../tmr-utility.js";
|
import { TMRType, TMRUtility } from "../tmr-utility.js";
|
||||||
|
|
||||||
const tableSignesIndicatifs = [
|
const tableSignesIndicatifs = [
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import { RdDBaseActor } from "./actor/base-actor.js";
|
|||||||
import { LOG_HEAD, SYSTEM_RDD } from "./constants.js";
|
import { LOG_HEAD, SYSTEM_RDD } from "./constants.js";
|
||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { Monnaie } from "./item-monnaie.js";
|
import { Monnaie } from "./item-monnaie.js";
|
||||||
import { RdDItem } from "./item.js";
|
import { RdDItem, TYPES } from "./item.js";
|
||||||
import { RdDTimestamp } from "./rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
import { RdDRaretes } from "./item/raretes.js";
|
import { RdDRaretes } from "./item/raretes.js";
|
||||||
|
|
||||||
class Migration {
|
class Migration {
|
||||||
@@ -13,7 +13,7 @@ class Migration {
|
|||||||
|
|
||||||
async applyItemsUpdates(computeUpdates) {
|
async applyItemsUpdates(computeUpdates) {
|
||||||
await game.actors.forEach(async (actor) => {
|
await game.actors.forEach(async (actor) => {
|
||||||
const actorItemUpdates = computeUpdates(actor.items);
|
const actorItemUpdates = computeUpdates(actor.items).filter(it => it != undefined);
|
||||||
if (actorItemUpdates.length > 0) {
|
if (actorItemUpdates.length > 0) {
|
||||||
console.log(
|
console.log(
|
||||||
this.code,
|
this.code,
|
||||||
@@ -24,7 +24,7 @@ class Migration {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const itemUpdates = computeUpdates(game.items);
|
const itemUpdates = computeUpdates(game.items).filter(it => it != undefined);
|
||||||
if (itemUpdates.length > 0) {
|
if (itemUpdates.length > 0) {
|
||||||
console.log(this.code, "Applying updates on items", itemUpdates);
|
console.log(this.code, "Applying updates on items", itemUpdates);
|
||||||
await Item.updateDocuments(itemUpdates);
|
await Item.updateDocuments(itemUpdates);
|
||||||
@@ -65,7 +65,6 @@ class _1_5_34_migrationPngWebp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class _10_0_16_MigrationSortsReserve extends Migration {
|
class _10_0_16_MigrationSortsReserve extends Migration {
|
||||||
get code() { return "creation-item-sort-reserve"; }
|
get code() { return "creation-item-sort-reserve"; }
|
||||||
get version() { return "10.0.16"; }
|
get version() { return "10.0.16"; }
|
||||||
@@ -370,6 +369,7 @@ class _10_4_6_ServicesEnCommerces extends Migration {
|
|||||||
return itemToCreate;
|
return itemToCreate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _10_5_0_UpdatePeriodicite extends Migration {
|
class _10_5_0_UpdatePeriodicite extends Migration {
|
||||||
get code() { return "migration-periodicite-poisons-maladies"; }
|
get code() { return "migration-periodicite-poisons-maladies"; }
|
||||||
get version() { return "10.5.0"; }
|
get version() { return "10.5.0"; }
|
||||||
@@ -416,6 +416,104 @@ class _10_5_0_UpdatePeriodicite extends Migration {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _10_7_0_MigrationBlessures extends Migration {
|
||||||
|
get code() { return "migration-blessures"; }
|
||||||
|
get version() { return "10.7.0"; }
|
||||||
|
|
||||||
|
async migrate() {
|
||||||
|
const timestamp = game.system.rdd.calendrier.getTimestamp()
|
||||||
|
await Promise.all(game.actors.filter(it => it.isPersonnage() || it.isCreature())
|
||||||
|
.map(async (actor) => {
|
||||||
|
const legeres = actor.system.blessures?.legeres.liste.filter(it => it.active).map(it => this.creerBlessure(2, 'légère', it, timestamp)) ?? [];
|
||||||
|
const graves = actor.system.blessures?.graves.liste.filter(it => it.active).map(it => this.creerBlessure(4, 'grave', it, timestamp)) ?? [];
|
||||||
|
const critiques = actor.system.blessures?.critiques.liste.filter(it => it.active).map(it => this.creerBlessure(6, 'critique', it, timestamp));
|
||||||
|
const blessures = legeres.concat(graves).concat(critiques);
|
||||||
|
if (blessures.length > 0) {
|
||||||
|
await actor.createEmbeddedDocuments("Item", blessures);
|
||||||
|
}
|
||||||
|
await actor.update({
|
||||||
|
'system.blessures.legeres.liste': [],
|
||||||
|
'system.blessures.graves.liste': [],
|
||||||
|
'system.blessures.critiques.liste': []
|
||||||
|
})
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
creerBlessure(gravite, graviteTexte, blessure, timestamp) {
|
||||||
|
const dateBlessure = timestamp.addJours(-blessure.jours);
|
||||||
|
const datePremiereRecup = dateBlessure.addJours(gravite);
|
||||||
|
return {
|
||||||
|
name: `Blessure ${graviteTexte}`,
|
||||||
|
type: 'blessure',
|
||||||
|
img: `systems/foundryvtt-reve-de-dragon/icons/sante/blessure${blessure.psdone ? '-soins' : ''}.webp`,
|
||||||
|
system: {
|
||||||
|
gravite: gravite,
|
||||||
|
difficulte: -gravite,
|
||||||
|
debut: { indexDate: dateBlessure.indexDate, indexMinute: 0 },
|
||||||
|
fin: { indexDate: datePremiereRecup.indexDate, indexMinute: 0 },
|
||||||
|
premierssoins: { done: blessure.psdone, bonus: blessure.premiers_soins },
|
||||||
|
soinscomplets: { done: blessure.scdone, bonus: blessure.soins_complets },
|
||||||
|
localisation: blessure.localisation
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _10_7_19_CategorieCompetenceCreature extends Migration {
|
||||||
|
get code() { return "categorie-competence-creature"; }
|
||||||
|
get version() { return "10.7.19"; }
|
||||||
|
|
||||||
|
async migrate() {
|
||||||
|
await this.applyItemsUpdates(items => items
|
||||||
|
.filter(it => TYPES.competencecreature == it.type)
|
||||||
|
.map(it => this.migrateCompetenceCreature(it))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
migrateCompetenceCreature(it) {
|
||||||
|
const categorie = this.getCategorie(it)
|
||||||
|
if (categorie == it.system.categorie) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
return { _id: it.id, 'system.categorie': categorie }
|
||||||
|
}
|
||||||
|
|
||||||
|
getCategorie(it) {
|
||||||
|
if (it.system.ispossession) {
|
||||||
|
return 'possession'
|
||||||
|
}
|
||||||
|
switch (it.system.categorie) {
|
||||||
|
case "melee":
|
||||||
|
if (it.system.isnaturelle) {
|
||||||
|
return 'naturelle'
|
||||||
|
}
|
||||||
|
return 'melee'
|
||||||
|
case "particuliere": case "specialisee": case "connaissance":
|
||||||
|
return "generale"
|
||||||
|
default:
|
||||||
|
return it.system.categorie
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _10_7_19_PossessionsEntiteVictime extends Migration {
|
||||||
|
get code() { return "possessions-entite-victime"; }
|
||||||
|
get version() { return "10.7.19"; }
|
||||||
|
|
||||||
|
async migrate() {
|
||||||
|
await this.applyItemsUpdates(items => items
|
||||||
|
.filter(it => TYPES.possession == it.type)
|
||||||
|
.map(it => this.migratePossession(it))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
migratePossession(it) {
|
||||||
|
return { _id: it.id,
|
||||||
|
'system.entite.actorid': it.system.possesseurid,
|
||||||
|
'system.victime.actorid': it.system.possedeid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class Migrations {
|
export class Migrations {
|
||||||
static getMigrations() {
|
static getMigrations() {
|
||||||
return [
|
return [
|
||||||
@@ -431,6 +529,9 @@ export class Migrations {
|
|||||||
new _10_3_17_Monnaies(),
|
new _10_3_17_Monnaies(),
|
||||||
new _10_4_6_ServicesEnCommerces(),
|
new _10_4_6_ServicesEnCommerces(),
|
||||||
new _10_5_0_UpdatePeriodicite(),
|
new _10_5_0_UpdatePeriodicite(),
|
||||||
|
new _10_7_0_MigrationBlessures(),
|
||||||
|
new _10_7_19_CategorieCompetenceCreature(),
|
||||||
|
new _10_7_19_PossessionsEntiteVictime(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -447,7 +548,7 @@ export class Migrations {
|
|||||||
migrate() {
|
migrate() {
|
||||||
const currentVersion = game.settings.get(SYSTEM_RDD, "systemMigrationVersion");
|
const currentVersion = game.settings.get(SYSTEM_RDD, "systemMigrationVersion");
|
||||||
if (isNewerVersion(game.system.version, currentVersion)) {
|
if (isNewerVersion(game.system.version, currentVersion)) {
|
||||||
//if (true) { /* comment previous and uncomment here to test before upgrade */
|
// if (true) { /* comment previous and uncomment here to test before upgrade */
|
||||||
const migrations = Migrations.getMigrations().filter(m => isNewerVersion(m.version, currentVersion));
|
const migrations = Migrations.getMigrations().filter(m => isNewerVersion(m.version, currentVersion));
|
||||||
if (migrations.length > 0) {
|
if (migrations.length > 0) {
|
||||||
migrations.sort((a, b) => this.compareVersions(a, b));
|
migrations.sort((a, b) => this.compareVersions(a, b));
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export class Misc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static typeName(type, subType) {
|
static typeName(type, subType) {
|
||||||
return subType ? game.i18n.localize(`${type.toUpperCase()}.Type${Misc.upperFirst(subType)}`)
|
return subType ? game.i18n.localize(`TYPES.${type}.${Misc.upperFirst(subType)}`)
|
||||||
: '';
|
: '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,8 +63,8 @@ export class Misc {
|
|||||||
|
|
||||||
static keepDecimals(num, decimals) {
|
static keepDecimals(num, decimals) {
|
||||||
if (decimals <= 0 || decimals > 6) return num;
|
if (decimals <= 0 || decimals > 6) return num;
|
||||||
const decimal = Math.pow(10, parseInt(decimals));
|
const power10n = Math.pow(10, parseInt(decimals));
|
||||||
return Math.round(num * decimal) / decimal;
|
return Math.round(num * power10n) / power10n;
|
||||||
}
|
}
|
||||||
|
|
||||||
static getFractionHtml(diviseur) {
|
static getFractionHtml(diviseur) {
|
||||||
@@ -119,6 +119,17 @@ export class Misc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns an array of incremental integers (including from / excluding to).
|
||||||
|
* if max<min, the array is decrementing integers
|
||||||
|
*/
|
||||||
|
static intArray(from, to) {
|
||||||
|
if (from > to) {
|
||||||
|
return Array.from(Array(from - to).keys()).map(i => from - i)
|
||||||
|
}
|
||||||
|
return Array.from(Array(to - from).keys()).map(i => from + i)
|
||||||
|
}
|
||||||
|
|
||||||
static distinct(array) {
|
static distinct(array) {
|
||||||
return [...new Set(array)];
|
return [...new Set(array)];
|
||||||
}
|
}
|
||||||
@@ -228,4 +239,15 @@ export class Misc {
|
|||||||
}
|
}
|
||||||
return subset;
|
return subset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cssRotation(angle) {
|
||||||
|
const rotation = `rotate(${angle}deg)`;
|
||||||
|
return {
|
||||||
|
'transform': rotation,
|
||||||
|
'-ms-transform': rotation,
|
||||||
|
'-moz-transform': rotation,
|
||||||
|
'-webkit-transform': rotation,
|
||||||
|
'-o-transform': rotation
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
|
|
||||||
/**
|
|
||||||
* Extend the base Dialog entity by defining a custom window to perform roll.
|
|
||||||
* @extends {Dialog}
|
|
||||||
*/
|
|
||||||
export class RdDAstrologieEditeur extends Dialog {
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
constructor(html, calendrier, calendrierData) {
|
|
||||||
|
|
||||||
let myButtons = {
|
|
||||||
resetButton: { label: "Re-tirer les nombres astraux", callback: html => this.resetNombreAstraux() },
|
|
||||||
saveButton: { label: "Fermer", callback: html => {} }
|
|
||||||
};
|
|
||||||
|
|
||||||
// Common conf
|
|
||||||
let dialogConf = { content: html, title: "Editeur d'Astrologie", buttons: myButtons, default: "saveButton" };
|
|
||||||
let dialogOptions = {
|
|
||||||
classes: ["rdd-roll-dialog"], width: 600,
|
|
||||||
height: 'fit-content',
|
|
||||||
'max-height': 800,
|
|
||||||
'z-index': 99999
|
|
||||||
}
|
|
||||||
super(dialogConf, dialogOptions)
|
|
||||||
|
|
||||||
this.calendrier = calendrier;
|
|
||||||
this.updateData(calendrierData);
|
|
||||||
}
|
|
||||||
|
|
||||||
activateListeners(html) {
|
|
||||||
super.activateListeners(html);
|
|
||||||
this.html = html;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async resetNombreAstraux() {
|
|
||||||
game.system.rdd.calendrier.resetNombreAstral();
|
|
||||||
await game.system.rdd.calendrier.rebuildListeNombreAstral();
|
|
||||||
|
|
||||||
game.system.rdd.calendrier.showAstrologieEditor();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
updateData(calendrierData) {
|
|
||||||
this.calendrierData = duplicate(calendrierData);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
import { RdDItemCompetence } from "./item-competence.js";
|
|
||||||
import { Misc } from "./misc.js";
|
|
||||||
import { SYSTEM_SOCKET_ID } from "./constants.js";
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extend the base Dialog entity by defining a custom window to perform roll.
|
|
||||||
* @extends {Dialog}
|
|
||||||
*/
|
|
||||||
export class RdDAstrologieJoueur extends Dialog {
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static async create(actor) {
|
|
||||||
|
|
||||||
let dialogData = {
|
|
||||||
nombres: this.organizeNombres(actor),
|
|
||||||
dates: game.system.rdd.calendrier.getJoursSuivants(10),
|
|
||||||
etat: actor.getEtatGeneral(),
|
|
||||||
ajustementsConditions: CONFIG.RDD.ajustementsConditions,
|
|
||||||
astrologie: RdDItemCompetence.findCompetence(actor.items, 'Astrologie')
|
|
||||||
}
|
|
||||||
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-astrologie-joueur.html', dialogData);
|
|
||||||
|
|
||||||
const options = { classes: ["rdd-roll-dialog"], width: 600, height: 'fit-content', 'z-index': 99999 };
|
|
||||||
const dialog = new RdDAstrologieJoueur(html, actor, dialogData, options);
|
|
||||||
dialog.render(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
constructor(html, actor, dialogData, dialogOptions) {
|
|
||||||
const dialogConf = {
|
|
||||||
title: "Nombres Astraux",
|
|
||||||
content: html,
|
|
||||||
default: "saveButton",
|
|
||||||
buttons: {
|
|
||||||
saveButton: { label: "Fermer", callback: html => {} }
|
|
||||||
},
|
|
||||||
};
|
|
||||||
super(dialogConf, dialogOptions);
|
|
||||||
|
|
||||||
this.actor = actor;
|
|
||||||
this.dataNombreAstral = duplicate(dialogData);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
activateListeners(html) {
|
|
||||||
super.activateListeners(html);
|
|
||||||
this.html = html;
|
|
||||||
|
|
||||||
this.html.find("[name='diffConditions']").val(0);
|
|
||||||
|
|
||||||
this.html.find('[name="jet-astrologie"]').click((event) => {
|
|
||||||
this.requestJetAstrologie();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static organizeNombres(actor) {
|
|
||||||
let itemNombres = actor.listItems('nombreastral');
|
|
||||||
let itemFiltered = {};
|
|
||||||
for (let item of itemNombres) {
|
|
||||||
if (itemFiltered[item.system.jourindex]) {
|
|
||||||
itemFiltered[item.system.jourindex].listValues.push(item.system.value);
|
|
||||||
} else {
|
|
||||||
itemFiltered[item.system.jourindex] = {
|
|
||||||
listValues: [item.system.value],
|
|
||||||
jourlabel: item.system.jourlabel
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return itemFiltered;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
requestJetAstrologie() {
|
|
||||||
let socketData = {
|
|
||||||
id: this.actor.id,
|
|
||||||
carac_vue: this.actor.system.carac['vue'].value,
|
|
||||||
etat: this.dataNombreAstral.etat,
|
|
||||||
astrologie: this.dataNombreAstral.astrologie,
|
|
||||||
conditions: this.html.find('[name="diffConditions"]').val(),
|
|
||||||
date: this.html.find('[name="joursAstrologie"]').val(),
|
|
||||||
userId: game.user.id
|
|
||||||
}
|
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
|
||||||
game.system.rdd.calendrier.requestNombreAstral(socketData);
|
|
||||||
} else {
|
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
|
||||||
msg: "msg_request_nombre_astral",
|
|
||||||
data: socketData
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import { RdDCarac } from "./rdd-carac.js";
|
import { RdDCarac } from "./rdd-carac.js";
|
||||||
|
import { RdDPossession } from "./rdd-possession.js";
|
||||||
|
|
||||||
const conditionsTactiques = [
|
const conditionsTactiques = [
|
||||||
{ type: '', descr: '', dmg: 0, attaque: 0, parade: 0, esquive: true },
|
{ type: '', descr: '', dmg: 0, attaque: 0, parade: 0, esquive: true },
|
||||||
@@ -24,11 +25,17 @@ export class RdDBonus {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isDefenseAttaqueFinesse(rollData) {
|
static isDefenseAttaqueFinesse(rollData) {
|
||||||
|
if (rollData.isEmpoignade && rollData.rolled?.isPart) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (RdDPossession.isDefensePossession(rollData)) {
|
||||||
|
return RdDPossession.isPossessionFinesse(rollData)
|
||||||
|
}
|
||||||
return rollData.attackerRoll?.particuliere == 'finesse';
|
return rollData.attackerRoll?.particuliere == 'finesse';
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static dmg(rollData, dmgActor, isCauchemar = false) {
|
static dmg(rollData, dmgActor, isEntiteIncarnee = false) {
|
||||||
let dmg = { total: 0 };
|
let dmg = { total: 0 };
|
||||||
if (rollData.arme && rollData.arme.name.toLowerCase() == "esquive") {
|
if (rollData.arme && rollData.arme.name.toLowerCase() == "esquive") {
|
||||||
// Specific case management
|
// Specific case management
|
||||||
@@ -41,7 +48,7 @@ export class RdDBonus {
|
|||||||
dmg.dmgSurprise = RdDBonus.dmgBonus(rollData.ajustements?.attaqueDefenseurSurpris.used);
|
dmg.dmgSurprise = RdDBonus.dmgBonus(rollData.ajustements?.attaqueDefenseurSurpris.used);
|
||||||
dmg.dmgActor = rollData.selectedCarac ? RdDBonus._dmgPerso(dmgActor, rollData.selectedCarac.label, dmg.dmgArme) : 0;
|
dmg.dmgActor = rollData.selectedCarac ? RdDBonus._dmgPerso(dmgActor, rollData.selectedCarac.label, dmg.dmgArme) : 0;
|
||||||
dmg.total = dmg.dmgSurprise + dmg.dmgTactique + dmg.dmgArme + dmg.dmgActor + dmg.dmgParticuliere;
|
dmg.total = dmg.dmgSurprise + dmg.dmgTactique + dmg.dmgArme + dmg.dmgActor + dmg.dmgParticuliere;
|
||||||
dmg.mortalite = RdDBonus._calculMortalite(rollData, isCauchemar)
|
dmg.mortalite = RdDBonus._calculMortalite(rollData, isEntiteIncarnee)
|
||||||
}
|
}
|
||||||
return dmg;
|
return dmg;
|
||||||
}
|
}
|
||||||
@@ -62,11 +69,8 @@ export class RdDBonus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static _calculMortalite(rollData, isCauchemar) {
|
static _calculMortalite(rollData, isEntiteIncarnee) {
|
||||||
if (isCauchemar) {
|
return isEntiteIncarnee ? "entiteincarnee"
|
||||||
return "cauchemar";
|
|
||||||
}
|
|
||||||
return isCauchemar ? "cauchemar"
|
|
||||||
: rollData.dmg?.mortalite
|
: rollData.dmg?.mortalite
|
||||||
?? rollData.arme?.system.mortalite
|
?? rollData.arme?.system.mortalite
|
||||||
?? "mortel";
|
?? "mortel";
|
||||||
@@ -74,7 +78,7 @@ export class RdDBonus {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static _dmgArme(rollData) {
|
static _dmgArme(rollData) {
|
||||||
if ( rollData.arme) {
|
if (rollData.arme) {
|
||||||
let dmgBase = rollData.arme.system.dommagesReels ?? Number(rollData.arme.system.dommages ?? 0);
|
let dmgBase = rollData.arme.system.dommagesReels ?? Number(rollData.arme.system.dommages ?? 0);
|
||||||
//Le bonus dégats magiques ne peut pas faire dépasser le bonus de l'arme (cf p.278)
|
//Le bonus dégats magiques ne peut pas faire dépasser le bonus de l'arme (cf p.278)
|
||||||
return dmgBase + Math.min(dmgBase, rollData.arme.system.magique ? rollData.arme.system.ecaille_efficacite : 0);
|
return dmgBase + Math.min(dmgBase, rollData.arme.system.magique ? rollData.arme.system.ecaille_efficacite : 0);
|
||||||
|
|||||||
@@ -1,505 +0,0 @@
|
|||||||
import { RdDCalendrierEditeur } from "./rdd-calendrier-editeur.js";
|
|
||||||
import { RdDAstrologieEditeur } from "./rdd-astrologie-editeur.js";
|
|
||||||
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
|
||||||
import { Misc } from "./misc.js";
|
|
||||||
import { HIDE_DICE, SHOW_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
|
||||||
import { DialogChronologie } from "./dialog-chronologie.js";
|
|
||||||
import { RdDTimestamp, WORLD_TIMESTAMP_SETTING } from "./rdd-timestamp.js";
|
|
||||||
|
|
||||||
const RDD_JOUR_PAR_MOIS = 28;
|
|
||||||
const RDD_HEURES_PAR_JOUR = 12;
|
|
||||||
const MAX_NOMBRE_ASTRAL = 12;
|
|
||||||
const JOURS_DU_MOIS = Array(RDD_JOUR_PAR_MOIS).fill().map((item, index) => 1 + index);
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
export class RdDCalendrier extends Application {
|
|
||||||
|
|
||||||
static get defaultOptions() {
|
|
||||||
return mergeObject(super.defaultOptions, {
|
|
||||||
template: "systems/foundryvtt-reve-de-dragon/templates/calendar-template.html",
|
|
||||||
popOut: false,
|
|
||||||
resizable: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static createCalendrierPos() {
|
|
||||||
return { top: 200, left: 200 };
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
// position
|
|
||||||
this.calendrierPos = duplicate(game.settings.get(SYSTEM_RDD, "calendrier-pos"));
|
|
||||||
if (this.calendrierPos == undefined || this.calendrierPos.top == undefined) {
|
|
||||||
this.calendrierPos = RdDCalendrier.createCalendrierPos();
|
|
||||||
game.settings.set(SYSTEM_RDD, "calendrier-pos", this.calendrierPos);
|
|
||||||
}
|
|
||||||
// Calendrier
|
|
||||||
this.timestamp = RdDTimestamp.getWorldTime();
|
|
||||||
|
|
||||||
if (Misc.isUniqueConnectedGM()) { // Uniquement si GM
|
|
||||||
RdDTimestamp.setWorldTime(this.timestamp);
|
|
||||||
this.listeNombreAstral = this.getListeNombreAstral();
|
|
||||||
this.rebuildListeNombreAstral(HIDE_DICE); // Ensure always up-to-date
|
|
||||||
}
|
|
||||||
console.log('RdDCalendrier.constructor()', this.timestamp, this.timestamp.toCalendrier(), this.calendrierPos, this.listeNombreAstral);
|
|
||||||
Hooks.on('updateSetting', async (setting, update, options, id) => this.onUpdateSetting(setting, update, options, id));
|
|
||||||
}
|
|
||||||
|
|
||||||
async onUpdateSetting(setting, update, options, id) {
|
|
||||||
if (setting.key == SYSTEM_RDD + '.' + WORLD_TIMESTAMP_SETTING) {
|
|
||||||
this.timestamp = RdDTimestamp.getWorldTime();
|
|
||||||
this.updateDisplay();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
/** @override */
|
|
||||||
async activateListeners(html) {
|
|
||||||
super.activateListeners(html);
|
|
||||||
this.html = html;
|
|
||||||
|
|
||||||
this.updateDisplay();
|
|
||||||
|
|
||||||
this.html.find('.ajout-chronologie').click(ev => DialogChronologie.create());
|
|
||||||
|
|
||||||
this.html.find('.calendar-btn').click(ev => this.onCalendarButton(ev));
|
|
||||||
|
|
||||||
this.html.find('.calendar-btn-edit').click(ev => {
|
|
||||||
ev.preventDefault();
|
|
||||||
this.showCalendarEditor();
|
|
||||||
});
|
|
||||||
|
|
||||||
this.html.find('.astrologie-btn-edit').click(ev => {
|
|
||||||
ev.preventDefault();
|
|
||||||
this.showAstrologieEditor();
|
|
||||||
});
|
|
||||||
|
|
||||||
this.html.find('#calendar-move-handle').mousedown(ev => {
|
|
||||||
ev.preventDefault();
|
|
||||||
ev = ev || window.event;
|
|
||||||
let isRightMB = false;
|
|
||||||
if ("which" in ev) { // Gecko (Firefox), WebKit (Safari/Chrome) & Opera
|
|
||||||
isRightMB = ev.which == 3;
|
|
||||||
} else if ("button" in ev) { // IE, Opera
|
|
||||||
isRightMB = ev.button == 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isRightMB) {
|
|
||||||
dragElement(document.getElementById("calendar-time-container"));
|
|
||||||
let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
|
|
||||||
|
|
||||||
function dragElement(elmnt) {
|
|
||||||
elmnt.onmousedown = dragMouseDown;
|
|
||||||
function dragMouseDown(e) {
|
|
||||||
e = e || window.event;
|
|
||||||
e.preventDefault();
|
|
||||||
pos3 = e.clientX;
|
|
||||||
pos4 = e.clientY;
|
|
||||||
|
|
||||||
document.onmouseup = closeDragElement;
|
|
||||||
document.onmousemove = elementDrag;
|
|
||||||
}
|
|
||||||
|
|
||||||
function elementDrag(e) {
|
|
||||||
e = e || window.event;
|
|
||||||
e.preventDefault();
|
|
||||||
// calculate the new cursor position:
|
|
||||||
pos1 = pos3 - e.clientX;
|
|
||||||
pos2 = pos4 - e.clientY;
|
|
||||||
pos3 = e.clientX;
|
|
||||||
pos4 = e.clientY;
|
|
||||||
// set the element's new position:
|
|
||||||
elmnt.style.bottom = undefined
|
|
||||||
elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
|
|
||||||
elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
|
|
||||||
}
|
|
||||||
|
|
||||||
function closeDragElement() {
|
|
||||||
// stop moving when mouse button is released:
|
|
||||||
elmnt.onmousedown = undefined;
|
|
||||||
document.onmouseup = undefined;
|
|
||||||
document.onmousemove = undefined;
|
|
||||||
let xPos = (elmnt.offsetLeft - pos1) > window.innerWidth ? window.innerWidth - 200 : (elmnt.offsetLeft - pos1);
|
|
||||||
let yPos = (elmnt.offsetTop - pos2) > window.innerHeight - 20 ? window.innerHeight - 100 : (elmnt.offsetTop - pos2)
|
|
||||||
xPos = xPos < 0 ? 0 : xPos;
|
|
||||||
yPos = yPos < 0 ? 0 : yPos;
|
|
||||||
if (xPos != (elmnt.offsetLeft - pos1) || yPos != (elmnt.offsetTop - pos2)) {
|
|
||||||
elmnt.style.top = (yPos) + "px";
|
|
||||||
elmnt.style.left = (xPos) + "px";
|
|
||||||
}
|
|
||||||
game.system.rdd.calendrier.calendrierPos.top = yPos;
|
|
||||||
game.system.rdd.calendrier.calendrierPos.left = xPos;
|
|
||||||
if (game.user.isGM) {
|
|
||||||
game.settings.set(SYSTEM_RDD, "calendrier-pos", duplicate(game.system.rdd.calendrier.calendrierPos));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (isRightMB) {
|
|
||||||
game.system.rdd.calendrier.calendrierPos.top = 200;
|
|
||||||
game.system.rdd.calendrier.calendrierPos.left = 200;
|
|
||||||
if (game.user.isGM) {
|
|
||||||
game.settings.set(SYSTEM_RDD, "calendrier-pos", duplicate(game.system.rdd.calendrier.calendrierPos));
|
|
||||||
}
|
|
||||||
this.setPos(game.system.rdd.calendrier.calendrierPos);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getListeNombreAstral() {
|
|
||||||
return game.settings.get(SYSTEM_RDD, "liste-nombre-astral") ?? [];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
dateCourante() {
|
|
||||||
return this.timestamp.formatDate();
|
|
||||||
}
|
|
||||||
|
|
||||||
isAfterIndexDate(indexDate) {
|
|
||||||
// TODO: standardize
|
|
||||||
return indexDate < this.timestamp.indexDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
heureCourante() { return RdDTimestamp.definition(this.timestamp.heure); }
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getCurrentMinute() { return this.timestamp.indexMinute; }
|
|
||||||
|
|
||||||
getTimestampFinChateauDormant(nbJours = 0) {
|
|
||||||
return this.timestamp.nouveauJour().addJour(nbJours);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTimestampFinHeure(nbHeures = 0) {
|
|
||||||
return this.timestamp.nouvelleHeure().addHeures(nbHeures);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getIndexFromDate(jour, mois) {
|
|
||||||
const addYear = mois < this.timestamp.mois || (mois == this.timestamp.mois && jour < this.timestamp.jour)
|
|
||||||
const time = RdDTimestamp.timestamp(this.timestamp.annee + (addYear ? 1 : 0), mois, jour);
|
|
||||||
return time.indexDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getJoursSuivants(count) {
|
|
||||||
let jours = [];
|
|
||||||
let indexDate = this.timestamp.indexDate;
|
|
||||||
for (let i = 0; i < count; i++, indexDate++) {
|
|
||||||
jours[i] = { label: RdDTimestamp.formatIndexDate(indexDate), index: indexDate };
|
|
||||||
}
|
|
||||||
return jours;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async ajouterNombreAstral(indexDate, showDice = SHOW_DICE) {
|
|
||||||
const nombreAstral = await RdDDice.rollTotal("1dh", { showDice: showDice, rollMode: "selfroll" });
|
|
||||||
const dateFuture = RdDTimestamp.formatIndexDate(indexDate);
|
|
||||||
if (showDice != HIDE_DICE) {
|
|
||||||
ChatMessage.create({
|
|
||||||
whisper: ChatMessage.getWhisperRecipients("GM"),
|
|
||||||
content: `Le chiffre astrologique du ${dateFuture} sera le ${nombreAstral}`
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
nombreAstral: nombreAstral,
|
|
||||||
valeursFausses: [],
|
|
||||||
index: indexDate
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
resetNombreAstral() {
|
|
||||||
this.listeNombreAstral = [];
|
|
||||||
game.settings.set(SYSTEM_RDD, "liste-nombre-astral", []);
|
|
||||||
|
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
|
||||||
msg: "msg_reset_nombre_astral",
|
|
||||||
data: {}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {*} indexDate la date pour laquelle obtenir le nombre astral. Si undefined, on prend la date du jour
|
|
||||||
* @returns le nombre astral pour la date, ou pour la date du jour si la date n'est pas fournie.
|
|
||||||
* Si aucun nombre astral n'est trouvé, retourne 0 (cas où l'on demanderait un nombre astral en dehors des 12 jours courant et à venir)
|
|
||||||
*/
|
|
||||||
getNombreAstral(indexDate = undefined) {
|
|
||||||
if (indexDate == undefined) {
|
|
||||||
indexDate = this.timestamp.indexDate;
|
|
||||||
}
|
|
||||||
const listNombreAstral = this.getListeNombreAstral();
|
|
||||||
let astralData = listNombreAstral.find((nombreAstral, i) => nombreAstral.index == indexDate);
|
|
||||||
return astralData?.nombreAstral ?? 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async rebuildListeNombreAstral(showDice = HIDE_DICE) {
|
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
|
||||||
let newList = [];
|
|
||||||
for (let i = 0; i < MAX_NOMBRE_ASTRAL; i++) {
|
|
||||||
let dayIndex = this.timestamp.indexDate + i;
|
|
||||||
let na = this.listeNombreAstral.find(n => n.index == dayIndex);
|
|
||||||
if (na) {
|
|
||||||
newList[i] = na;
|
|
||||||
} else {
|
|
||||||
newList[i] = await this.ajouterNombreAstral(dayIndex, showDice);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.listeNombreAstral = newList;
|
|
||||||
game.settings.set(SYSTEM_RDD, "liste-nombre-astral", newList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async setNewTimestamp(newTimestamp) {
|
|
||||||
game.actors.forEach(actor => actor.onTimeChanging(this.timestamp, newTimestamp));
|
|
||||||
RdDTimestamp.setWorldTime(newTimestamp);
|
|
||||||
this.timestamp = newTimestamp;
|
|
||||||
await this.rebuildListeNombreAstral();
|
|
||||||
this.updateDisplay();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async onCalendarButton(ev) {
|
|
||||||
ev.preventDefault();
|
|
||||||
const calendarAvance = ev.currentTarget.attributes['data-calendar-avance'];
|
|
||||||
const calendarSet = ev.currentTarget.attributes['data-calendar-set'];
|
|
||||||
if (calendarAvance) {
|
|
||||||
await this.incrementTime(Number(calendarAvance.value));
|
|
||||||
}
|
|
||||||
else if (calendarSet) {
|
|
||||||
this.positionnerHeure(Number(calendarSet.value));
|
|
||||||
}
|
|
||||||
this.updateDisplay();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async incrementTime(minutes = 0) {
|
|
||||||
await this.setNewTimestamp(this.timestamp.addMinutes(minutes));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async incrementerJour() {
|
|
||||||
await this.setNewTimestamp(this.timestamp.nouveauJour());
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async positionnerHeure(heure) {
|
|
||||||
const indexDate = this.timestamp.indexDate;
|
|
||||||
const addDay = this.timestamp.heure < heure ? 0 : 1;
|
|
||||||
await this.setNewTimestamp(new RdDTimestamp({
|
|
||||||
indexDate: indexDate + addDay, indexHeure: 0
|
|
||||||
})
|
|
||||||
.addHeures(heure))
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
fillCalendrierData(formData = {}) {
|
|
||||||
mergeObject(formData, this.timestamp.toCalendrier());
|
|
||||||
formData.isGM = game.user.isGM;
|
|
||||||
return formData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getLectureAstrologieDifficulte(dateIndex) {
|
|
||||||
let indexNow = this.timestamp.indexDate;
|
|
||||||
let diffDay = dateIndex - indexNow;
|
|
||||||
return - Math.floor(diffDay / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async requestNombreAstral(request) {
|
|
||||||
const actor = game.actors.get(request.id);
|
|
||||||
if (Misc.isUniqueConnectedGM()) { // Only once
|
|
||||||
console.log(request);
|
|
||||||
let jourDiff = this.getLectureAstrologieDifficulte(request.date);
|
|
||||||
let niveau = Number(request.astrologie.system.niveau) + Number(request.conditions) + Number(jourDiff) + Number(request.etat);
|
|
||||||
let rollData = {
|
|
||||||
caracValue: request.carac_vue,
|
|
||||||
finalLevel: niveau,
|
|
||||||
showDice: HIDE_DICE,
|
|
||||||
rollMode: "blindroll"
|
|
||||||
};
|
|
||||||
await RdDResolutionTable.rollData(rollData);
|
|
||||||
request.rolled = rollData.rolled;
|
|
||||||
request.isValid = request.rolled.isSuccess;
|
|
||||||
request.nbAstral = this.getNombreAstral(request.date);
|
|
||||||
|
|
||||||
if (request.rolled.isSuccess) {
|
|
||||||
if (request.rolled.isPart) {
|
|
||||||
// Gestion expérience (si existante)
|
|
||||||
request.competence = actor.getCompetence("astrologie")
|
|
||||||
request.selectedCarac = actor.system.carac["vue"];
|
|
||||||
actor.appliquerAjoutExperience(request, 'hide');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
request.nbAstral = await RdDDice.rollTotal("1dhr" + request.nbAstral, {
|
|
||||||
rollMode: "selfroll", showDice: HIDE_DICE
|
|
||||||
});
|
|
||||||
// Mise à jour des nombres astraux du joueur
|
|
||||||
this.addNbAstralIncorect(request.id, request.date, request.nbAstral);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Misc.getActiveUser(request.userId)?.isGM) {
|
|
||||||
RdDUtility.responseNombreAstral(request);
|
|
||||||
} else {
|
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
|
||||||
msg: "msg_response_nombre_astral",
|
|
||||||
data: request
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addNbAstralIncorect(actorId, date, nbAstral) {
|
|
||||||
let astralData = this.listeNombreAstral.find((nombreAstral, i) => nombreAstral.index == date);
|
|
||||||
astralData.valeursFausses.push({ actorId: actorId, nombreAstral: nbAstral });
|
|
||||||
game.settings.set(SYSTEM_RDD, "liste-nombre-astral", this.listeNombreAstral);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ecartHeureChance(heureNaissance, nombreAstral, heure) {
|
|
||||||
return (heureNaissance + nombreAstral - heure) % RDD_HEURES_PAR_JOUR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getAjustementAstrologique(heureNaissance, name = undefined) {
|
|
||||||
let defHeure = RdDTimestamp.findHeure(heureNaissance);
|
|
||||||
if (defHeure) {
|
|
||||||
return RdDCalendrier.ajustementAstrologiqueHeure(defHeure.heure, this.getNombreAstral(), this.timestamp.heure);
|
|
||||||
}
|
|
||||||
else if (name) {
|
|
||||||
ui.notifications.warn(name + " n'a pas d'heure de naissance, ou elle est incorrecte : " + heureNaissance);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ui.notifications.warn(heureNaissance + " ne correspond pas à une heure de naissance");
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ajustementAstrologiqueHeure(hn, nbAstral, heure) {
|
|
||||||
switch (RdDCalendrier.ecartHeureChance(hn, nbAstral, heure)) {
|
|
||||||
case 0: return 4;
|
|
||||||
case 4: case 8: return 2;
|
|
||||||
case 6: return -4;
|
|
||||||
case 3: case 9: return -2;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getData() {
|
|
||||||
let formData = super.getData();
|
|
||||||
this.fillCalendrierData(formData);
|
|
||||||
this.setPos(this.calendrierPos);
|
|
||||||
return formData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
setPos(pos) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
function check() {
|
|
||||||
let elmnt = document.getElementById("calendar-time-container");
|
|
||||||
if (elmnt) {
|
|
||||||
elmnt.style.bottom = undefined;
|
|
||||||
let xPos = (pos.left) > window.innerWidth ? window.innerWidth - 200 : pos.left;
|
|
||||||
let yPos = (pos.top) > window.innerHeight - 20 ? window.innerHeight - 100 : pos.top;
|
|
||||||
elmnt.style.top = (yPos) + "px";
|
|
||||||
elmnt.style.left = (xPos) + "px";
|
|
||||||
resolve();
|
|
||||||
} else {
|
|
||||||
setTimeout(check, 30);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
check();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
updateDisplay() {
|
|
||||||
let calendrier = this.fillCalendrierData();
|
|
||||||
// Rebuild text du calendrier
|
|
||||||
let dateHTML = `${calendrier.jourDuMois} ${calendrier.mois.label} (${calendrier.mois.saison}) de l'année ${calendrier.annee}`
|
|
||||||
if (game.user.isGM) {
|
|
||||||
dateHTML = dateHTML + "<br>Nombre Astral: " + (this.getNombreAstral() ?? "?");
|
|
||||||
}
|
|
||||||
for (let handle of document.getElementsByClassName("calendar-date-rdd")) {
|
|
||||||
handle.innerHTML = dateHTML;
|
|
||||||
}
|
|
||||||
for (let heure of document.getElementsByClassName("calendar-heure-texte")) {
|
|
||||||
heure.innerHTML = calendrier.heure.label;
|
|
||||||
}
|
|
||||||
for (const minute of document.getElementsByClassName("calendar-time-disp")) {
|
|
||||||
minute.innerHTML = `${calendrier.minute} minutes`;
|
|
||||||
}
|
|
||||||
for (const heureImg of document.getElementsByClassName("calendar-heure-img")) {
|
|
||||||
heureImg.src = calendrier.heure.icon;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async saveEditeur(calendrierData) {
|
|
||||||
const newTimestamp = RdDTimestamp.timestamp(
|
|
||||||
Number.parseInt(calendrierData.annee),
|
|
||||||
calendrierData.mois.heure,
|
|
||||||
Number.parseInt(calendrierData.jourMois),
|
|
||||||
calendrierData.heure.heure,
|
|
||||||
Number.parseInt(calendrierData.minutes)
|
|
||||||
);
|
|
||||||
await this.setNewTimestamp(newTimestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async showCalendarEditor() {
|
|
||||||
let calendrierData = this.fillCalendrierData();
|
|
||||||
if (this.editeur == undefined) {
|
|
||||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/calendar-editor-template.html', calendrierData);
|
|
||||||
this.editeur = new RdDCalendrierEditeur(html, this, calendrierData)
|
|
||||||
}
|
|
||||||
this.editeur.updateData(calendrierData);
|
|
||||||
this.editeur.render(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static buildJoursMois() { return JOURS_DU_MOIS; }
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async showAstrologieEditor() {
|
|
||||||
const calendrierData = duplicate(this.fillCalendrierData());
|
|
||||||
this.listeNombreAstral = this.listeNombreAstral || [];
|
|
||||||
|
|
||||||
calendrierData.astrologieData = this.listeNombreAstral.map(astro => {
|
|
||||||
const timestamp = new RdDTimestamp({ indexDate: astro.index });
|
|
||||||
astro.date = { mois: timestamp.mois, jour: timestamp.jour + 1 }
|
|
||||||
for (let vf of astro.valeursFausses) {
|
|
||||||
let actor = game.actors.get(vf.actorId);
|
|
||||||
vf.actorName = (actor) ? actor.name : "Inconnu";
|
|
||||||
}
|
|
||||||
return astro;
|
|
||||||
});
|
|
||||||
|
|
||||||
const nbAstral = this.getNombreAstral()
|
|
||||||
calendrierData.heures = Array.from(Array(RDD_HEURES_PAR_JOUR).keys());
|
|
||||||
calendrierData.ajustementsActeur = game.actors.filter(it => it.isPersonnage() && it.hasPlayerOwner).map(actor => {
|
|
||||||
return {
|
|
||||||
actor,
|
|
||||||
ajustements: calendrierData.heures.map(heure => {
|
|
||||||
const hn = RdDTimestamp.findHeure(actor.getHeureNaissance())?.heure;
|
|
||||||
return {
|
|
||||||
heure,
|
|
||||||
ajustement: RdDCalendrier.ajustementAstrologiqueHeure(hn, nbAstral, heure)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/calendar-astrologie-template.html', calendrierData);
|
|
||||||
let astrologieEditeur = new RdDAstrologieEditeur(html, this, calendrierData)
|
|
||||||
astrologieEditeur.updateData(calendrierData);
|
|
||||||
astrologieEditeur.render(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
|
|
||||||
const tableCaracDerivee = {
|
const TABLE_CARACTERISTIQUES_DERIVEES = {
|
||||||
// xp: coût pour passer du niveau inférieur à ce niveau
|
// xp: coût pour passer du niveau inférieur à ce niveau
|
||||||
1: { xp: 3, poids: "moins de 1kg", plusdom: -5, sconst: 0.5, sust: 0.1 },
|
1: { xp: 3, poids: "moins de 1kg", plusdom: -5, sconst: 0.5, sust: 0.1 },
|
||||||
2: { xp: 3, poids: "1-5", plusdom: -4, sconst: 0.5, sust: 0.3 },
|
2: { xp: 3, poids: "1-5", plusdom: -4, sconst: 0.5, sust: 0.3 },
|
||||||
@@ -58,15 +58,10 @@ export class RdDCarac {
|
|||||||
selectedCarac?.label.match(/(Apparence|Force|Agilité|Dextérité|Vue|Ouïe|Odorat-Goût|Empathie|Dérobée|Mêlée|Tir|Lancer)/);
|
selectedCarac?.label.match(/(Apparence|Force|Agilité|Dextérité|Vue|Ouïe|Odorat-Goût|Empathie|Dérobée|Mêlée|Tir|Lancer)/);
|
||||||
}
|
}
|
||||||
|
|
||||||
static isIgnoreEtatGeneral(rollData) {
|
static getCaracDerivee(value) {
|
||||||
const selectedCarac = rollData.selectedCarac;
|
return TABLE_CARACTERISTIQUES_DERIVEES[Math.min(Math.max(Number(value), 1), 32)];
|
||||||
return !selectedCarac ||
|
|
||||||
rollData.ethylisme ||
|
|
||||||
RdDCarac.isChance(selectedCarac) ||
|
|
||||||
(RdDCarac.isReve(selectedCarac) && !rollData.competence);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static computeTotal(carac, beaute = undefined) {
|
static computeTotal(carac, beaute = undefined) {
|
||||||
const total = Object.values(carac ?? {}).filter(c => !c.derivee)
|
const total = Object.values(carac ?? {}).filter(c => !c.derivee)
|
||||||
.map(it => parseInt(it.value))
|
.map(it => parseInt(it.value))
|
||||||
@@ -82,7 +77,7 @@ export class RdDCarac {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static calculSConst(constitution) {
|
static calculSConst(constitution) {
|
||||||
return Number(tableCaracDerivee[Number(constitution)].sconst);
|
return RdDCarac.getCaracDerivee(constitution).sconst;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -93,7 +88,7 @@ export class RdDCarac {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static getCaracXp(targetValue) {
|
static getCaracXp(targetValue) {
|
||||||
return tableCaracDerivee[targetValue]?.xp ?? 200;
|
return RdDCarac.getCaracDerivee(targetValue)?.xp ?? 200;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -106,37 +101,4 @@ export class RdDCarac {
|
|||||||
return Grammar.toLowerCaseNoAccent(selectedCarac?.label)?.match(/(apparence|force|agilite|dexterite|vue|ouie|odorat|empathie|melee|tir|lancer|derobee)/);
|
return Grammar.toLowerCaseNoAccent(selectedCarac?.label)?.match(/(apparence|force|agilite|dexterite|vue|ouie|odorat|empathie|melee|tir|lancer|derobee)/);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static computeCarac(system) {
|
|
||||||
system.carac.force.value = Math.min(system.carac.force.value, parseInt(system.carac.taille.value) + 4);
|
|
||||||
|
|
||||||
system.carac.derobee.value = Math.floor(parseInt(((21 - system.carac.taille.value)) + parseInt(system.carac.agilite.value)) / 2);
|
|
||||||
let bonusDomKey = Math.floor((parseInt(system.carac.force.value) + parseInt(system.carac.taille.value)) / 2);
|
|
||||||
bonusDomKey = Math.min(Math.max(bonusDomKey, 0), 32); // Clamp de securite
|
|
||||||
|
|
||||||
let tailleData = tableCaracDerivee[bonusDomKey];
|
|
||||||
system.attributs.plusdom.value = tailleData.plusdom;
|
|
||||||
|
|
||||||
system.attributs.sconst.value = RdDCarac.calculSConst(system.carac.constitution.value);
|
|
||||||
system.attributs.sust.value = tableCaracDerivee[Number(system.carac.taille.value)].sust;
|
|
||||||
|
|
||||||
system.attributs.encombrement.value = (parseInt(system.carac.force.value) + parseInt(system.carac.taille.value)) / 2;
|
|
||||||
system.carac.melee.value = Math.floor((parseInt(system.carac.force.value) + parseInt(system.carac.agilite.value)) / 2);
|
|
||||||
system.carac.tir.value = Math.floor((parseInt(system.carac.vue.value) + parseInt(system.carac.dexterite.value)) / 2);
|
|
||||||
system.carac.lancer.value = Math.floor((parseInt(system.carac.tir.value) + parseInt(system.carac.force.value)) / 2);
|
|
||||||
|
|
||||||
system.sante.vie.max = Math.ceil((parseInt(system.carac.taille.value) + parseInt(system.carac.constitution.value)) / 2);
|
|
||||||
|
|
||||||
system.sante.vie.value = Math.min(system.sante.vie.value, system.sante.vie.max)
|
|
||||||
system.sante.endurance.max = Math.max(parseInt(system.carac.taille.value) + parseInt(system.carac.constitution.value), parseInt(system.sante.vie.max) + parseInt(system.carac.volonte.value));
|
|
||||||
system.sante.endurance.value = Math.min(system.sante.endurance.value, system.sante.endurance.max);
|
|
||||||
system.sante.fatigue.max = system.sante.endurance.max * 2;
|
|
||||||
system.sante.fatigue.value = Math.min(system.sante.fatigue.value, system.sante.fatigue.max);
|
|
||||||
|
|
||||||
//Compteurs
|
|
||||||
system.reve.reve.max = system.carac.reve.value;
|
|
||||||
system.compteurs.chance.max = system.carac.chance.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ import { RdDBonus } from "./rdd-bonus.js";
|
|||||||
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
||||||
import { RdDRoll } from "./rdd-roll.js";
|
import { RdDRoll } from "./rdd-roll.js";
|
||||||
import { RdDRollTables } from "./rdd-rolltables.js";
|
import { RdDRollTables } from "./rdd-rolltables.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
import { STATUSES } from "./settings/status-effects.js";
|
import { STATUSES } from "./settings/status-effects.js";
|
||||||
import { Targets } from "./targets.js";
|
import { Targets } from "./targets.js";
|
||||||
|
import { RdDEmpoignade } from "./rdd-empoignade.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const premierRoundInit = [
|
const premierRoundInit = [
|
||||||
@@ -39,35 +40,32 @@ export class RdDCombatManager extends Combat {
|
|||||||
|
|
||||||
static init() {
|
static init() {
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
Hooks.on("getCombatTrackerEntryContext", (html, options) => {
|
Hooks.on("getCombatTrackerEntryContext", (html, options) => { RdDCombatManager.pushInitiativeOptions(html, options); });
|
||||||
RdDCombatManager.pushInitiativeOptions(html, options);
|
Hooks.on("updateCombat", (combat, change, options, userId) => { RdDCombat.onUpdateCombat(combat, change, options, userId) });
|
||||||
});
|
Hooks.on("preDeleteCombat", (combat, html, id) => { combat.onPreDeleteCombat() });
|
||||||
Hooks.on("preDeleteCombat", (combat, html, id) => {
|
|
||||||
combat.onPreDeleteCombat()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
cleanItemUse() {
|
|
||||||
for (let turn of this.turns) {
|
|
||||||
turn.actor.resetItemUse()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async nextRound() {
|
async nextRound() {
|
||||||
this.cleanItemUse();
|
|
||||||
await this.finDeRound();
|
await this.finDeRound();
|
||||||
return await super.nextRound();
|
return await super.nextRound();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async onPreDeleteCombat() {
|
async onPreDeleteCombat() {
|
||||||
await this.finDeRound({ terminer: true });
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
|
await this.finDeRound({ terminer: true });
|
||||||
|
ChatUtility.removeChatMessageContaining(`<div data-combatid="${this.id}" data-combatmessage="actor-turn-summary">`)
|
||||||
|
game.messages.filter(m => ChatUtility.getMessageData(m, 'attacker-roll') != undefined && ChatUtility.getMessageData(m, 'defender-roll') != undefined)
|
||||||
|
.forEach(it => it.delete());
|
||||||
|
RdDEmpoignade.deleteAllEmpoignades()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async finDeRound(options = { terminer: false }) {
|
async finDeRound(options = { terminer: false }) {
|
||||||
|
this.turns.forEach(turn => turn.actor.resetItemUse());
|
||||||
|
|
||||||
for (let combatant of this.combatants) {
|
for (let combatant of this.combatants) {
|
||||||
if (combatant.actor) {
|
if (combatant.actor) {
|
||||||
await combatant.actor.finDeRound(options);
|
await combatant.actor.finDeRound(options);
|
||||||
@@ -89,19 +87,32 @@ export class RdDCombatManager extends Combat {
|
|||||||
let rollFormula = formula ?? RdDCombatManager.formuleInitiative(2, 10, 0, 0);
|
let rollFormula = formula ?? RdDCombatManager.formuleInitiative(2, 10, 0, 0);
|
||||||
if (!formula) {
|
if (!formula) {
|
||||||
if (combatant.actor.type == 'creature' || combatant.actor.type == 'entite') {
|
if (combatant.actor.type == 'creature' || combatant.actor.type == 'entite') {
|
||||||
const competence = combatant.actor.items.find(it => it.system.iscombat)
|
const competence = combatant.actor.items.find(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
|
||||||
if (competence) {
|
if (competence) {
|
||||||
rollFormula = RdDCombatManager.formuleInitiative(2, competence.system.carac_value, competence.system.niveau, 0);
|
rollFormula = RdDCombatManager.formuleInitiative(2, competence.system.carac_value, competence.system.niveau, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const armeCombat = combatant.actor.itemTypes['arme'].find(it => it.system.equipe)
|
const armeCombat = combatant.actor.itemTypes['arme'].find(it => it.system.equipe)
|
||||||
const compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.system.competence;
|
let compName = "Corps à corps"
|
||||||
|
if (armeCombat) {
|
||||||
|
if (armeCombat.system.competence != "") {
|
||||||
|
compName = armeCombat.system.competence
|
||||||
|
}
|
||||||
|
if (armeCombat.system.lancer != "") {
|
||||||
|
compName = armeCombat.system.lancer
|
||||||
|
}
|
||||||
|
if (armeCombat.system.tir != "") {
|
||||||
|
compName = armeCombat.system.tir
|
||||||
|
}
|
||||||
|
}
|
||||||
const competence = RdDItemCompetence.findCompetence(combatant.actor.items, compName);
|
const competence = RdDItemCompetence.findCompetence(combatant.actor.items, compName);
|
||||||
if (competence) {
|
if (competence && competence.system.defaut_carac) {
|
||||||
const carac = combatant.actor.system.carac[competence.system.defaut_carac].value;
|
const carac = combatant.actor.system.carac[competence.system.defaut_carac].value;
|
||||||
const niveau = competence.system.niveau;
|
const niveau = competence.system.niveau;
|
||||||
const bonusEcaille = (armeCombat?.system.magique) ? armeCombat.system.ecaille_efficacite : 0;
|
const bonusEcaille = (armeCombat?.system.magique) ? armeCombat.system.ecaille_efficacite : 0;
|
||||||
rollFormula = RdDCombatManager.formuleInitiative(2, carac, niveau, bonusEcaille);
|
rollFormula = RdDCombatManager.formuleInitiative(2, carac, niveau, bonusEcaille);
|
||||||
|
} else {
|
||||||
|
ui.notifications.warn(`Votre arme ${armeCombat.name} n'a pas de compétence renseignée`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -144,9 +155,8 @@ export class RdDCombatManager extends Combat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static calculInitiative(niveau, caracValue, bonusEcaille = 0) {
|
static calculInitiative(niveau, caracValue, bonus = 0) {
|
||||||
let base = niveau + Math.floor(caracValue / 2);
|
let base = niveau + Math.floor(caracValue / 2) + bonus;
|
||||||
base += bonusEcaille;
|
|
||||||
return "1d6" + (base >= 0 ? "+" : "") + base;
|
return "1d6" + (base >= 0 ? "+" : "") + base;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,8 +171,7 @@ export class RdDCombatManager extends Combat {
|
|||||||
if (arme.system.unemain && arme.system.deuxmains && !dommages.includes("/")) {
|
if (arme.system.unemain && arme.system.deuxmains && !dommages.includes("/")) {
|
||||||
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + arme.name + " ne sont pas corrects (ie sous la forme X/Y)");
|
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + arme.name + " ne sont pas corrects (ie sous la forme X/Y)");
|
||||||
}
|
}
|
||||||
if ((arme.system.unemain && arme.system.competence) ||
|
if (arme.system.unemain && arme.system.competence) {
|
||||||
(arme.system.competence.toLowerCase().includes("corps à corps"))) {
|
|
||||||
actions.push(RdDCombatManager.$prepareAttaqueArme({
|
actions.push(RdDCombatManager.$prepareAttaqueArme({
|
||||||
arme: arme,
|
arme: arme,
|
||||||
infoMain: "(1 main)",
|
infoMain: "(1 main)",
|
||||||
@@ -177,7 +186,7 @@ export class RdDCombatManager extends Combat {
|
|||||||
arme: arme,
|
arme: arme,
|
||||||
infoMain: "(2 mains)",
|
infoMain: "(2 mains)",
|
||||||
dommagesReel: Number(tableauDommages[1]),
|
dommagesReel: Number(tableauDommages[1]),
|
||||||
competence: arme.system.competence.replace(" 1 main", " 2 mains"),
|
competence: RdDItemArme.competence2Mains(arme),
|
||||||
carac: carac,
|
carac: carac,
|
||||||
competences: competences
|
competences: competences
|
||||||
}));
|
}));
|
||||||
@@ -220,15 +229,17 @@ export class RdDCombatManager extends Combat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static listActionsCreature(competences) {
|
static listActionsCreature(competences) {
|
||||||
return competences.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
|
return competences
|
||||||
.map(it => RdDItemCompetenceCreature.armeNaturelle(it));
|
.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
|
||||||
|
.map(it => RdDItemCompetenceCreature.armeCreature(it))
|
||||||
|
.filter(it => it != undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
static listActionsPossessions(actor) {
|
static listActionsPossessions(actor) {
|
||||||
return RdDCombatManager._indexActions(actor.getPossessions().map(p => {
|
return RdDCombatManager._indexActions(actor.getPossessions().map(p => {
|
||||||
return {
|
return {
|
||||||
name: p.name,
|
name: p.name,
|
||||||
action: 'conjurer',
|
action: 'possession',
|
||||||
system: {
|
system: {
|
||||||
competence: p.name,
|
competence: p.name,
|
||||||
possessionid: p.system.possessionid,
|
possessionid: p.system.possessionid,
|
||||||
@@ -245,15 +256,14 @@ export class RdDCombatManager extends Combat {
|
|||||||
return actions;
|
return actions;
|
||||||
}
|
}
|
||||||
if (actor.isCreatureEntite()) {
|
if (actor.isCreatureEntite()) {
|
||||||
actions = actions.concat(RdDCombatManager.listActionsCreature(actor.itemTypes['competencecreature']));
|
actions = RdDCombatManager.listActionsCreature(actor.itemTypes['competencecreature']);
|
||||||
} else if (actor.isPersonnage()) {
|
} else if (actor.isPersonnage()) {
|
||||||
// Recupération des items 'arme'
|
// Recupération des items 'arme'
|
||||||
const armes = actor.itemTypes['arme'].filter(it => RdDItemArme.isArmeUtilisable(it))
|
|
||||||
//.concat(RdDItemArme.empoignade())
|
|
||||||
.concat(RdDItemArme.mainsNues());
|
|
||||||
|
|
||||||
const competences = actor.itemTypes['competence'];
|
const competences = actor.itemTypes['competence'];
|
||||||
actions = actions.concat(RdDCombatManager.listActionsArmes(armes, competences, actor.system.carac));
|
const armes = actor.itemTypes['arme'].filter(it => RdDItemArme.isArmeUtilisable(it))
|
||||||
|
.concat(RdDItemArme.empoignade(actor))
|
||||||
|
.concat(RdDItemArme.mainsNues(actor));
|
||||||
|
actions = RdDCombatManager.listActionsArmes(armes, competences, actor.system.carac);
|
||||||
|
|
||||||
if (actor.system.attributs.hautrevant.value) {
|
if (actor.system.attributs.hautrevant.value) {
|
||||||
actions.push({ name: "Draconic", action: 'haut-reve', system: { initOnly: true, competence: "Draconic" } });
|
actions.push({ name: "Draconic", action: 'haut-reve', system: { initOnly: true, competence: "Draconic" } });
|
||||||
@@ -341,7 +351,7 @@ export class RdDCombatManager extends Combat {
|
|||||||
} else if (combatant.actor.getSurprise() == "demi") {
|
} else if (combatant.actor.getSurprise() == "demi") {
|
||||||
initOffset = 0;
|
initOffset = 0;
|
||||||
initInfo = "Demi Surprise"
|
initInfo = "Demi Surprise"
|
||||||
} else if (action.action == 'conjurer') {
|
} else if (action.action == 'possession') {
|
||||||
initOffset = 10;
|
initOffset = 10;
|
||||||
caracForInit = combatant.actor.getReveActuel();
|
caracForInit = combatant.actor.getReveActuel();
|
||||||
initInfo = "Possession"
|
initInfo = "Possession"
|
||||||
@@ -420,18 +430,11 @@ export class RdDCombatManager extends Combat {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDCombat {
|
export class RdDCombat {
|
||||||
|
|
||||||
static init() {
|
|
||||||
Hooks.on("updateCombat", (combat, change, options, userId) => { RdDCombat.onUpdateCombat(combat, change, options, userId) });
|
|
||||||
Hooks.on("preDeleteCombat", (combat, options, userId) => { RdDCombat.onPreDeleteCombat(combat, options, userId); });
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static onSocketMessage(sockmsg) {
|
static onSocketMessage(sockmsg) {
|
||||||
switch (sockmsg.msg) {
|
switch (sockmsg.msg) {
|
||||||
case "msg_encaisser":
|
case "msg_encaisser": return RdDCombat.onMsgEncaisser(sockmsg.data);
|
||||||
return RdDCombat.onMsgEncaisser(sockmsg.data);
|
case "msg_defense": return RdDCombat.onMsgDefense(sockmsg.data);
|
||||||
case "msg_defense":
|
|
||||||
return RdDCombat.onMsgDefense(sockmsg.data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -442,22 +445,12 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static onPreDeleteCombat(combat, options, userId) {
|
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
|
||||||
combat.cleanItemUse();
|
|
||||||
ChatUtility.removeChatMessageContaining(`<div data-combatid="${combat.id}" data-combatmessage="actor-turn-summary">`)
|
|
||||||
game.messages.filter(m => ChatUtility.getMessageData(m, 'attacker-roll') != undefined && ChatUtility.getMessageData(m, 'defender-roll') != undefined)
|
|
||||||
.forEach(it => it.delete());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static combatNouveauTour(combat) {
|
static combatNouveauTour(combat) {
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
let turn = combat.turns.find(t => t.token?.id == combat.current.tokenId);
|
let turn = combat.turns.find(t => t.token?.id == combat.current.tokenId);
|
||||||
if (turn?.actor) {
|
if (turn?.actor) {
|
||||||
RdDCombat.displayActorCombatStatus(combat, turn.actor);
|
RdDCombat.displayActorCombatStatus(combat, turn.actor, turn.token.id);
|
||||||
// TODO Playaudio for player??
|
// TODO Playaudio for player??
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -521,8 +514,12 @@ export class RdDCombat {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static _callJetDeVie(event) {
|
static _callJetDeVie(event) {
|
||||||
let actorId = event.currentTarget.attributes['data-actorId'].value;
|
let actorId = event.currentTarget.attributes['data-actorId'].value;
|
||||||
let actor = game.actors.get(actorId);
|
let tokenId = event.currentTarget.attributes['data-tokenId'].value;
|
||||||
actor.jetVie();
|
let token = canvas.tokens.placeables.find(t => t.id == tokenId)
|
||||||
|
const actor = token?.actor ?? game.actors.get(actorId);
|
||||||
|
if (actor?.isOwner) {
|
||||||
|
actor.jetVie();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -548,7 +545,7 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
html.on("click", '#chat-jet-vie', event => {
|
html.on("click", 'a.chat-jet-vie', event => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
RdDCombat._callJetDeVie(event);
|
RdDCombat._callJetDeVie(event);
|
||||||
});
|
});
|
||||||
@@ -756,29 +753,14 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async attaque(competence, arme) {
|
async attaque(competence, arme) {
|
||||||
// const nonIncarnee = this.defender.isEntite([ENTITE_NONINCARNE])
|
|
||||||
// const blurette = this.defender.isEntite([ENTITE_BLURETTE])
|
|
||||||
// if (nonIncarnee || blurette) {
|
|
||||||
// ChatMessage.create( {
|
|
||||||
// content: `<strong>La cible est ${nonIncarnee ? 'non incarnée' : 'une blurette'}.
|
|
||||||
// Il est impossible de l'atteindre.`,
|
|
||||||
// whisper: ChatMessage.getWhisperRecipients("GM")})
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (!await this.attacker.accorder(this.defender, 'avant-attaque')) {
|
if (!await this.attacker.accorder(this.defender, 'avant-attaque')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (arme.system.cac == 'empoignade' && this.attacker.isCombatTouche()) {
|
if (arme.system.cac == 'empoignade') {
|
||||||
ChatMessage.create({
|
RdDEmpoignade.onAttaqueEmpoignade(this.attacker, this.defender)
|
||||||
alias: this.attacker.name,
|
|
||||||
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name),
|
|
||||||
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-actor-perte-empoignade.html', {
|
|
||||||
attacker: this.attacker,
|
|
||||||
competence: competence
|
|
||||||
})
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
RdDEmpoignade.checkEmpoignadeEnCours(this.attacker)
|
||||||
|
|
||||||
let rollData = this._prepareAttaque(competence, arme);
|
let rollData = this._prepareAttaque(competence, arme);
|
||||||
console.log("RdDCombat.attaque >>>", rollData);
|
console.log("RdDCombat.attaque >>>", rollData);
|
||||||
@@ -811,7 +793,6 @@ export class RdDCombat {
|
|||||||
let rollData = {
|
let rollData = {
|
||||||
passeArme: randomID(16),
|
passeArme: randomID(16),
|
||||||
mortalite: arme?.system.mortalite,
|
mortalite: arme?.system.mortalite,
|
||||||
coupsNonMortels: false,
|
|
||||||
competence: competence,
|
competence: competence,
|
||||||
surprise: this.attacker.getSurprise(true),
|
surprise: this.attacker.getSurprise(true),
|
||||||
surpriseDefenseur: this.defender.getSurprise(true),
|
surpriseDefenseur: this.defender.getSurprise(true),
|
||||||
@@ -843,8 +824,8 @@ export class RdDCombat {
|
|||||||
// finesse seulement en mélée, pour l'empoignade, ou si la difficulté libre est de -1 minimum
|
// finesse seulement en mélée, pour l'empoignade, ou si la difficulté libre est de -1 minimum
|
||||||
// rapidité seulement en mêlée, si l'arme le permet, et si la difficulté libre est de -1 minimum
|
// rapidité seulement en mêlée, si l'arme le permet, et si la difficulté libre est de -1 minimum
|
||||||
const isForce = !rollData.arme.system.empoignade;
|
const isForce = !rollData.arme.system.empoignade;
|
||||||
const isFinesse = rollData.arme.system.empoignade || isMeleeDiffNegative;
|
const isFinesse = rollData.tactique != 'charge' && (rollData.arme.system.empoignade || isMeleeDiffNegative);
|
||||||
const isRapide = !rollData.arme.system.empoignade && isMeleeDiffNegative && rollData.arme.system.rapide;
|
const isRapide = rollData.tactique != 'charge' && !rollData.arme.system.empoignade && isMeleeDiffNegative && rollData.arme.system.rapide;
|
||||||
// si un seul choix possible, le prendre
|
// si un seul choix possible, le prendre
|
||||||
if (isForce && !isFinesse && !isRapide) {
|
if (isForce && !isFinesse && !isRapide) {
|
||||||
return await this.choixParticuliere(rollData, "force");
|
return await this.choixParticuliere(rollData, "force");
|
||||||
@@ -908,8 +889,8 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// # utilisation esquive
|
// # utilisation esquive
|
||||||
const corpsACorps = this.defender.getCompetence("Corps à corps", { onMessage: it => console.info(it, this.defender) });
|
const corpsACorps = this.defender.getCompetenceCorpsACorps({ onMessage: it => console.info(it, this.defender) });
|
||||||
const esquives = duplicate(this.defender.getCompetences("esquive", { onMessage: it => console.info(it, this.defender) }))
|
const esquives = duplicate(this.defender.getCompetencesEsquive())
|
||||||
esquives.forEach(e => e.system.nbUsage = e?._id ? this.defender.getItemUse(e._id) : 0);
|
esquives.forEach(e => e.system.nbUsage = e?._id ? this.defender.getItemUse(e._id) : 0);
|
||||||
|
|
||||||
const paramChatDefense = {
|
const paramChatDefense = {
|
||||||
@@ -970,9 +951,8 @@ export class RdDCombat {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_filterArmesParade(defender, competence) {
|
_filterArmesParade(defender, competence) {
|
||||||
let items = defender.items.filter(it => RdDItemArme.isArmeUtilisable(it) || RdDItemCompetenceCreature.isCompetenceParade(it))
|
let items = defender.items.filter(it => RdDItemArme.isArmeUtilisable(it) || RdDItemCompetenceCreature.isCompetenceParade(it))
|
||||||
for (let item of items) {
|
items.forEach(item => item.system.nbUsage = defender.getItemUse(item.id)); // Ajout du # d'utilisation ce round
|
||||||
item.system.nbUsage = defender.getItemUse(item.id); // Ajout du # d'utilisation ce round
|
|
||||||
}
|
|
||||||
switch (competence.system.categorie) {
|
switch (competence.system.categorie) {
|
||||||
case 'tir':
|
case 'tir':
|
||||||
case 'lancer':
|
case 'lancer':
|
||||||
@@ -1071,7 +1051,7 @@ export class RdDCombat {
|
|||||||
competence: this.defender.getCompetence(competenceParade),
|
competence: this.defender.getCompetence(competenceParade),
|
||||||
arme: armeParade,
|
arme: armeParade,
|
||||||
surprise: this.defender.getSurprise(true),
|
surprise: this.defender.getSurprise(true),
|
||||||
needParadeSignificative: ReglesOptionelles.isUsing('categorieParade') && RdDItemArme.needParadeSignificative(attackerRoll.arme, armeParade),
|
needParadeSignificative: ReglesOptionnelles.isUsing('categorieParade') && RdDItemArme.needParadeSignificative(attackerRoll.arme, armeParade),
|
||||||
needResist: RdDItemArme.needArmeResist(attackerRoll.arme, armeParade),
|
needResist: RdDItemArme.needArmeResist(attackerRoll.arme, armeParade),
|
||||||
carac: this.defender.system.carac,
|
carac: this.defender.system.carac,
|
||||||
show: {}
|
show: {}
|
||||||
@@ -1189,7 +1169,7 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async computeDeteriorationArme(defenderRoll) {
|
async computeDeteriorationArme(defenderRoll) {
|
||||||
if (!ReglesOptionelles.isUsing('resistanceArmeParade')) {
|
if (!ReglesOptionnelles.isUsing('resistanceArmeParade')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const attackerRoll = defenderRoll.attackerRoll;
|
const attackerRoll = defenderRoll.attackerRoll;
|
||||||
@@ -1238,7 +1218,7 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132)
|
// Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132)
|
||||||
if (ReglesOptionelles.isUsing('defenseurDesarme') && resistance > 0 && RdDItemArme.getCategorieParade(defenderRoll.arme) != 'boucliers') {
|
if (ReglesOptionnelles.isUsing('defenseurDesarme') && resistance > 0 && RdDItemArme.getCategorieParade(defenderRoll.arme) != 'boucliers') {
|
||||||
let desarme = await RdDResolutionTable.rollData({
|
let desarme = await RdDResolutionTable.rollData({
|
||||||
caracValue: this.defender.getForce(),
|
caracValue: this.defender.getForce(),
|
||||||
finalLevel: Misc.toInt(defenderRoll.competence.system.niveau) - dmg,
|
finalLevel: Misc.toInt(defenderRoll.competence.system.niveau) - dmg,
|
||||||
@@ -1253,7 +1233,7 @@ export class RdDCombat {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async computeRecul(defenderRoll) { // Calcul du recul (p. 132)
|
async computeRecul(defenderRoll) { // Calcul du recul (p. 132)
|
||||||
const attackerRoll = defenderRoll.attackerRoll;
|
const attackerRoll = defenderRoll.attackerRoll;
|
||||||
if (ReglesOptionelles.isUsing('recul') && this._isForceOuCharge(attackerRoll)) {
|
if (ReglesOptionnelles.isUsing('recul') && this._isForceOuCharge(attackerRoll)) {
|
||||||
const impact = this._computeImpactRecul(attackerRoll);
|
const impact = this._computeImpactRecul(attackerRoll);
|
||||||
const rollRecul = await RdDResolutionTable.rollData({ caracValue: 10, finalLevel: impact });
|
const rollRecul = await RdDResolutionTable.rollData({ caracValue: 10, finalLevel: impact });
|
||||||
if (rollRecul.rolled.isSuccess) {
|
if (rollRecul.rolled.isSuccess) {
|
||||||
@@ -1318,7 +1298,7 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async displayActorCombatStatus(combat, actor) {
|
static async displayActorCombatStatus(combat, actor, tokenId) {
|
||||||
let formData = {
|
let formData = {
|
||||||
combatId: combat._id,
|
combatId: combat._id,
|
||||||
alias: actor.name,
|
alias: actor.name,
|
||||||
@@ -1327,17 +1307,18 @@ export class RdDCombat {
|
|||||||
blessuresStatus: actor.computeResumeBlessure(),
|
blessuresStatus: actor.computeResumeBlessure(),
|
||||||
SConst: actor.getSConst(),
|
SConst: actor.getSConst(),
|
||||||
actorId: actor.id,
|
actorId: actor.id,
|
||||||
isGrave: false,
|
tokenId: tokenId,
|
||||||
isCritique: false
|
isGrave: actor.countBlessures(it => it.isGrave()) > 0,
|
||||||
|
isCritique: actor.countBlessures(it => it.isCritique()) > 0
|
||||||
}
|
}
|
||||||
if (actor.countBlessuresNonSoigneeByName("critiques") > 0) { // Pour éviter le cumul grave + critique
|
await ChatMessage.create({
|
||||||
formData.isCritique = true;
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-acteur.hbs`, formData),
|
||||||
} else if (actor.countBlessuresNonSoigneeByName("graves") > 0) {
|
alias: actor.name
|
||||||
formData.isGrave = true;
|
});
|
||||||
}
|
await ChatMessage.create({
|
||||||
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-sante.hbs`, formData),
|
||||||
ChatUtility.createChatWithRollMode(actor.name, {
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name),
|
||||||
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-summary.html`, formData)
|
alias: actor.name
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
import { DialogChronologie } from "./dialog-chronologie.js";
|
import { DialogChronologie } from "./dialog-chronologie.js";
|
||||||
import { DialogCreateSigneDraconique } from "./dialog-create-signedraconique.js";
|
import { DialogCreateSigneDraconique } from "./dialog-create-signedraconique.js";
|
||||||
import { DialogStress } from "./dialog-stress.js";
|
import { DialogChateauDormant } from "./sommeil/dialog-chateau-dormant.js";
|
||||||
|
import { DialogStress } from "./sommeil/dialog-stress.js";
|
||||||
import { RdDItemCompetence } from "./item-competence.js";
|
import { RdDItemCompetence } from "./item-competence.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { RdDCarac } from "./rdd-carac.js";
|
import { RdDCarac } from "./rdd-carac.js";
|
||||||
@@ -13,7 +14,6 @@ import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
|||||||
import { RdDRollResolutionTable } from "./rdd-roll-resolution-table.js";
|
import { RdDRollResolutionTable } from "./rdd-roll-resolution-table.js";
|
||||||
import { RdDRollTables } from "./rdd-rolltables.js";
|
import { RdDRollTables } from "./rdd-rolltables.js";
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
import { CompendiumTableHelpers } from "./settings/system-compendiums.js";
|
|
||||||
import { FenetreRechercheTirage } from "./tirage/fenetre-recherche-tirage.js";
|
import { FenetreRechercheTirage } from "./tirage/fenetre-recherche-tirage.js";
|
||||||
import { TMRUtility } from "./tmr-utility.js";
|
import { TMRUtility } from "./tmr-utility.js";
|
||||||
|
|
||||||
@@ -77,6 +77,7 @@ export class RdDCommands {
|
|||||||
this.registerCommand({ path: ["/tirer", "rencontre"], func: (content, msg, params) => this.getRencontreTMR(params), descr: `Détermine une rencontre dans les TMR (synonyme de "/tmrr")` });
|
this.registerCommand({ path: ["/tirer", "rencontre"], func: (content, msg, params) => this.getRencontreTMR(params), descr: `Détermine une rencontre dans les TMR (synonyme de "/tmrr")` });
|
||||||
this.registerCommand({ path: ["/tirage"], func: (content, msg, params) => this.tirage(), descr: "Ouvre la fenêtre de recherche et tirage" });
|
this.registerCommand({ path: ["/tirage"], func: (content, msg, params) => this.tirage(), descr: "Ouvre la fenêtre de recherche et tirage" });
|
||||||
|
|
||||||
|
this.registerCommand({ path: ["/sommeil"], func: (content, msg, params) => this.sommeil(msg, params), descr: "Prépare le passage de journée pour chateau dormant" });
|
||||||
this.registerCommand({ path: ["/meteo"], func: (content, msg, params) => this.getMeteo(msg, params), descr: "Propose une météo marine" });
|
this.registerCommand({ path: ["/meteo"], func: (content, msg, params) => this.getMeteo(msg, params), descr: "Propose une météo marine" });
|
||||||
this.registerCommand({ path: ["/nom"], func: (content, msg, params) => RdDNameGen.getName(msg, params), descr: "Génère un nom aléatoire" });
|
this.registerCommand({ path: ["/nom"], func: (content, msg, params) => RdDNameGen.getName(msg, params), descr: "Génère un nom aléatoire" });
|
||||||
|
|
||||||
@@ -331,7 +332,7 @@ export class RdDCommands {
|
|||||||
let competence = length > 1 ? actors[0].getCompetence(Misc.join(params.slice(1, length), ' ')) : { name: undefined };
|
let competence = length > 1 ? actors[0].getCompetence(Misc.join(params.slice(1, length), ' ')) : { name: undefined };
|
||||||
if (competence) {
|
if (competence) {
|
||||||
for (let actor of actors) {
|
for (let actor of actors) {
|
||||||
await actor.rollCaracCompetence(caracName, competence.name, diff);
|
await actor.doRollCaracCompetence(caracName, competence.name, diff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -462,13 +463,14 @@ export class RdDCommands {
|
|||||||
let name = params[params.length - 1];
|
let name = params[params.length - 1];
|
||||||
if (name == undefined) {
|
if (name == undefined) {
|
||||||
for (let actor of game.actors) {
|
for (let actor of game.actors) {
|
||||||
actor.distribuerStress('stress', stress, motif);
|
// TODO: ne plus stresser les entités de cauchemar!
|
||||||
|
await actor.distribuerStress('stress', stress, motif);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//console.log(stressValue, nomJoueur);
|
//console.log(stressValue, nomJoueur);
|
||||||
let actor = Misc.findActor(name, game.actors.filter(it => it.hasPlayerOwner)) ?? Misc.findPlayer(name)?.character
|
let actor = Misc.findActor(name, game.actors.filter(it => it.hasPlayerOwner)) ?? Misc.findPlayer(name)?.character
|
||||||
if (actor) {
|
if (actor) {
|
||||||
actor.distribuerStress('stress', stress, motif);
|
await actor.distribuerStress('stress', stress, motif);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ui.notifications.warn(`Pas de personnage ou de joueur correspondant à ${name}!`);
|
ui.notifications.warn(`Pas de personnage ou de joueur correspondant à ${name}!`);
|
||||||
@@ -485,5 +487,8 @@ export class RdDCommands {
|
|||||||
async tirage() {
|
async tirage() {
|
||||||
FenetreRechercheTirage.create();
|
FenetreRechercheTirage.create();
|
||||||
}
|
}
|
||||||
|
async sommeil() {
|
||||||
|
DialogChateauDormant.create();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
|
|
||||||
export class RdDConfirm {
|
export class RdDConfirm {
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static confirmer(options, autresActions) {
|
static confirmer(options, autresActions) {
|
||||||
options.bypass = options.bypass || !(options.settingConfirmer == undefined || ReglesOptionelles.isUsing(options.settingConfirmer));
|
options.bypass = options.bypass || !(options.settingConfirmer == undefined || ReglesOptionnelles.isUsing(options.settingConfirmer));
|
||||||
if (options.bypass) {
|
if (options.bypass) {
|
||||||
options.onAction();
|
options.onAction();
|
||||||
}
|
}
|
||||||
@@ -47,7 +47,7 @@ export class RdDConfirm {
|
|||||||
icon: '<i class="fas fa-user-check"></i>',
|
icon: '<i class="fas fa-user-check"></i>',
|
||||||
label: options.buttonLabel + "<br>et ne plus demander",
|
label: options.buttonLabel + "<br>et ne plus demander",
|
||||||
callback: () => {
|
callback: () => {
|
||||||
ReglesOptionelles.set(options.settingConfirmer, false);
|
ReglesOptionnelles.set(options.settingConfirmer, false);
|
||||||
options.onAction();
|
options.onAction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
436
module/rdd-empoignade.js
Normal file
436
module/rdd-empoignade.js
Normal file
@@ -0,0 +1,436 @@
|
|||||||
|
/* -------------------------------------------- */
|
||||||
|
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
||||||
|
import { RdDRoll } from "./rdd-roll.js";
|
||||||
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
|
import { ChatUtility } from "./chat-utility.js";
|
||||||
|
import { STATUSES } from "./settings/status-effects.js";
|
||||||
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
|
import { TYPES } from "./item.js";
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
export class RdDEmpoignade {
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static init() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static registerChatCallbacks(html) {
|
||||||
|
html.on("click", '.defense-empoignade-cac', event => {
|
||||||
|
const chatMessage = ChatUtility.getChatMessage(event);
|
||||||
|
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
|
||||||
|
let defenseMode = event.currentTarget.attributes['data-defense-mode'].value
|
||||||
|
RdDEmpoignade.onDefenseEmpoignade(rollData, defenseMode, "Corps à corps", "melee")
|
||||||
|
});
|
||||||
|
html.on("click", '.defense-empoignade-esquive', event => {
|
||||||
|
const chatMessage = ChatUtility.getChatMessage(event);
|
||||||
|
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
|
||||||
|
let defenseMode = event.currentTarget.attributes['data-defense-mode'].value
|
||||||
|
RdDEmpoignade.onDefenseEmpoignade(rollData, defenseMode, "Esquive", "derobee")
|
||||||
|
});
|
||||||
|
html.on("click", '.empoignade-poursuivre', event => {
|
||||||
|
let attackerId = event.currentTarget.attributes['data-attackerId'].value
|
||||||
|
let defenderId = event.currentTarget.attributes['data-defenderId'].value
|
||||||
|
RdDEmpoignade.onAttaqueEmpoignadeValidee(game.actors.get(attackerId), game.actors.get(defenderId))
|
||||||
|
});
|
||||||
|
html.on("click", '.empoignade-entrainer-sol', event => {
|
||||||
|
const chatMessage = ChatUtility.getChatMessage(event);
|
||||||
|
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
|
||||||
|
RdDEmpoignade.entrainerAuSol(rollData)
|
||||||
|
ChatUtility.removeChatMessageId(chatMessage.id)
|
||||||
|
});
|
||||||
|
html.on("click", '.empoignade-projeter-sol', event => {
|
||||||
|
const chatMessage = ChatUtility.getChatMessage(event);
|
||||||
|
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
|
||||||
|
RdDEmpoignade.projeterAuSol(rollData)
|
||||||
|
ChatUtility.removeChatMessageId(chatMessage.id)
|
||||||
|
});
|
||||||
|
html.on("change", '.empoignade-perte-endurance', event => {
|
||||||
|
const chatMessage = ChatUtility.getChatMessage(event);
|
||||||
|
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
|
||||||
|
if (event.currentTarget.value && event.currentTarget.value != "none") {
|
||||||
|
RdDEmpoignade.perteEndurance(rollData, event.currentTarget.value)
|
||||||
|
ChatUtility.removeChatMessageId(chatMessage.id)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static checkEmpoignadeEnCours(actor) {
|
||||||
|
// TODO: autoriser la perception? la comédie/séduction?
|
||||||
|
if (RdDEmpoignade.isEmpoignadeEnCours(actor)) {
|
||||||
|
ui.notifications.warn("Une empoignade est en cours ! Normalement, vous ne pouvez rien faire d'autre que continuer l'empoignade ou la rompre.")
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static $storeRollEmpoignade(msg, rollData) {
|
||||||
|
RdDEmpoignade.$reduceActorToIds(rollData);
|
||||||
|
ChatUtility.setMessageData(msg, "empoignade-roll-data", rollData);
|
||||||
|
}
|
||||||
|
|
||||||
|
static $reduceActorToIds(rollData) {
|
||||||
|
rollData.attacker = { id: rollData.attacker.id };
|
||||||
|
rollData.defender = { id: rollData.defender.id };
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static $readRollEmpoignade(msg) {
|
||||||
|
const rollData = ChatUtility.getMessageData(msg, 'empoignade-roll-data');
|
||||||
|
RdDEmpoignade.$replaceIdsWithActors(rollData);
|
||||||
|
return rollData
|
||||||
|
}
|
||||||
|
|
||||||
|
static $replaceIdsWithActors(rollData) {
|
||||||
|
rollData.attacker = game.actors.get(rollData.attacker.id);
|
||||||
|
rollData.defender = game.actors.get(rollData.defender.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static isEmpoignadeEnCours(actor) {
|
||||||
|
return actor.itemTypes[TYPES.empoignade].find(it => it.system.pointsemp > 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getEmpoignadeById(actor, id) {
|
||||||
|
let emp = actor.itemTypes[TYPES.empoignade].find(it => it.system.empoignadeid == id)
|
||||||
|
return emp && duplicate(emp) || undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getEmpoignade(attacker, defender) {
|
||||||
|
let emp = attacker.itemTypes[TYPES.empoignade].find(it =>
|
||||||
|
(it.system.empoigneurid == attacker.id && it.system.empoigneid == defender.id) ||
|
||||||
|
(it.system.empoigneurid == defender.id && it.system.empoigneid == attacker.id)
|
||||||
|
)
|
||||||
|
if (emp) {
|
||||||
|
return duplicate(emp);
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getMalusTaille(emp, attacker, defender) {
|
||||||
|
// Si pas empoigné, alors 0
|
||||||
|
if (emp.system.pointsemp == 0) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
// p135: Malus de -1 par point de taille de différence de taille au delà de 1 (donc -2 pour une différence de 3, ...)
|
||||||
|
const diffTaille = attacker.system.carac.taille.value - defender.system.carac.taille.value;
|
||||||
|
const diffTailleAbs = Math.abs(diffTaille)
|
||||||
|
const signDiff = diffTaille > 0 ? 1 : -1
|
||||||
|
|
||||||
|
if (diffTailleAbs > 2) {
|
||||||
|
return signDiff * (diffTailleAbs - 1)
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
static isActionAutorisee(mode, attacker, defender) {
|
||||||
|
const acting = RdDEmpoignade.isActionDefenseur(mode) ? defender : attacker;
|
||||||
|
if (acting.getUserLevel(game.user) < CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) {
|
||||||
|
ui.notifications.warn(`Vous n'êtes pas autorisé à choisir l'action de ${acting.name}`)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
static isActionDefenseur(mode) {
|
||||||
|
switch (mode) {
|
||||||
|
case "liberer":
|
||||||
|
case "contrer-empoigner":
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async onAttaqueEmpoignade(attacker, defender) {
|
||||||
|
if (!RdDEmpoignade.isActionAutorisee("empoigner", attacker, defender)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender)
|
||||||
|
const isNouvelle = empoignade == undefined;
|
||||||
|
empoignade = empoignade ?? (await RdDEmpoignade.createEmpoignade(attacker, defender))
|
||||||
|
//console.log("W.", empoignade, defender.hasArmeeMeleeEquipee())
|
||||||
|
if ((isNouvelle || empoignade.system.pointsemp == 0) && defender.hasArmeeMeleeEquipee()) {
|
||||||
|
ChatUtility.createChatWithRollMode(attacker.name, {
|
||||||
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-valider.html`, { attacker: attacker, defender: defender })
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
await this.onAttaqueEmpoignadeValidee(attacker, defender)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async onAttaqueEmpoignadeValidee(attacker, defender) {
|
||||||
|
let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender)
|
||||||
|
const isNouvelle = empoignade == undefined;
|
||||||
|
empoignade = empoignade ?? (await RdDEmpoignade.createEmpoignade(attacker, defender))
|
||||||
|
|
||||||
|
let mode = (empoignade && empoignade.system.empoigneurid == attacker.id) ? "empoigner" : "liberer"
|
||||||
|
|
||||||
|
if (!RdDEmpoignade.isActionAutorisee(mode, attacker, defender)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let rollData = {
|
||||||
|
mode, empoignade, attacker, defender,
|
||||||
|
isEmpoignade: true,
|
||||||
|
competence: attacker.getCompetenceCorpsACorps(),
|
||||||
|
selectedCarac: attacker.system.carac.melee,
|
||||||
|
malusTaille: RdDEmpoignade.getMalusTaille(empoignade, attacker, defender)
|
||||||
|
}
|
||||||
|
if (attacker.isCreatureEntite()) {
|
||||||
|
RdDItemCompetenceCreature.setRollDataCreature(rollData)
|
||||||
|
}
|
||||||
|
if (empoignade.system.pointsemp >= 2) {
|
||||||
|
if (!empoignade.system.ausol) {
|
||||||
|
let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-entrainer.html');
|
||||||
|
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await RdDEmpoignade.$rollAttaqueEmpoignade(attacker, rollData, isNouvelle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async onAttaqueEmpoignadeFromItem(empoignade) {
|
||||||
|
let attacker = game.actors.get(empoignade.system.empoigneurid)
|
||||||
|
let defender = game.actors.get(empoignade.system.empoigneid)
|
||||||
|
await this.onAttaqueEmpoignadeValidee(attacker, defender)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async onImmobilisation(attacker, defender, empoignade) {
|
||||||
|
const rollData = {
|
||||||
|
mode: "immobilise",
|
||||||
|
empoignade, attacker, defender,
|
||||||
|
isEmpoignade: true,
|
||||||
|
competence: attacker.getCompetenceCorpsACorps()
|
||||||
|
}
|
||||||
|
const msg = await ChatMessage.create({
|
||||||
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(attacker.name),
|
||||||
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-immobilise.html`, rollData)
|
||||||
|
})
|
||||||
|
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async $rollAttaqueEmpoignade(attacker, rollData, isNouvelle = false) {
|
||||||
|
const dialog = await RdDRoll.create(attacker, rollData,
|
||||||
|
{ html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html' },
|
||||||
|
{
|
||||||
|
name: 'jet-empoignade',
|
||||||
|
label: 'Empoigner',
|
||||||
|
callbacks: [{ action: async (r) => await RdDEmpoignade.$onRollEmpoignade(r, isNouvelle) },]
|
||||||
|
});
|
||||||
|
dialog.render(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async $onRollEmpoignade(rollData, isNouvelle = false) {
|
||||||
|
let attacker = game.actors.get(rollData.attacker.id)
|
||||||
|
let defender = game.actors.get(rollData.defender.id)
|
||||||
|
|
||||||
|
|
||||||
|
if (rollData.rolled.isSuccess && isNouvelle) {
|
||||||
|
const objectEmpoignade = rollData.empoignade.toObject();
|
||||||
|
// Creer l'empoignade sur attaquant/defenseur
|
||||||
|
attacker.creerObjetParMJ(objectEmpoignade);
|
||||||
|
defender.creerObjetParMJ(objectEmpoignade);
|
||||||
|
}
|
||||||
|
|
||||||
|
rollData.empoignade.isSuccess = rollData.rolled.isSuccess;
|
||||||
|
if (rollData.rolled.isPart) {
|
||||||
|
rollData.particuliere = "finesse";
|
||||||
|
}
|
||||||
|
let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-resultat.html');
|
||||||
|
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async onDefenseEmpoignade(attackerRoll, mode, competenceName = "Corps à corps", carac = "melee") {
|
||||||
|
let attacker = game.actors.get(attackerRoll.attacker.id)
|
||||||
|
let defender = game.actors.get(attackerRoll.defender.id)
|
||||||
|
if (!RdDEmpoignade.isActionAutorisee(mode, attacker, defender)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let empoignade = this.getEmpoignade(attacker, defender)
|
||||||
|
|
||||||
|
if (!empoignade) {
|
||||||
|
ui.notifications.warn("Une erreur s'est produite : Aucune empoignade trouvée !!")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
empoignade = duplicate(empoignade)
|
||||||
|
let defenderRoll = {
|
||||||
|
mode, attacker, defender, empoignade, attackerRoll,
|
||||||
|
diffLibre: attackerRoll.diffLibre,
|
||||||
|
attaqueParticuliere: attackerRoll.particuliere,
|
||||||
|
competence: defender.getCompetence(competenceName),
|
||||||
|
surprise: defender.getSurprise(true),
|
||||||
|
carac: defender.system.carac,
|
||||||
|
selectedCarac: defender.system.carac[carac],
|
||||||
|
malusTaille: RdDEmpoignade.getMalusTaille(empoignade, defender, attacker),
|
||||||
|
show: {}
|
||||||
|
};
|
||||||
|
await RdDEmpoignade.$rollDefenseEmpoignade(defender, defenderRoll);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async $rollDefenseEmpoignade(defender, defenderRoll) {
|
||||||
|
const dialog = await RdDRoll.create(defender, defenderRoll,
|
||||||
|
{ html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-empoignade.html' },
|
||||||
|
{
|
||||||
|
name: 'empoignade',
|
||||||
|
label: 'Contrer',
|
||||||
|
callbacks: [
|
||||||
|
{ action: async (r) => await RdDEmpoignade.$onRollContrerLiberer(r) }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
);
|
||||||
|
dialog.render(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async $onRollContrerLiberer(rollData) {
|
||||||
|
let empoignade = rollData.empoignade
|
||||||
|
|
||||||
|
if (rollData.mode == "contrer-empoigner" && !rollData.rolled.isSuccess) {
|
||||||
|
empoignade.system.pointsemp++
|
||||||
|
RdDEmpoignade.$updateEtatEmpoignade(empoignade)
|
||||||
|
}
|
||||||
|
if (rollData.mode == "contrer-liberer" && !rollData.rolled.isSuccess) {
|
||||||
|
empoignade.system.pointsemp--
|
||||||
|
RdDEmpoignade.$updateEtatEmpoignade(empoignade)
|
||||||
|
}
|
||||||
|
|
||||||
|
await RdDResolutionTable.displayRollData(rollData, rollData.defender, 'chat-empoignade-resultat.html')
|
||||||
|
if (empoignade.system.pointsemp >= 2) {
|
||||||
|
let msg = await RdDResolutionTable.displayRollData(rollData, rollData.attacker, 'chat-empoignade-entrainer.html');
|
||||||
|
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async $updateEtatEmpoignade(empoignade) {
|
||||||
|
console.log("UPDATE Empoignade", empoignade)
|
||||||
|
|
||||||
|
let defender = game.actors.get(empoignade.system.empoigneid)
|
||||||
|
let emp = RdDEmpoignade.getEmpoignadeById(defender, empoignade.system.empoignadeid)
|
||||||
|
let update = { _id: emp._id, "system.pointsemp": empoignade.system.pointsemp, "system.ausol": empoignade.system.ausol }
|
||||||
|
await defender.updateEmbeddedDocuments('Item', [update])
|
||||||
|
|
||||||
|
let attacker = game.actors.get(empoignade.system.empoigneurid)
|
||||||
|
emp = RdDEmpoignade.getEmpoignadeById(attacker, empoignade.system.empoignadeid)
|
||||||
|
update = { _id: emp._id, "system.pointsemp": empoignade.system.pointsemp, "system.ausol": empoignade.system.ausol }
|
||||||
|
await attacker.updateEmbeddedDocuments('Item', [update])
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async $deleteEmpoignade(empoignade) {
|
||||||
|
console.log("DELETE Empoignade", empoignade)
|
||||||
|
|
||||||
|
let defender = game.actors.get(empoignade.system.empoigneid)
|
||||||
|
let emp = RdDEmpoignade.getEmpoignadeById(defender, empoignade.system.empoignadeid)
|
||||||
|
await defender.deleteEmbeddedDocuments('Item', [emp._id])
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async entrainerAuSol(rollData) {
|
||||||
|
let attacker = game.actors.get(rollData.attacker.id)
|
||||||
|
let defender = game.actors.get(rollData.defender.id)
|
||||||
|
if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let empoignade = this.getEmpoignade(attacker, defender)
|
||||||
|
|
||||||
|
empoignade.system.ausol = true
|
||||||
|
await this.$updateEtatEmpoignade(empoignade)
|
||||||
|
|
||||||
|
await attacker.setEffect(STATUSES.StatusProne, true);
|
||||||
|
await defender.setEffect(STATUSES.StatusProne, true);
|
||||||
|
|
||||||
|
let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-entrainer-sol.html');
|
||||||
|
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async projeterAuSol(rollData) {
|
||||||
|
let attacker = game.actors.get(rollData.attacker.id)
|
||||||
|
let defender = game.actors.get(rollData.defender.id)
|
||||||
|
if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let empoignade = this.getEmpoignade(attacker, defender)
|
||||||
|
|
||||||
|
await defender.setEffect(STATUSES.StatusProne, true);
|
||||||
|
await this.$deleteEmpoignade(empoignade)
|
||||||
|
|
||||||
|
let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-projeter-sol.html');
|
||||||
|
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async perteEndurance(rollData, perteMode) {
|
||||||
|
let attacker = game.actors.get(rollData.attacker.id)
|
||||||
|
let defender = game.actors.get(rollData.defender.id)
|
||||||
|
if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let empoignade = this.getEmpoignade(attacker, defender)
|
||||||
|
|
||||||
|
//console.log("Perte d'endurance :!!!", perteMode)
|
||||||
|
let endValue = defender.system.sante.endurance.value
|
||||||
|
if (perteMode == "end0") {
|
||||||
|
await defender.santeIncDec("endurance", -endValue);
|
||||||
|
}
|
||||||
|
if (perteMode == "end1") {
|
||||||
|
await defender.santeIncDec("endurance", -(endValue - 1));
|
||||||
|
}
|
||||||
|
if (perteMode == "endmoitie") {
|
||||||
|
await defender.santeIncDec("endurance", -Math.floor(endValue / 2));
|
||||||
|
}
|
||||||
|
if (perteMode == "endquart") {
|
||||||
|
await defender.santeIncDec("endurance", -(3 * Math.floor(endValue / 4)));
|
||||||
|
}
|
||||||
|
let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-perte-endurance.html');
|
||||||
|
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async deleteAllEmpoignades() {
|
||||||
|
for (let actor of game.actors) {
|
||||||
|
let empIds = actor.itemTypes["empoignade"].map(it => it.id)
|
||||||
|
await actor.deleteEmbeddedDocuments('Item', empIds)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async deleteLinkedEmpoignade(actorId, empoignade) {
|
||||||
|
let actorDeleteId = (actorId == empoignade.system.empoigneurid) ? empoignade.system.empoigneid : empoignade.system.empoigneurid
|
||||||
|
let actor = game.actors.get(actorDeleteId)
|
||||||
|
let emp = this.getEmpoignadeById(actor, empoignade.system.empoignadeid)
|
||||||
|
if (emp) {
|
||||||
|
await actor.deleteEmbeddedDocuments('Item', [emp._id])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async createEmpoignade(attacker, defender) {
|
||||||
|
return await Item.create({
|
||||||
|
name: "Empoignade en cours de " + attacker.name + ' sur ' + defender.name,
|
||||||
|
type: 'empoignade',
|
||||||
|
img: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
|
||||||
|
system: { description: "", empoignadeid: randomID(16), compteempoigne: 0, empoigneurid: attacker.id, empoigneid: defender.id, ptsemp: 0, empoigneurname: attacker.name, empoignename: defender.name }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
temporary: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
import { SystemCompendiums } from "./settings/system-compendiums.js";
|
||||||
import { RdDTimestamp } from "./rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDHerbes extends Item {
|
export class RdDHerbes extends Item {
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
|
import { RdDItemArme } from "./item-arme.js";
|
||||||
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
|
import { TYPES } from "./item.js";
|
||||||
|
|
||||||
export class RdDHotbar {
|
export class RdDHotbar {
|
||||||
|
|
||||||
static async addToHotbar(item, slot) {
|
static async createItemMacro(item, slot, armeCompetence = undefined) {
|
||||||
let command = `game.system.rdd.RdDHotbar.rollMacro("${item.name}", "${item.type}");`;
|
const itemName = item.name;
|
||||||
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command));
|
let macroName = itemName + RdDHotbar.$macroNameSuffix(armeCompetence);
|
||||||
|
let command = `game.system.rdd.RdDHotbar.rollMacro("${itemName}", "${item.type}", "${armeCompetence}");`
|
||||||
|
let macro = game.macros.contents.find(m => (m.name === itemName) && (m.command === command));
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
macro = await Macro.create({
|
macro = await Macro.create({
|
||||||
name: item.name,
|
name: macroName,
|
||||||
type: "script",
|
type: "script",
|
||||||
img: item.img,
|
img: item.img,
|
||||||
command: command
|
command: command
|
||||||
@@ -15,6 +20,59 @@ export class RdDHotbar {
|
|||||||
await game.user.assignHotbarMacro(macro, slot);
|
await game.user.assignHotbarMacro(macro, slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static $macroNameSuffix(armeCompetence) {
|
||||||
|
switch (armeCompetence) {
|
||||||
|
case 'unemain': return ' (1 main)';
|
||||||
|
case 'deuxmains': return ' (2 main)';
|
||||||
|
case 'tir': return ' (tir)';
|
||||||
|
case 'lancer': return ' (lancer)';
|
||||||
|
case 'pugilat': return ' (pugilat)';
|
||||||
|
case 'empoignade': return ' (empoignade)';
|
||||||
|
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
static async addToHotbar(item, slot) {
|
||||||
|
switch (item?.type ?? '') {
|
||||||
|
case TYPES.arme:
|
||||||
|
{
|
||||||
|
// Les armes peuvent avoir plusieurs usages
|
||||||
|
if (item.system.competence != '') {
|
||||||
|
if (item.system.unemain) {
|
||||||
|
await this.createItemMacro(item, slot++, 'unemain')
|
||||||
|
}
|
||||||
|
if (item.system.deuxmains) {
|
||||||
|
await this.createItemMacro(item, slot++, 'deuxmains')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (item.system.lancer != '') {
|
||||||
|
await this.createItemMacro(item, slot++, 'lancer')
|
||||||
|
}
|
||||||
|
if (item.system.tir != '') {
|
||||||
|
await this.createItemMacro(item, slot++, 'lancer')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
case TYPES.competencecreature:
|
||||||
|
const categorie = RdDItemCompetenceCreature.getCategorieAttaque(item) ?? 'competence';
|
||||||
|
await this.createItemMacro(item, slot, categorie)
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
case TYPES.competence:
|
||||||
|
await this.createItemMacro(item, slot++, 'competence')
|
||||||
|
if (item.isCorpsACorps()) {
|
||||||
|
await this.createItemMacro(item, slot++, 'pugilat')
|
||||||
|
await this.createItemMacro(item, slot++, 'empoignade')
|
||||||
|
}
|
||||||
|
if (item.isCompetenceArme()) {
|
||||||
|
ui.notifications.info(`${item.name} est une compétence d'arme, la macro n'est pas liée à un arme.<br>
|
||||||
|
Créez la macro depuis l'arme ou l'onglet combat pour garder les automatisations de combat.`);
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a macro when dropping an entity on the hotbar
|
* Create a macro when dropping an entity on the hotbar
|
||||||
* Item - open roll dialog for item
|
* Item - open roll dialog for item
|
||||||
@@ -23,20 +81,19 @@ export class RdDHotbar {
|
|||||||
*/
|
*/
|
||||||
static initDropbar() {
|
static initDropbar() {
|
||||||
|
|
||||||
Hooks.on("hotbarDrop", (bar, documentData, slot) => {
|
Hooks.on('hotbarDrop', (bar, documentData, slot) => {
|
||||||
|
|
||||||
// Create item macro if rollable item - weapon, spell, prayer, trait, or skill
|
// Create item macro if rollable item - weapon, spell, prayer, trait, or skill
|
||||||
if (documentData.type == "Item") {
|
if (documentData.type == 'Item') {
|
||||||
let item = fromUuidSync(documentData.uuid)
|
const item = fromUuidSync(documentData.uuid) ?? this.actor.items.get(documentData.uuid)
|
||||||
if (item == undefined) {
|
console.log('DROP', documentData, item)
|
||||||
item = this.actor.items.get(documentData.uuid)
|
switch (item?.type) {
|
||||||
|
case TYPES.arme:
|
||||||
|
case TYPES.competence:
|
||||||
|
case TYPES.competencecreature:
|
||||||
|
this.addToHotbar(item, slot)
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
console.log("DROP", documentData, item)
|
|
||||||
if (!item || (item.type != "arme" && item.type != "competence")) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
this.addToHotbar(item, slot)
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@@ -44,12 +101,14 @@ export class RdDHotbar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Roll macro */
|
/** Roll macro */
|
||||||
static rollMacro(itemName, itemType, bypassData) {
|
static rollMacro(itemName, itemType, categorieArme = 'competence') {
|
||||||
const speaker = ChatMessage.getSpeaker();
|
const speaker = ChatMessage.getSpeaker();
|
||||||
let actor;
|
let actor;
|
||||||
if (speaker.token) actor = game.actors.tokens[speaker.token];
|
if (speaker.token) actor = game.actors.tokens[speaker.token];
|
||||||
if (!actor) actor = game.actors.get(speaker.actor);
|
if (!actor) actor = game.actors.get(speaker.actor);
|
||||||
|
if (!actor) {
|
||||||
|
return ui.notifications.warn(`Impossible de trouver le personnage concerné`);
|
||||||
|
}
|
||||||
let item = actor?.items.find(it => it.name === itemName && it.type == itemType) ?? undefined;
|
let item = actor?.items.find(it => it.name === itemName && it.type == itemType) ?? undefined;
|
||||||
if (!item) {
|
if (!item) {
|
||||||
return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`);
|
return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`);
|
||||||
@@ -57,10 +116,23 @@ export class RdDHotbar {
|
|||||||
|
|
||||||
// Trigger the item roll
|
// Trigger the item roll
|
||||||
switch (item.type) {
|
switch (item.type) {
|
||||||
case "arme":
|
case TYPES.arme:
|
||||||
return actor.rollArme(item);
|
return actor.rollArme(item, categorieArme);
|
||||||
case "competence":
|
case TYPES.competence:
|
||||||
return actor.rollCompetence(itemName);
|
if (item.isCorpsACorps()) {
|
||||||
|
switch (categorieArme) {
|
||||||
|
case 'pugilat':
|
||||||
|
return actor.rollArme(RdDItemArme.mainsNues(actor), 'competence');
|
||||||
|
case 'empoignade':
|
||||||
|
return actor.rollArme(RdDItemArme.empoignade(actor), 'competence');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return actor.rollCompetence(item);
|
||||||
|
case TYPES.competencecreature:
|
||||||
|
return item.system.iscombat && !item.system.isparade
|
||||||
|
? actor.rollArme(item, categorieArme)
|
||||||
|
: actor.rollCompetence(item);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import { Migrations } from './migrations.js';
|
|||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
import { TMRUtility } from "./tmr-utility.js";
|
import { TMRUtility } from "./tmr-utility.js";
|
||||||
import { TMRRencontres } from "./tmr-rencontres.js";
|
import { TMRRencontres } from "./tmr-rencontres.js";
|
||||||
import { RdDCalendrier } from "./rdd-calendrier.js";
|
import { RdDCalendrier } from "./time/rdd-calendrier.js";
|
||||||
import { RdDTimestamp } from "./rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
import { DialogChronologie } from "./dialog-chronologie.js";
|
import { DialogChronologie } from "./dialog-chronologie.js";
|
||||||
|
|
||||||
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
||||||
@@ -15,7 +15,7 @@ import { RdDCombatManager, RdDCombat } from "./rdd-combat.js";
|
|||||||
import { ChatUtility } from "./chat-utility.js";
|
import { ChatUtility } from "./chat-utility.js";
|
||||||
import { StatusEffects } from "./settings/status-effects.js";
|
import { StatusEffects } from "./settings/status-effects.js";
|
||||||
import { RdDCompendiumOrganiser } from "./rdd-compendium-organiser.js";
|
import { RdDCompendiumOrganiser } from "./rdd-compendium-organiser.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
import { RdDHotbar } from "./rdd-hotbar-drop.js"
|
import { RdDHotbar } from "./rdd-hotbar-drop.js"
|
||||||
import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
|
import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
|
||||||
import { RdDHerbes } from "./rdd-herbes.js";
|
import { RdDHerbes } from "./rdd-herbes.js";
|
||||||
@@ -29,13 +29,16 @@ import { Environnement } from "./environnement.js";
|
|||||||
import { RdDActor } from "./actor.js";
|
import { RdDActor } from "./actor.js";
|
||||||
import { RdDBaseActor } from "./actor/base-actor.js";
|
import { RdDBaseActor } from "./actor/base-actor.js";
|
||||||
import { RdDCommerce } from "./actor/commerce.js";
|
import { RdDCommerce } from "./actor/commerce.js";
|
||||||
|
import { RdDEntite } from "./actor/entite.js";
|
||||||
|
import { RdDVehicule } from "./actor/vehicule.js";
|
||||||
import { RdDActorSheet } from "./actor-sheet.js";
|
import { RdDActorSheet } from "./actor-sheet.js";
|
||||||
import { RdDCommerceSheet } from "./actor/commerce-sheet.js";
|
import { RdDCommerceSheet } from "./actor/commerce-sheet.js";
|
||||||
import { RdDActorCreatureSheet } from "./actor-creature-sheet.js";
|
import { RdDCreatureSheet } from "./actor/creature-sheet.js";
|
||||||
import { RdDActorVehiculeSheet } from "./actor-vehicule-sheet.js";
|
import { RdDActorEntiteSheet } from "./actor/entite-sheet.js";
|
||||||
import { RdDActorEntiteSheet } from "./actor-entite-sheet.js";
|
import { RdDActorVehiculeSheet } from "./actor/vehicule-sheet.js";
|
||||||
|
|
||||||
import { RdDItem } from "./item.js";
|
import { RdDItem } from "./item.js";
|
||||||
|
import { RdDItemBlessure } from "./item/blessure.js";
|
||||||
import { RdDItemService } from "./item/service.js";
|
import { RdDItemService } from "./item/service.js";
|
||||||
import { RdDItemMaladie } from "./item/maladie.js";
|
import { RdDItemMaladie } from "./item/maladie.js";
|
||||||
import { RdDItemPoison } from "./item/poison.js";
|
import { RdDItemPoison } from "./item/poison.js";
|
||||||
@@ -46,6 +49,7 @@ import { RdDItemSouffle } from "./item/souffle.js";
|
|||||||
import { RdDRencontre } from "./item/rencontre.js";
|
import { RdDRencontre } from "./item/rencontre.js";
|
||||||
|
|
||||||
import { RdDItemSheet } from "./item-sheet.js";
|
import { RdDItemSheet } from "./item-sheet.js";
|
||||||
|
import { RdDBlessureItemSheet } from "./item/sheet-blessure.js";
|
||||||
import { RdDServiceItemSheet } from "./item/sheet-service.js";
|
import { RdDServiceItemSheet } from "./item/sheet-service.js";
|
||||||
import { RdDRencontreItemSheet } from "./item/sheet-rencontre.js";
|
import { RdDRencontreItemSheet } from "./item/sheet-rencontre.js";
|
||||||
import { RdDHerbeItemSheet } from "./item/sheet-herbe.js";
|
import { RdDHerbeItemSheet } from "./item/sheet-herbe.js";
|
||||||
@@ -55,6 +59,10 @@ import { RdDFauneItemSheet } from "./item/sheet-faune.js";
|
|||||||
import { RdDConteneurItemSheet } from "./item/sheet-conteneur.js";
|
import { RdDConteneurItemSheet } from "./item/sheet-conteneur.js";
|
||||||
import { RdDSigneDraconiqueItemSheet } from "./item/sheet-signedraconique.js";
|
import { RdDSigneDraconiqueItemSheet } from "./item/sheet-signedraconique.js";
|
||||||
import { RdDItemInventaireSheet } from "./item/sheet-base-inventaire.js";
|
import { RdDItemInventaireSheet } from "./item/sheet-base-inventaire.js";
|
||||||
|
import { AppAstrologie } from "./sommeil/app-astrologie.js";
|
||||||
|
import { RdDItemArmure } from "./item/armure.js";
|
||||||
|
import { AutoAdjustDarkness as AutoAdjustDarkness } from "./time/auto-adjust-darkness.js";
|
||||||
|
import { RdDCreature } from "./actor/creature.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RdD system
|
* RdD system
|
||||||
@@ -73,21 +81,23 @@ export class SystemReveDeDragon {
|
|||||||
this.RdDUtility = RdDUtility;
|
this.RdDUtility = RdDUtility;
|
||||||
this.RdDHotbar = RdDHotbar;
|
this.RdDHotbar = RdDHotbar;
|
||||||
this.itemClasses = {
|
this.itemClasses = {
|
||||||
service: RdDItemService,
|
armure: RdDItemArmure,
|
||||||
|
blessure: RdDItemBlessure,
|
||||||
maladie: RdDItemMaladie,
|
maladie: RdDItemMaladie,
|
||||||
|
ombre: RdDItemOmbre,
|
||||||
poison: RdDItemPoison,
|
poison: RdDItemPoison,
|
||||||
queue: RdDItemQueue,
|
queue: RdDItemQueue,
|
||||||
ombre: RdDItemOmbre,
|
rencontre: RdDRencontre,
|
||||||
souffle: RdDItemSouffle,
|
service: RdDItemService,
|
||||||
signedraconique: RdDItemSigneDraconique,
|
signedraconique: RdDItemSigneDraconique,
|
||||||
rencontre: RdDRencontre
|
souffle: RdDItemSouffle,
|
||||||
}
|
}
|
||||||
this.actorClasses = {
|
this.actorClasses = {
|
||||||
creature: RdDActor,
|
|
||||||
entite: RdDActor,
|
|
||||||
personnage: RdDActor,
|
|
||||||
vehicule: RdDActor,
|
|
||||||
commerce: RdDCommerce,
|
commerce: RdDCommerce,
|
||||||
|
creature: RdDCreature,
|
||||||
|
entite: RdDEntite,
|
||||||
|
personnage: RdDActor,
|
||||||
|
vehicule: RdDVehicule,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,6 +106,8 @@ export class SystemReveDeDragon {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async onInit() {
|
async onInit() {
|
||||||
game.system.rdd = this;
|
game.system.rdd = this;
|
||||||
|
this.AppAstrologie = AppAstrologie;
|
||||||
|
|
||||||
|
|
||||||
console.log(`Initializing Reve de Dragon System`);
|
console.log(`Initializing Reve de Dragon System`);
|
||||||
|
|
||||||
@@ -141,7 +153,7 @@ export class SystemReveDeDragon {
|
|||||||
Actors.unregisterSheet("core", ActorSheet);
|
Actors.unregisterSheet("core", ActorSheet);
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDCommerceSheet, { types: ["commerce"], makeDefault: true });
|
Actors.registerSheet(SYSTEM_RDD, RdDCommerceSheet, { types: ["commerce"], makeDefault: true });
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorSheet, { types: ["personnage"], makeDefault: true });
|
Actors.registerSheet(SYSTEM_RDD, RdDActorSheet, { types: ["personnage"], makeDefault: true });
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorCreatureSheet, { types: ["creature"], makeDefault: true });
|
Actors.registerSheet(SYSTEM_RDD, RdDCreatureSheet, { types: ["creature"], makeDefault: true });
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true });
|
Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true });
|
||||||
Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true });
|
Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true });
|
||||||
Items.unregisterSheet("core", ItemSheet);
|
Items.unregisterSheet("core", ItemSheet);
|
||||||
@@ -154,6 +166,7 @@ export class SystemReveDeDragon {
|
|||||||
RdDItemSheet.register(RdDPlanteItemSheet);
|
RdDItemSheet.register(RdDPlanteItemSheet);
|
||||||
RdDItemSheet.register(RdDIngredientItemSheet);
|
RdDItemSheet.register(RdDIngredientItemSheet);
|
||||||
RdDItemSheet.register(RdDServiceItemSheet);
|
RdDItemSheet.register(RdDServiceItemSheet);
|
||||||
|
RdDItemSheet.register(RdDBlessureItemSheet);
|
||||||
|
|
||||||
Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, {
|
Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, {
|
||||||
types: [
|
types: [
|
||||||
@@ -167,20 +180,21 @@ export class SystemReveDeDragon {
|
|||||||
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
|
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
|
||||||
"meditation", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve",
|
"meditation", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve",
|
||||||
"nombreastral", "tache", "maladie", "poison", "possession",
|
"nombreastral", "tache", "maladie", "poison", "possession",
|
||||||
"tarot", "extraitpoetique"
|
"tarot", "extraitpoetique", "empoignade"
|
||||||
], makeDefault: true
|
], makeDefault: true
|
||||||
});
|
});
|
||||||
CONFIG.Combat.documentClass = RdDCombatManager;
|
CONFIG.Combat.documentClass = RdDCombatManager;
|
||||||
|
|
||||||
// préparation des différents modules
|
// préparation des différents modules
|
||||||
|
AutoAdjustDarkness.init();
|
||||||
RdDTimestamp.init();
|
RdDTimestamp.init();
|
||||||
|
RdDCalendrier.init();
|
||||||
SystemCompendiums.init();
|
SystemCompendiums.init();
|
||||||
DialogChronologie.init();
|
DialogChronologie.init();
|
||||||
ReglesOptionelles.init();
|
ReglesOptionnelles.init();
|
||||||
RdDUtility.init();
|
RdDUtility.init();
|
||||||
RdDDice.init();
|
RdDDice.init();
|
||||||
RdDCommands.init();
|
RdDCommands.init();
|
||||||
RdDCombat.init();
|
|
||||||
RdDCombatManager.init();
|
RdDCombatManager.init();
|
||||||
RdDTokenHud.init();
|
RdDTokenHud.init();
|
||||||
RdDBaseActor.init();
|
RdDBaseActor.init();
|
||||||
@@ -210,25 +224,6 @@ export class SystemReveDeDragon {
|
|||||||
default: "avant-encaissement"
|
default: "avant-encaissement"
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
game.settings.register(SYSTEM_RDD, "liste-nombre-astral", {
|
|
||||||
name: "liste-nombre-astral",
|
|
||||||
scope: "world",
|
|
||||||
config: false,
|
|
||||||
default: [],
|
|
||||||
type: Object
|
|
||||||
});
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
game.settings.register(SYSTEM_RDD, "calendrier-pos", {
|
|
||||||
name: "calendrierPos",
|
|
||||||
scope: "client",
|
|
||||||
config: false,
|
|
||||||
default: RdDCalendrier.createCalendrierPos(),
|
|
||||||
type: Object
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
game.settings.register(SYSTEM_RDD, "supprimer-dialogues-combat-chat", {
|
game.settings.register(SYSTEM_RDD, "supprimer-dialogues-combat-chat", {
|
||||||
name: "Supprimer les dialogues de combat",
|
name: "Supprimer les dialogues de combat",
|
||||||
@@ -274,9 +269,11 @@ export class SystemReveDeDragon {
|
|||||||
let sidebar = document.getElementById("sidebar");
|
let sidebar = document.getElementById("sidebar");
|
||||||
sidebar.style.width = "min-content";
|
sidebar.style.width = "min-content";
|
||||||
}
|
}
|
||||||
|
game.system.rdd.calendrier = new RdDCalendrier();
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
new Migrations().migrate();
|
new Migrations().migrate();
|
||||||
|
this.messageDeBienvenue();
|
||||||
|
this.registerUsageCount(SYSTEM_RDD);
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusEffects.onReady();
|
StatusEffects.onReady();
|
||||||
@@ -284,14 +281,7 @@ export class SystemReveDeDragon {
|
|||||||
RdDDice.onReady();
|
RdDDice.onReady();
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Affiche/Init le calendrier */
|
/* Affiche/Init le calendrier */
|
||||||
let calendrier = new RdDCalendrier();
|
game.system.rdd.calendrier.display();
|
||||||
let templatePath = "systems/foundryvtt-reve-de-dragon/templates/calendar-template.html";
|
|
||||||
let templateData = {};
|
|
||||||
renderTemplate(templatePath, templateData).then(html => {
|
|
||||||
calendrier.render(true);
|
|
||||||
});
|
|
||||||
game.system.rdd.calendrier = calendrier; // Reference;
|
|
||||||
|
|
||||||
// Avertissement si joueur sans personnage
|
// Avertissement si joueur sans personnage
|
||||||
if (!game.user.isGM && game.user.character == undefined) {
|
if (!game.user.isGM && game.user.character == undefined) {
|
||||||
ui.notifications.info("Attention ! Vous n'êtes connecté à aucun personnage !");
|
ui.notifications.info("Attention ! Vous n'êtes connecté à aucun personnage !");
|
||||||
@@ -300,10 +290,6 @@ export class SystemReveDeDragon {
|
|||||||
user: game.user.id
|
user: game.user.id
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (Misc.isUniqueConnectedGM()) {
|
|
||||||
this.messageDeBienvenue();
|
|
||||||
this.registerUsageCount(SYSTEM_RDD);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
import { RdDCombat } from "./rdd-combat.js";
|
|
||||||
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
||||||
import { RdDRoll } from "./rdd-roll.js";
|
import { RdDRoll } from "./rdd-roll.js";
|
||||||
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
import { Targets } from "./targets.js";
|
import { Targets } from "./targets.js";
|
||||||
|
import { TYPES } from "./item.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* On part du principe qu'une entité démarre tjs
|
/* On part du principe qu'une entité démarre tjs
|
||||||
@@ -20,9 +20,9 @@ export class RdDPossession {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static searchPossessionFromEntite(attacker, defender) {
|
static searchPossessionFromEntite(attacker, defender) {
|
||||||
let poss = attacker.items.find(poss => poss.type == 'possession' && poss.system.possedeid == defender.id);
|
let poss = attacker.items.find(poss => poss.type == TYPES.possession && poss.system.victime.actorid == defender.id);
|
||||||
if (!poss) {
|
if (!poss) {
|
||||||
poss = defender.items.find(poss => poss.type == 'possession' && poss.system.possedeid == defender.id);
|
poss = defender.items.find(poss => poss.type == TYPES.possession && poss.system.victime.actorid == defender.id);
|
||||||
}
|
}
|
||||||
return poss && duplicate(poss) || undefined;
|
return poss && duplicate(poss) || undefined;
|
||||||
}
|
}
|
||||||
@@ -31,13 +31,13 @@ export class RdDPossession {
|
|||||||
static async onAttaquePossession(target, attacker, competence, suitePossession = undefined) {
|
static async onAttaquePossession(target, attacker, competence, suitePossession = undefined) {
|
||||||
const defender = target.actor;
|
const defender = target.actor;
|
||||||
const fromEntite = RdDPossession.searchPossessionFromEntite(attacker, defender);
|
const fromEntite = RdDPossession.searchPossessionFromEntite(attacker, defender);
|
||||||
const isNouvelle = !suitePossession && ! fromEntite;
|
const isNouvelle = !suitePossession && !fromEntite;
|
||||||
const possession = (suitePossession ?? fromEntite ?? (await RdDPossession.createPossession(attacker, defender)));
|
const possession = (suitePossession ?? fromEntite ?? (await RdDPossession.createPossession(attacker, defender)));
|
||||||
|
|
||||||
RdDPossession.$updateEtatPossession(possession)
|
RdDPossession.$updateEtatPossession(possession)
|
||||||
|
|
||||||
let rollData = {
|
let rollData = {
|
||||||
mode: "possession",
|
mode: "attaque",
|
||||||
isECNIDefender: false,
|
isECNIDefender: false,
|
||||||
competence: competence,
|
competence: competence,
|
||||||
possession: possession,
|
possession: possession,
|
||||||
@@ -45,25 +45,26 @@ export class RdDPossession {
|
|||||||
defender: defender,
|
defender: defender,
|
||||||
targetToken: Targets.extractTokenData(target)
|
targetToken: Targets.extractTokenData(target)
|
||||||
};
|
};
|
||||||
if (attacker.isCreatureEntite()) {
|
RdDPossession.selectCompetenceDraconicOuPossession(rollData, attacker)
|
||||||
RdDItemCompetenceCreature.setRollDataCreature(rollData)
|
|
||||||
}
|
|
||||||
|
|
||||||
await RdDPossession.$rollAttaquePossession(attacker, rollData, isNouvelle);
|
await RdDPossession.$rollAttaquePossession(attacker, rollData, isNouvelle);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async onConjurerPossession(attacker, competence, possession) {
|
static async onConjurerPossession(attacker, possession) {
|
||||||
possession = duplicate(possession);
|
possession = duplicate(possession);
|
||||||
RdDPossession.$updateEtatPossession(possession)
|
RdDPossession.$updateEtatPossession(possession)
|
||||||
|
|
||||||
|
const defender = game.actors.get(possession.system.entite.actorid);
|
||||||
let rollData = {
|
let rollData = {
|
||||||
mode: "possession",
|
mode: "attaque",
|
||||||
isECNIDefender: true,
|
isECNIDefender: true,
|
||||||
competence: competence,
|
|
||||||
possession: possession,
|
possession: possession,
|
||||||
attacker: attacker,
|
attacker: attacker,
|
||||||
defender: game.actors.get(possession.system.possesseurid)
|
defender: defender,
|
||||||
};
|
};
|
||||||
|
RdDPossession.selectCompetenceDraconicOuPossession(rollData, attacker)
|
||||||
|
|
||||||
await RdDPossession.$rollAttaquePossession(attacker, rollData);
|
await RdDPossession.$rollAttaquePossession(attacker, rollData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,7 +72,7 @@ export class RdDPossession {
|
|||||||
static async onDefensePossession(attackerId, defenderId, possessionId) {
|
static async onDefensePossession(attackerId, defenderId, possessionId) {
|
||||||
let attacker = game.actors.get(attackerId)
|
let attacker = game.actors.get(attackerId)
|
||||||
let possession = attacker?.getPossession(possessionId)
|
let possession = attacker?.getPossession(possessionId)
|
||||||
defenderId = defenderId ?? possession?.system.possesseurid ?? undefined
|
defenderId = defenderId ?? possession?.system.entite.actorid ?? undefined
|
||||||
let defender = game.actors.get(defenderId)
|
let defender = game.actors.get(defenderId)
|
||||||
possession = possession ?? defender?.getPossession(possessionId) ?? undefined;
|
possession = possession ?? defender?.getPossession(possessionId) ?? undefined;
|
||||||
|
|
||||||
@@ -82,19 +83,29 @@ export class RdDPossession {
|
|||||||
possession = duplicate(possession)
|
possession = duplicate(possession)
|
||||||
// Update for draconic roll
|
// Update for draconic roll
|
||||||
let rollData = {
|
let rollData = {
|
||||||
mode: "conjuration",
|
mode: "defense",
|
||||||
isECNIDefender: defender.type == "entite",
|
isECNIDefender: defender.type == "entite",
|
||||||
possession: possession,
|
possession: possession,
|
||||||
attacker: attacker,
|
attacker: attacker,
|
||||||
defender: defender,
|
defender: defender,
|
||||||
competence: defender.getDraconicOuPossession(),
|
|
||||||
selectedCarac: defender.system.carac.reve,
|
|
||||||
forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: defender.getReveActuel() } }
|
|
||||||
}
|
}
|
||||||
rollData.competence.system.defaut_carac = 'reve-actuel'
|
RdDPossession.selectCompetenceDraconicOuPossession(rollData, defender)
|
||||||
|
rollData.diffLibre = RdDPossession.getInfoAttaque(rollData).diffLibre
|
||||||
|
|
||||||
await RdDPossession.$rollDefensePossession(defender, rollData);
|
await RdDPossession.$rollDefensePossession(defender, rollData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static selectCompetenceDraconicOuPossession(rollData, rollingActor) {
|
||||||
|
rollData.competence = rollingActor.getDraconicOuPossession();
|
||||||
|
if (rollingActor.isCreatureEntite()) {
|
||||||
|
RdDItemCompetenceCreature.setRollDataCreature(rollData)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rollData.selectedCarac = rollingActor.system.carac.reve
|
||||||
|
rollData.forceCarac = { 'reve-actuel': { label: "Rêve Actuel", value: rollingActor.getReveActuel() } }
|
||||||
|
rollData.competence.system.defaut_carac = 'reve-actuel'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async $rollAttaquePossession(attacker, rollData, isNouvelle = false) {
|
static async $rollAttaquePossession(attacker, rollData, isNouvelle = false) {
|
||||||
@@ -104,21 +115,22 @@ export class RdDPossession {
|
|||||||
name: 'jet-possession',
|
name: 'jet-possession',
|
||||||
label: rollData.isECNIDefender ? 'Conjurer la possession' : 'Possession',
|
label: rollData.isECNIDefender ? 'Conjurer la possession' : 'Possession',
|
||||||
callbacks: [
|
callbacks: [
|
||||||
{ condition: r => (r.rolled.isSuccess), action: async (r) => await RdDPossession.$onRollPossession(r, true, isNouvelle) },
|
{ action: async (r) => await RdDPossession.$onRollPossession(r, isNouvelle) },
|
||||||
{ condition: r => (r.rolled.isEchec), action: async (r) => await RdDPossession.$onRollPossession(r, false, isNouvelle) },
|
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
dialog.render(true);
|
dialog.render(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async $onRollPossession(rollData, isSuccess, isNouvelle = false) {
|
static async $onRollPossession(rollData, isNouvelle = false) {
|
||||||
rollData.possession.isSuccess = isSuccess;
|
rollData.possession.isSuccess = rollData.rolled.isSuccess;
|
||||||
RdDPossession.$updateEtatPossession(rollData.possession);
|
RdDPossession.$updateEtatPossession(rollData.possession, rollData);
|
||||||
if (isNouvelle) {
|
if (isNouvelle) {
|
||||||
// Creer la possession sur le defenseur
|
// Creer la possession sur le defenseur
|
||||||
rollData.defender.createEmbeddedDocuments('Item', [rollData.possession.toObject()])
|
await rollData.defender.createEmbeddedDocuments('Item', [rollData.possession.toObject()])
|
||||||
}
|
}
|
||||||
|
const possession = (rollData.isECNIDefender ? rollData.attacker : rollData.defender).getPossession(rollData.possession.system.possessionid)
|
||||||
|
RdDPossession.storePossessionAttaque(possession, rollData)
|
||||||
await RdDResolutionTable.displayRollData(rollData, rollData.attacker, 'chat-resultat-possession.html');
|
await RdDResolutionTable.displayRollData(rollData, rollData.attacker, 'chat-resultat-possession.html');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,35 +139,42 @@ export class RdDPossession {
|
|||||||
const dialog = await RdDRoll.create(defender, rollData,
|
const dialog = await RdDRoll.create(defender, rollData,
|
||||||
{ html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-possession.html' },
|
{ html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-possession.html' },
|
||||||
{
|
{
|
||||||
name: 'conjurer',
|
name: 'possession',
|
||||||
label: 'Conjurer une Possession',
|
label: 'Conjurer une Possession',
|
||||||
callbacks: [
|
callbacks: [
|
||||||
{ action: async (r) => await RdDPossession.$onRollConjuration(r) }
|
{ action: async (r) => await RdDPossession.$onRollConjuration(r) }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
dialog.render(true);
|
dialog.render(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async $onRollConjuration(rollData) {
|
static async $onRollConjuration(rollData) {
|
||||||
let actor = game.actors.get(rollData.possession.system.possedeid)
|
let victime = game.actors.get(rollData.possession.system.victime.actorid)
|
||||||
|
let compteur = rollData.possession.system.compteur
|
||||||
if (!rollData.rolled.isSuccess) {
|
if (!rollData.rolled.isSuccess) {
|
||||||
if (rollData.isECNIDefender) {
|
if (rollData.isECNIDefender) {
|
||||||
rollData.possession.system.compteur--
|
compteur--
|
||||||
} else {
|
} else {
|
||||||
rollData.possession.system.compteur++
|
compteur++
|
||||||
}
|
}
|
||||||
let update = { _id: rollData.possession._id, "system.compteur": rollData.possession.system.compteur }
|
|
||||||
await actor.updateEmbeddedDocuments('Item', [update])
|
|
||||||
}
|
}
|
||||||
|
const possession = victime.getPossession(rollData.possession.system.possessionid)
|
||||||
|
await possession.update({
|
||||||
|
system: {
|
||||||
|
compteur: compteur,
|
||||||
|
entite: { diffLibre: 0, finesse: false },
|
||||||
|
victime: { diffLibre: 0, finesse: false }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
rollData.possession = possession
|
||||||
RdDPossession.$updateEtatPossession(rollData.possession)
|
RdDPossession.$updateEtatPossession(rollData.possession)
|
||||||
|
|
||||||
await RdDResolutionTable.displayRollData(rollData,rollData.defender, 'chat-resultat-possession.html')
|
await RdDResolutionTable.displayRollData(rollData, rollData.defender, 'chat-resultat-possession.html')
|
||||||
if (rollData.possession.isPosseder || rollData.possession.isConjurer) {
|
if (rollData.possession.isPosseder || rollData.possession.isConjurer) {
|
||||||
// conjuration
|
// conjuration
|
||||||
actor.deleteEmbeddedDocuments("Item", [rollData.possession._id])
|
victime.deleteEmbeddedDocuments("Item", [rollData.possession._id])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,13 +199,43 @@ export class RdDPossession {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static isPossessionFinesse(rollData) {
|
||||||
|
return RdDPossession.getInfoAttaque(rollData).finesse
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getInfoAttaque(rollData) {
|
||||||
|
return rollData.possession.system[rollData.isECNIDefender ? 'victime' : 'entite'];
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static isDefensePossession(rollData) {
|
||||||
|
return rollData.possession && rollData.mode == "defense"
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static storePossessionAttaque(possession, rollData = undefined) {
|
||||||
|
const attaquant = rollData?.isECNIDefender ? 'victime' : 'entite'
|
||||||
|
possession.update({
|
||||||
|
[`system.${attaquant}`]: {
|
||||||
|
diffLibre: rollData?.diffLibre ?? 0,
|
||||||
|
finesse: rollData?.rolled.isPart ?? false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async createPossession(attacker, defender) {
|
static async createPossession(attacker, defender) {
|
||||||
return await Item.create({
|
return await Item.create({
|
||||||
name: "Possession en cours de " + attacker.name, type: 'possession',
|
name: "Possession en cours de " + attacker.name, type: 'possession',
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
|
img: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
|
||||||
system: { description: "", typepossession: attacker.name, possede: false, possessionid: randomID(16), possesseurid: attacker.id, possedeid: defender.id, date: 0, compteur: 0 }
|
system: {
|
||||||
},
|
description: "", typepossession: attacker.name,
|
||||||
|
possede: false,
|
||||||
|
possessionid: randomID(16),
|
||||||
|
entite: { actorid: attacker.id },
|
||||||
|
victime: { actorid: defender.id },
|
||||||
|
compteur: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
temporary: true
|
temporary: true
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { ChatUtility } from "./chat-utility.js";
|
import { ChatUtility } from "./chat-utility.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
import { RdDDice } from "./rdd-dice.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* difficultés au delà de -10
|
* difficultés au delà de -10
|
||||||
@@ -28,7 +28,7 @@ const reussites = [
|
|||||||
|
|
||||||
const reussiteInsuffisante = { code: "notSign", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: false, isETotal: false, ptTache: 0, ptQualite: -2, quality: "Réussite insuffisante", condition: (target, roll) => false }
|
const reussiteInsuffisante = { code: "notSign", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: false, isETotal: false, ptTache: 0, ptQualite: -2, quality: "Réussite insuffisante", condition: (target, roll) => false }
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const caracMaximumResolution = 60;
|
const CARAC_MAXIMUM_RESOLUTION = 40;
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDResolutionTable {
|
export class RdDResolutionTable {
|
||||||
static resolutionTable = this.build()
|
static resolutionTable = this.build()
|
||||||
@@ -36,7 +36,7 @@ export class RdDResolutionTable {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static build() {
|
static build() {
|
||||||
let table = []
|
let table = []
|
||||||
for (var caracValue = 0; caracValue <= caracMaximumResolution; caracValue++) {
|
for (var caracValue = 0; caracValue <= CARAC_MAXIMUM_RESOLUTION; caracValue++) {
|
||||||
table[caracValue] = this._computeRow(caracValue);
|
table[caracValue] = this._computeRow(caracValue);
|
||||||
}
|
}
|
||||||
return table;
|
return table;
|
||||||
@@ -91,13 +91,17 @@ export class RdDResolutionTable {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async displayRollData(rollData, actor = undefined, template = 'chat-resultat-general.html') {
|
static async displayRollData(rollData, actor = undefined, template = 'chat-resultat-general.html') {
|
||||||
return await ChatUtility.createChatWithRollMode(actor?.userName ?? game.user.name, {
|
return await ChatUtility.createChatWithRollMode(RdDResolutionTable.actorChatName(actor), {
|
||||||
content: await RdDResolutionTable.buildRollDataHtml(rollData, actor, template)
|
content: await RdDResolutionTable.buildRollDataHtml(rollData, template)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static actorChatName(actor) {
|
||||||
|
return actor?.userName ?? game.user.name;
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async buildRollDataHtml(rollData, actor, template = 'chat-resultat-general.html') {
|
static async buildRollDataHtml(rollData, template = 'chat-resultat-general.html') {
|
||||||
rollData.show = rollData.show || {};
|
rollData.show = rollData.show || {};
|
||||||
return await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/${template}`, rollData);
|
return await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/${template}`, rollData);
|
||||||
}
|
}
|
||||||
@@ -122,7 +126,7 @@ export class RdDResolutionTable {
|
|||||||
rolled.bonus = rollData.bonus;
|
rolled.bonus = rollData.bonus;
|
||||||
rolled.factorHtml = Misc.getFractionHtml(rollData.diviseurSignificative);
|
rolled.factorHtml = Misc.getFractionHtml(rollData.diviseurSignificative);
|
||||||
|
|
||||||
if (ReglesOptionelles.isUsing("afficher-colonnes-reussite")) {
|
if (ReglesOptionnelles.isUsing("afficher-colonnes-reussite")) {
|
||||||
rolled.niveauNecessaire = this.findNiveauNecessaire(caracValue, rolled.roll);
|
rolled.niveauNecessaire = this.findNiveauNecessaire(caracValue, rolled.roll);
|
||||||
rolled.ajustementNecessaire = rolled.niveauNecessaire - finalLevel;
|
rolled.ajustementNecessaire = rolled.niveauNecessaire - finalLevel;
|
||||||
}
|
}
|
||||||
@@ -195,17 +199,6 @@ export class RdDResolutionTable {
|
|||||||
return Math.max(Math.floor(carac * (diff + 10) / 2), 1);
|
return Math.max(Math.floor(carac * (diff + 10) / 2), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static isAjustementAstrologique(rollData) {
|
|
||||||
if (rollData.selectedCarac?.label.toLowerCase().includes('chance')) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (rollData.selectedSort?.system.isrituel) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isEchec(rollData) {
|
static isEchec(rollData) {
|
||||||
switch (rollData.surprise) {
|
switch (rollData.surprise) {
|
||||||
@@ -294,12 +287,9 @@ export class RdDResolutionTable {
|
|||||||
carac: carac,
|
carac: carac,
|
||||||
difficulte: level,
|
difficulte: level,
|
||||||
min: minLevel,
|
min: minLevel,
|
||||||
rows: RdDResolutionTable.incrementalArray(minCarac, maxCarac),
|
rows: Misc.intArray(minCarac, maxCarac+1),
|
||||||
cols: RdDResolutionTable.incrementalArray(minLevel, maxLevel)
|
cols: Misc.intArray(minLevel, maxLevel+1)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
static incrementalArray(min, max) {
|
|
||||||
return Array.from(Array(max-min+1).keys()).map(i=>i+min)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -30,9 +30,9 @@ export class RdDEncaisser extends Dialog {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
else if (actor.isEntite([ENTITE_BLURETTE, ENTITE_INCARNE])) {
|
else if (actor.isEntite([ENTITE_BLURETTE, ENTITE_INCARNE])) {
|
||||||
dialogConf.default = "cauchemar"
|
dialogConf.default = "entiteincarnee"
|
||||||
dialogConf.buttons = {
|
dialogConf.buttons = {
|
||||||
"cauchemar": { label: "Cauchemar", callback: html => this.performEncaisser("cauchemar") }
|
"entiteincarnee": { label: "Entité incarnée", callback: html => this.performEncaisser("entiteincarnee") }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +70,6 @@ export class RdDEncaisser extends Dialog {
|
|||||||
total: Number(this.modifier),
|
total: Number(this.modifier),
|
||||||
ajustement: Number(this.modifier),
|
ajustement: Number(this.modifier),
|
||||||
encaisserSpecial: this.encaisserSpecial,
|
encaisserSpecial: this.encaisserSpecial,
|
||||||
loc: { result: 0, label: "" },
|
|
||||||
mortalite: mortalite
|
mortalite: mortalite
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ export class RdDRollResolutionTable extends Dialog {
|
|||||||
async updateRollResult() {
|
async updateRollResult() {
|
||||||
let rollData = this.rollData;
|
let rollData = this.rollData;
|
||||||
rollData.caracValue = parseInt(rollData.selectedCarac.value)
|
rollData.caracValue = parseInt(rollData.selectedCarac.value)
|
||||||
rollData.finalLevel = this._computeFinalLevel(rollData);
|
rollData.finalLevel = Misc.toInt(rollData.diffConditions) + Misc.toInt(rollData.diffLibre);
|
||||||
|
|
||||||
const htmlTable = await RdDResolutionTable.buildHTMLTable({
|
const htmlTable = await RdDResolutionTable.buildHTMLTable({
|
||||||
carac: rollData.caracValue,
|
carac: rollData.caracValue,
|
||||||
@@ -129,12 +129,6 @@ export class RdDRollResolutionTable extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_computeFinalLevel(rollData) {
|
|
||||||
const diffConditions = Misc.toInt(rollData.diffConditions);
|
|
||||||
const diffLibre = Misc.toInt(rollData.diffLibre);
|
|
||||||
|
|
||||||
return diffLibre + diffConditions;
|
|
||||||
}
|
|
||||||
|
|
||||||
async close() {
|
async close() {
|
||||||
await super.close();
|
await super.close();
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { Misc } from "./misc.js";
|
|||||||
import { RdDBonus } from "./rdd-bonus.js";
|
import { RdDBonus } from "./rdd-bonus.js";
|
||||||
import { RdDCarac } from "./rdd-carac.js";
|
import { RdDCarac } from "./rdd-carac.js";
|
||||||
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend the base Dialog entity to select roll parameters
|
* Extend the base Dialog entity to select roll parameters
|
||||||
@@ -22,7 +22,7 @@ export class RdDRoll extends Dialog {
|
|||||||
|
|
||||||
const html = await renderTemplate(dialogConfig.html, rollData);
|
const html = await renderTemplate(dialogConfig.html, rollData);
|
||||||
|
|
||||||
let options = { classes: ["rdd-roll-dialog"], width: 600, height: 'fit-content', 'z-index': 99999, close: html => {} };
|
let options = { classes: ["rdd-roll-dialog"], width: 650, height: 'fit-content', 'z-index': 99999, close: html => {} };
|
||||||
if (dialogConfig.close) {
|
if (dialogConfig.close) {
|
||||||
options.close = dialogConfig.close;
|
options.close = dialogConfig.close;
|
||||||
}
|
}
|
||||||
@@ -50,8 +50,6 @@ export class RdDRoll extends Dialog {
|
|||||||
encTotal: true
|
encTotal: true
|
||||||
},
|
},
|
||||||
isMalusEncombrementTotal: RdDItemCompetence.isMalusEncombrementTotal(rollData.competence),
|
isMalusEncombrementTotal: RdDItemCompetence.isMalusEncombrementTotal(rollData.competence),
|
||||||
malusArmureValue: actor.getMalusArmure(),
|
|
||||||
surencMalusValue: actor.computeMalusSurEncombrement(),
|
|
||||||
encTotal: actor.getEncTotal(),
|
encTotal: actor.getEncTotal(),
|
||||||
ajustementAstrologique: actor.ajustementAstrologique(),
|
ajustementAstrologique: actor.ajustementAstrologique(),
|
||||||
surprise: actor.getSurprise(false),
|
surprise: actor.getSurprise(false),
|
||||||
@@ -85,7 +83,7 @@ export class RdDRoll extends Dialog {
|
|||||||
if (RdDBonus.isDefenseAttaqueFinesse(rollData)) {
|
if (RdDBonus.isDefenseAttaqueFinesse(rollData)) {
|
||||||
facteurSign *= 2;
|
facteurSign *= 2;
|
||||||
}
|
}
|
||||||
if (!ReglesOptionelles.isUsing('tripleSignificative')) {
|
if (!ReglesOptionnelles.isUsing('tripleSignificative')) {
|
||||||
facteurSign = Math.min(facteurSign, 4);
|
facteurSign = Math.min(facteurSign, 4);
|
||||||
}
|
}
|
||||||
return facteurSign;
|
return facteurSign;
|
||||||
@@ -187,7 +185,7 @@ export class RdDRoll extends Dialog {
|
|||||||
console.log("RdDRollSelectDialog - Cout reve", ptreve);
|
console.log("RdDRollSelectDialog - Cout reve", ptreve);
|
||||||
this.updateRollResult(html);
|
this.updateRollResult(html);
|
||||||
});
|
});
|
||||||
this.html.find("[name='coupsNonMortels']").change((event) => {
|
this.html.find("input.check-mortalite").change((event) => {
|
||||||
this.rollData.dmg.mortalite = event.currentTarget.checked ? "non-mortel" : "mortel";
|
this.rollData.dmg.mortalite = event.currentTarget.checked ? "non-mortel" : "mortel";
|
||||||
this.updateRollResult(html);
|
this.updateRollResult(html);
|
||||||
});
|
});
|
||||||
@@ -291,36 +289,31 @@ export class RdDRoll extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async updateRollResult(html) {
|
async updateRollResult(html) {
|
||||||
let rollData = this.rollData;
|
const rollData = this.rollData;
|
||||||
|
|
||||||
rollData.dmg = rollData.attackerRoll?.dmg ?? RdDBonus.dmg(rollData, this.actor.getBonusDegat())
|
rollData.dmg = rollData.attackerRoll?.dmg ?? RdDBonus.dmg(rollData, this.actor.getBonusDegat())
|
||||||
rollData.caracValue = parseInt(rollData.selectedCarac.value)
|
rollData.caracValue = parseInt(rollData.selectedCarac.value)
|
||||||
rollData.mortalite = rollData.attackerRoll?.dmg.mortalite ?? rollData.dmg.mortalite ?? 'mortel';
|
rollData.dmg.mortalite = rollData.dmg.mortalite ?? 'mortel';
|
||||||
rollData.coupsNonMortels = (rollData.attackerRoll?.dmg.mortalite ?? rollData.dmg.mortalite) == 'non-mortel';
|
|
||||||
rollData.use.appelAuMoral = this.actor.isPersonnage() && RdDCarac.isActionPhysique(rollData.selectedCarac);
|
rollData.use.appelAuMoral = this.actor.isPersonnage() && RdDCarac.isActionPhysique(rollData.selectedCarac);
|
||||||
let dmgText = Misc.toSignedString(rollData.dmg.total);
|
|
||||||
|
|
||||||
switch (rollData.mortalite) {
|
|
||||||
case 'non-mortel': dmgText = `(${dmgText}) non-mortel`; break;
|
|
||||||
case 'empoignade': dmgText = `empoignade`; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
RollDataAjustements.calcul(rollData, this.actor);
|
RollDataAjustements.calcul(rollData, this.actor);
|
||||||
rollData.finalLevel = this._computeFinalLevel(rollData);
|
|
||||||
|
|
||||||
const resolutionTable = await RdDResolutionTable.buildHTMLTable(RdDResolutionTable.subTable(rollData.caracValue, rollData.finalLevel))
|
const resolutionTable = await RdDResolutionTable.buildHTMLTable(RdDResolutionTable.subTable(rollData.caracValue, rollData.finalLevel))
|
||||||
const adjustements = await this.buildAjustements(rollData);
|
const adjustements = await this.buildAjustements(rollData);
|
||||||
|
|
||||||
HtmlUtility.showControlWhen(this.html.find(".use-encTotal"), rollData.ajustements.encTotal.visible && RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac));
|
HtmlUtility.showControlWhen(this.html.find(".use-encTotal"), rollData.ajustements.encTotal.visible && RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac));
|
||||||
HtmlUtility.showControlWhen(this.html.find(".use-surenc"), rollData.ajustements.surenc.visible && RdDCarac.isActionPhysique(rollData.selectedCarac));
|
HtmlUtility.showControlWhen(this.html.find(".use-surenc"), rollData.ajustements.surenc.visible && RdDCarac.isActionPhysique(rollData.selectedCarac));
|
||||||
HtmlUtility.showControlWhen(this.html.find(".utilisation-moral"), rollData.use.appelAuMoral);
|
HtmlUtility.showControlWhen(this.html.find(".utilisation-moral"), rollData.use.appelAuMoral);
|
||||||
HtmlUtility.showControlWhen(this.html.find(".diffMoral"), rollData.ajustements.moralTotal.used);
|
|
||||||
HtmlUtility.showControlWhen(this.html.find(".divAppelAuMoral"), rollData.use.appelAuMoral);
|
HtmlUtility.showControlWhen(this.html.find(".divAppelAuMoral"), rollData.use.appelAuMoral);
|
||||||
|
// HtmlUtility.showControlWhen(this.html.find(".diffMoral"), rollData.ajustements.moral.used);
|
||||||
|
|
||||||
// Mise à jour valeurs
|
// Mise à jour valeurs
|
||||||
this.html.find(".dialog-roll-title").text(this._getTitle(rollData));
|
this.html.find(".dialog-roll-title").text(this._getTitle(rollData));
|
||||||
this.html.find("[name='coupsNonMortels']").prop('checked', rollData.mortalite == 'non-mortel');
|
this.html.find("input.check-mortalite").prop('checked', rollData.dmg.mortalite == 'non-mortel');
|
||||||
this.html.find(".dmg-arme-actor").text(dmgText);
|
this.html.find("label.dmg-arme-actor").text(rollData.dmg.mortalite == 'empoignade'? 'empoignade': Misc.toSignedString(rollData.dmg.total) );
|
||||||
|
this.html.find("label.arme-mortalite").text(rollData.dmg.mortalite);
|
||||||
|
// this.html.find("[name='dmg-arme-actor']").text(rollData.dmg.mortalite == 'empoignade'? 'empoignade': Misc.toSignedString(rollData.dmg.total) );
|
||||||
|
// this.html.find("[name='arme-mortalite']").text(rollData.dmg.mortalite);
|
||||||
this.html.find("div.placeholder-ajustements").empty().append(adjustements);
|
this.html.find("div.placeholder-ajustements").empty().append(adjustements);
|
||||||
this.html.find("div.placeholder-resolution").empty().append(resolutionTable)
|
this.html.find("div.placeholder-resolution").empty().append(resolutionTable)
|
||||||
}
|
}
|
||||||
@@ -331,30 +324,6 @@ export class RdDRoll extends Dialog {
|
|||||||
return await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/partial-roll-ajustements.html`, rollData);
|
return await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/partial-roll-ajustements.html`, rollData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
_computeFinalLevel(rollData) {
|
|
||||||
return RollDataAjustements.sum(rollData.ajustements);
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
_computeDiffCompetence(rollData) {
|
|
||||||
if (rollData.competence) {
|
|
||||||
return Misc.toInt(rollData.competence.system.niveau);
|
|
||||||
}
|
|
||||||
if (rollData.draconicList) {
|
|
||||||
return Misc.toInt(rollData.competence.system.niveau);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
_computeMalusArmure(rollData) {
|
|
||||||
let malusArmureValue = 0;
|
|
||||||
if (rollData.malusArmureValue && (rollData.selectedCarac.label == "Agilité" || rollData.selectedCarac.label == "Dérobée")) {
|
|
||||||
malusArmureValue = rollData.malusArmureValue;
|
|
||||||
}
|
|
||||||
return malusArmureValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_getTitle(rollData) {
|
_getTitle(rollData) {
|
||||||
const carac = rollData.selectedCarac.label;
|
const carac = rollData.selectedCarac.label;
|
||||||
@@ -362,16 +331,19 @@ export class RdDRoll extends Dialog {
|
|||||||
return carac;
|
return carac;
|
||||||
}
|
}
|
||||||
const compName = rollData.competence.name;
|
const compName = rollData.competence.name;
|
||||||
if (rollData.draconicList && rollData.selectedSort) {
|
|
||||||
return compName + " - " + rollData.selectedSort.name;
|
|
||||||
}
|
|
||||||
// If a weapon is there, add it in the title
|
|
||||||
const niveau = Misc.toSignedString(rollData.competence.system.niveau)
|
const niveau = Misc.toSignedString(rollData.competence.system.niveau)
|
||||||
if (compName == carac) {
|
if (compName == carac) {
|
||||||
// cas des créatures
|
// cas des créatures
|
||||||
return carac + " Niveau " + niveau
|
return `${carac} Niveau ${niveau}`
|
||||||
}
|
}
|
||||||
const armeTitle = (rollData.arme) ? " (" + rollData.arme.name + ") " : "";
|
if (rollData.draconicList && rollData.selectedSort) {
|
||||||
return carac + "/" + compName + armeTitle + " Niveau " + niveau
|
// cas de lancer de sort
|
||||||
|
return `${rollData.competence.name} Niveau ${niveau} ${rollData.selectedSort.name}`
|
||||||
|
}
|
||||||
|
if (rollData.arme && rollData.arme.name != compName) {
|
||||||
|
// ajouter l'arme au titre si son nom n'est pas la compétence
|
||||||
|
return `${carac} / ${compName} (${rollData.arme.name}) Niveau ${niveau}`
|
||||||
|
}
|
||||||
|
return `${carac} / ${compName} Niveau ${niveau}`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,15 +7,16 @@ export class RdDSheetUtility {
|
|||||||
const userRightLevel = game.user.isGM
|
const userRightLevel = game.user.isGM
|
||||||
? CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER
|
? CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER
|
||||||
: document.getUserLevel(game.user);
|
: document.getUserLevel(game.user);
|
||||||
mergeObject(options, {
|
let newOptions = {
|
||||||
isGM: game.user.isGM,
|
isGM: game.user.isGM,
|
||||||
isOwned: document.parent,
|
isOwned: document.parent ? true : false,
|
||||||
editable: editable,
|
editable: editable,
|
||||||
cssClass: editable ? "editable" : "locked",
|
cssClass: editable ? "editable" : "locked",
|
||||||
isLimited: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED,
|
isLimited: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED,
|
||||||
isObserver: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER,
|
isObserver: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER,
|
||||||
isOwner: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER
|
isOwner: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER
|
||||||
});
|
}
|
||||||
|
mergeObject(options, newOptions);
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { SHOW_DICE } from "./constants.js";
|
|||||||
import { RollDataAjustements } from "./rolldata-ajustements.js";
|
import { RollDataAjustements } from "./rolldata-ajustements.js";
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
import { TMRUtility } from "./tmr-utility.js";
|
import { TMRUtility } from "./tmr-utility.js";
|
||||||
import { tmrConstants } from "./tmr-constants.js";
|
|
||||||
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
||||||
import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js";
|
import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js";
|
||||||
import { ChatUtility } from "./chat-utility.js";
|
import { ChatUtility } from "./chat-utility.js";
|
||||||
@@ -12,12 +11,11 @@ import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
|
|||||||
import { PixiTMR } from "./tmr/pixi-tmr.js";
|
import { PixiTMR } from "./tmr/pixi-tmr.js";
|
||||||
import { Draconique } from "./tmr/draconique.js";
|
import { Draconique } from "./tmr/draconique.js";
|
||||||
import { HtmlUtility } from "./html-utility.js";
|
import { HtmlUtility } from "./html-utility.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
import { RdDDice } from "./rdd-dice.js";
|
||||||
import { STATUSES } from "./settings/status-effects.js";
|
import { STATUSES } from "./settings/status-effects.js";
|
||||||
import { RdDRencontre } from "./item/rencontre.js";
|
import { RdDRencontre } from "./item/rencontre.js";
|
||||||
import { RdDCalendrier } from "./rdd-calendrier.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
import { RdDTimestamp } from "./rdd-timestamp.js";
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
@@ -40,14 +38,16 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
title: "Terres Médianes de Rêve",
|
title: "Terres Médianes de Rêve",
|
||||||
content: html,
|
content: html,
|
||||||
buttons: {
|
buttons: {
|
||||||
closeButton: { label: "Fermer", callback: html => this.close(html) }
|
closeButton: {
|
||||||
|
label: "Fermer", callback: html => this.close()
|
||||||
|
}
|
||||||
},
|
},
|
||||||
default: "closeButton"
|
default: "closeButton"
|
||||||
}
|
}
|
||||||
|
|
||||||
const dialogOptions = {
|
const dialogOptions = {
|
||||||
classes: ["tmrdialog"],
|
classes: ["tmrdialog"],
|
||||||
width: 920, height: 980,
|
width: 920, maxheight: 1024, height: 'fit-content',
|
||||||
'z-index': 40
|
'z-index': 40
|
||||||
}
|
}
|
||||||
super(dialogConf, dialogOptions);
|
super(dialogConf, dialogOptions);
|
||||||
@@ -56,15 +56,15 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this.actor = actor;
|
this.actor = actor;
|
||||||
this.actor.tmrApp = this; // reference this app in the actor structure
|
this.actor.tmrApp = this; // reference this app in the actor structure
|
||||||
this.viewOnly = tmrData.mode == "visu"
|
this.viewOnly = tmrData.mode == "visu"
|
||||||
this.fatigueParCase = this.viewOnly || !ReglesOptionelles.isUsing("appliquer-fatigue") ? 0 : this.actor.getTMRFatigue();
|
this.fatigueParCase = this.viewOnly ? 0 : this.actor.getCoutFatigueTMR();
|
||||||
this.cumulFatigue = 0;
|
this.cumulFatigue = 0;
|
||||||
this.loadRencontres();
|
this.loadRencontres();
|
||||||
this.loadCasesSpeciales();
|
this.loadCasesSpeciales();
|
||||||
this.allTokens = [];
|
this.allTokens = [];
|
||||||
this.rencontreState = 'aucune';
|
this.rencontreState = 'aucune';
|
||||||
this.pixiApp = new PIXI.Application({ width: 720, height: 860 });
|
this.pixiApp = new PIXI.Application({ width: 720, height: 860 });
|
||||||
|
|
||||||
this.pixiTMR = new PixiTMR(this, this.pixiApp);
|
this.pixiTMR = new PixiTMR(this, this.pixiApp);
|
||||||
|
this.subdialog = undefined
|
||||||
|
|
||||||
this.callbacksOnAnimate = [];
|
this.callbacksOnAnimate = [];
|
||||||
if (!this.viewOnly) {
|
if (!this.viewOnly) {
|
||||||
@@ -75,6 +75,31 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
this.pixiTMR.load((loader, resources) => this.createPixiSprites());
|
this.pixiTMR.load((loader, resources) => this.createPixiSprites());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async forceTMRDisplay() {
|
||||||
|
this.bringToTop();
|
||||||
|
if (this.subdialog) {
|
||||||
|
this.subdialog.bringToTop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async restoreTMRAfterAction() {
|
||||||
|
this.subdialog = undefined
|
||||||
|
await this.maximize();
|
||||||
|
this.bringToTop();
|
||||||
|
}
|
||||||
|
|
||||||
|
forceTMRContinueAction() {
|
||||||
|
ui.notifications.warn('Vous devez finir votre action avant de continuer dans les TMR');
|
||||||
|
this.subdialog.bringToTop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setTMRPendingAction(dialog) {
|
||||||
|
this.subdialog = dialog
|
||||||
|
if (dialog instanceof Application) {
|
||||||
|
dialog.bringToTop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
isDemiReveCache() {
|
isDemiReveCache() {
|
||||||
return !game.user.isGM && this.actor.isTMRCache();
|
return !game.user.isGM && this.actor.isTMRCache();
|
||||||
}
|
}
|
||||||
@@ -176,6 +201,9 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async moveFromKey(move) {
|
async moveFromKey(move) {
|
||||||
|
if (this.subdialog) {
|
||||||
|
return this.forceTMRContinueAction();
|
||||||
|
}
|
||||||
let oddq = TMRUtility.coordTMRToOddq(this._getActorCoord());
|
let oddq = TMRUtility.coordTMRToOddq(this._getActorCoord());
|
||||||
|
|
||||||
if (move == 'top') oddq.row -= 1;
|
if (move == 'top') oddq.row -= 1;
|
||||||
@@ -200,7 +228,9 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
this.html = html;
|
this.html = html;
|
||||||
|
|
||||||
document.getElementById("tmrrow1").insertCell(0).append(this.pixiApp.view);
|
document.getElementsByClassName("tmr-row")
|
||||||
|
.item(0)
|
||||||
|
.insertCell(0).append(this.pixiApp.view);
|
||||||
|
|
||||||
if (this.viewOnly) {
|
if (this.viewOnly) {
|
||||||
this.html.find('.lancer-sort').remove();
|
this.html.find('.lancer-sort').remove();
|
||||||
@@ -208,9 +238,13 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionelles.isUsing("appliquer-fatigue"));
|
HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionnelles.isUsing("appliquer-fatigue"));
|
||||||
HtmlUtility.showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(this._getActorCoord()));
|
HtmlUtility.showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(this._getActorCoord()));
|
||||||
|
|
||||||
|
this.html.find('tr.tmr-row *').click((event) => {
|
||||||
|
this.subdialog?.bringToTop();
|
||||||
|
});
|
||||||
|
|
||||||
// Roll Sort
|
// Roll Sort
|
||||||
this.html.find('.lancer-sort').click((event) => {
|
this.html.find('.lancer-sort').click((event) => {
|
||||||
this.actor.rollUnSort(this._getActorCoord());
|
this.actor.rollUnSort(this._getActorCoord());
|
||||||
@@ -228,11 +262,8 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
// Gestion du cout de montée en points de rêve
|
// Gestion du cout de montée en points de rêve
|
||||||
let reveCout = ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse();
|
let reveCout = ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse();
|
||||||
if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
|
|
||||||
this.cumulFatigue += this.fatigueParCase;
|
|
||||||
}
|
|
||||||
await this.actor.reveActuelIncDec(reveCout);
|
await this.actor.reveActuelIncDec(reveCout);
|
||||||
|
this.cumulFatigue += this.fatigueParCase;
|
||||||
// Le reste...
|
// Le reste...
|
||||||
this.updateValuesDisplay();
|
this.updateValuesDisplay();
|
||||||
let tmr = TMRUtility.getTMR(this._getActorCoord());
|
let tmr = TMRUtility.getTMR(this._getActorCoord());
|
||||||
@@ -264,7 +295,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
let refoulement = document.getElementById("tmr-refoulement-value");
|
let refoulement = document.getElementById("tmr-refoulement-value");
|
||||||
refoulement.innerHTML = this.actor.system.reve.refoulement.value;
|
refoulement.innerHTML = this.actor.system.reve.refoulement.value;
|
||||||
|
|
||||||
if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
|
if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
|
||||||
let fatigueItem = document.getElementById("tmr-fatigue-table");
|
let fatigueItem = document.getElementById("tmr-fatigue-table");
|
||||||
fatigueItem.innerHTML = "<table class='table-fatigue'>" + RdDUtility.makeHTMLfatigueMatrix(this.actor.system.sante.fatigue.value, this.actor.system.sante.endurance.max).html() + "</table>";
|
fatigueItem.innerHTML = "<table class='table-fatigue'>" + RdDUtility.makeHTMLfatigueMatrix(this.actor.system.sante.fatigue.value, this.actor.system.sante.endurance.max).html() + "</table>";
|
||||||
}
|
}
|
||||||
@@ -272,6 +303,10 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async close() {
|
async close() {
|
||||||
|
if (this.subdialog) {
|
||||||
|
return this.forceTMRContinueAction()
|
||||||
|
}
|
||||||
|
|
||||||
this.descenteTMR = true;
|
this.descenteTMR = true;
|
||||||
if (this.actor.tmrApp) {
|
if (this.actor.tmrApp) {
|
||||||
this.actor.tmrApp = undefined; // Cleanup reference
|
this.actor.tmrApp = undefined; // Cleanup reference
|
||||||
@@ -279,14 +314,15 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
await this.actor.setEffect(STATUSES.StatusDemiReve, false)
|
await this.actor.setEffect(STATUSES.StatusDemiReve, false)
|
||||||
this._tellToGM(this.actor.name + " a quitté les terres médianes");
|
this._tellToGM(this.actor.name + " a quitté les terres médianes");
|
||||||
}
|
}
|
||||||
await this.actor.santeIncDec("fatigue", this.cumulFatigue)
|
await this.actor.santeIncDec((ReglesOptionnelles.isUsing("appliquer-fatigue") ? "fatigue" : "endurance"),
|
||||||
|
this.cumulFatigue)
|
||||||
}
|
}
|
||||||
await super.close();
|
await super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async onActionRencontre(action, tmr, rencontre) {
|
async onActionRencontre(action, tmr, rencontre) {
|
||||||
if (!this.currentRencontre){
|
if (!this.currentRencontre) {
|
||||||
ui.notifications.warn("#612 Rencontre perdue, récupération en cours. Vous pouvez contacter l'équipe avec les logs pour aider à résoudre ce problème")
|
ui.notifications.warn("#612 Rencontre perdue, récupération en cours. Vous pouvez contacter l'équipe avec les logs pour aider à résoudre ce problème")
|
||||||
console.error("#612 Rencontre perdue", action, tmr, rencontre, this);
|
console.error("#612 Rencontre perdue", action, tmr, rencontre, this);
|
||||||
this.currentRencontre = rencontre;
|
this.currentRencontre = rencontre;
|
||||||
@@ -294,6 +330,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
switch (action) {
|
switch (action) {
|
||||||
case 'derober':
|
case 'derober':
|
||||||
await this.derober();
|
await this.derober();
|
||||||
|
this.restoreTMRAfterAction();
|
||||||
return;
|
return;
|
||||||
case 'refouler':
|
case 'refouler':
|
||||||
await this.refouler();
|
await this.refouler();
|
||||||
@@ -306,6 +343,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
await this.postRencontre(tmr);
|
await this.postRencontre(tmr);
|
||||||
|
this.restoreTMRAfterAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
async derober() {
|
async derober() {
|
||||||
@@ -361,18 +399,21 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
checkQuitterTMR() {
|
checkQuitterTMR() {
|
||||||
|
|
||||||
if (this.actor.isDead()) {
|
if (this.actor.isDead()) {
|
||||||
this._tellToGM("Vous êtes mort : vous quittez les Terres médianes !");
|
this._tellToGM("Vous êtes mort : vous quittez les Terres médianes !");
|
||||||
this.close();
|
this.close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const resteAvantInconscience = this.actor.getFatigueMax() - this.actor.getFatigueActuelle() - this.cumulFatigue;
|
|
||||||
if (ReglesOptionelles.isUsing("appliquer-fatigue") && resteAvantInconscience <= 0) {
|
if (ReglesOptionnelles.isUsing("appliquer-fatigue")
|
||||||
|
? (this.actor.getFatigueRestante() <= this.cumulFatigue)
|
||||||
|
: (this.actor.getEnduranceActuelle() <= this.cumulFatigue)
|
||||||
|
) {
|
||||||
this._tellToGM("Vous vous écroulez de fatigue : vous quittez les Terres médianes !");
|
this._tellToGM("Vous vous écroulez de fatigue : vous quittez les Terres médianes !");
|
||||||
this.quitterLesTMRInconscient();
|
this.quitterLesTMRInconscient();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.actor.getReveActuel() == 0) {
|
if (this.actor.getReveActuel() == 0) {
|
||||||
this._tellToGM("Vos Points de Rêve sont à 0 : vous quittez les Terres médianes !");
|
this._tellToGM("Vos Points de Rêve sont à 0 : vous quittez les Terres médianes !");
|
||||||
this.quitterLesTMRInconscient();
|
this.quitterLesTMRInconscient();
|
||||||
@@ -452,7 +493,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
// TODO: remplacer par une boucle while(this.currentRencontre) ?
|
// TODO: remplacer par une boucle while(this.currentRencontre) ?
|
||||||
rencData.nbRounds++;
|
rencData.nbRounds++;
|
||||||
if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
|
if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
|
||||||
this.cumulFatigue += this.fatigueParCase;
|
this.cumulFatigue += this.fatigueParCase;
|
||||||
}
|
}
|
||||||
this._tentativeMaitrise(rencData);
|
this._tentativeMaitrise(rencData);
|
||||||
@@ -532,8 +573,9 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
await this.maitriserRencontre();
|
await this.maitriserRencontre();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let dialog = new RdDTMRRencontreDialog(this, this.currentRencontre, tmr);
|
const dialog = new RdDTMRRencontreDialog(this.actor, this.currentRencontre, tmr);
|
||||||
dialog.render(true);
|
dialog.render(true);
|
||||||
|
this.setTMRPendingAction(dialog);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -545,9 +587,12 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
_presentCite(tmr) {
|
_presentCite(tmr) {
|
||||||
const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord));
|
const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord));
|
||||||
if (presentCite) {
|
if (presentCite) {
|
||||||
this.minimize();
|
|
||||||
const caseData = presentCite;
|
const caseData = presentCite;
|
||||||
EffetsDraconiques.presentCites.choisirUnPresent(caseData, (present => this._utiliserPresentCite(presentCite, present, tmr)));
|
const dialog = EffetsDraconiques.presentCites.choisirUnPresent(caseData, present => {
|
||||||
|
this._utiliserPresentCite(presentCite, present, tmr)
|
||||||
|
this.restoreTMRAfterAction();
|
||||||
|
});
|
||||||
|
this.setTMRPendingAction(dialog);
|
||||||
}
|
}
|
||||||
return presentCite;
|
return presentCite;
|
||||||
}
|
}
|
||||||
@@ -573,8 +618,6 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
presentCite: presentCite
|
presentCite: presentCite
|
||||||
};
|
};
|
||||||
await this._tentativeMaitrise(rencontreData);
|
await this._tentativeMaitrise(rencontreData);
|
||||||
|
|
||||||
this.maximize();
|
|
||||||
this.postRencontre(tmr);
|
this.postRencontre(tmr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -588,7 +631,10 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
? TMRUtility.getTMRType(tmr.coord) + " ??"
|
? TMRUtility.getTMRType(tmr.coord) + " ??"
|
||||||
: tmr.label + " (" + tmr.coord + ")");
|
: tmr.label + " (" + tmr.coord + ")");
|
||||||
|
|
||||||
|
const fakeDialogRencontre = { bringToTop: () => { } };
|
||||||
|
this.setTMRPendingAction(fakeDialogRencontre)
|
||||||
let myRoll = await RdDDice.rollTotal("1dt", { showDice: SHOW_DICE });
|
let myRoll = await RdDDice.rollTotal("1dt", { showDice: SHOW_DICE });
|
||||||
|
this.restoreTMRAfterAction()
|
||||||
if (myRoll == 7) {
|
if (myRoll == 7) {
|
||||||
this._tellToUser(myRoll + ": Rencontre en " + locTMR);
|
this._tellToUser(myRoll + ": Rencontre en " + locTMR);
|
||||||
return await game.system.rdd.rencontresTMR.getRencontreAleatoire(tmr, this.actor.isMauvaiseRencontre())
|
return await game.system.rdd.rencontresTMR.getRencontreAleatoire(tmr, this.actor.isMauvaiseRencontre())
|
||||||
@@ -778,22 +824,22 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _maitriserTMR(rollData, callbackMaitrise) {
|
async _maitriserTMR(rollData, callbackMaitrise) {
|
||||||
this.minimize(); // Hide
|
|
||||||
rollData.isTMRCache = rollData.actor.isTMRCache();
|
rollData.isTMRCache = rollData.actor.isTMRCache();
|
||||||
const dialog = await RdDRoll.create(this.actor, rollData,
|
const dialog = await RdDRoll.create(this.actor, rollData,
|
||||||
{
|
{
|
||||||
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-maitrise-tmr.html',
|
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-maitrise-tmr.html',
|
||||||
close: html => { this.maximize(); } // Re-display TMR
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: rollData.maitrise.verbe, label: rollData.maitrise.action,
|
name: rollData.maitrise.verbe, label: rollData.maitrise.action,
|
||||||
callbacks: [
|
callbacks: [
|
||||||
this.actor.createCallbackExperience(),
|
this.actor.createCallbackExperience(),
|
||||||
|
{ action: r => { this.restoreTMRAfterAction() } },
|
||||||
{ action: callbackMaitrise }
|
{ action: callbackMaitrise }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
dialog.render(true);
|
dialog.render(true);
|
||||||
|
this.setTMRPendingAction(dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -805,19 +851,21 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async declencheSortEnReserve(coord) {
|
async declencheSortEnReserve(coord) {
|
||||||
let sorts = this.getSortsReserve(coord);
|
const sorts = this.getSortsReserve(coord);
|
||||||
if (sorts.length > 0) {
|
if (sorts.length > 0) {
|
||||||
if (EffetsDraconiques.isSortReserveImpossible(this.actor)) {
|
if (EffetsDraconiques.isSortReserveImpossible(this.actor)) {
|
||||||
ui.notifications.error("Une queue ou un souffle vous empèche de déclencher de sort!");
|
ui.notifications.error("Une queue ou un souffle vous empèche de déclencher de sort!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!EffetsDraconiques.isUrgenceDraconique(this.actor) &&
|
const reserveSecurite = EffetsDraconiques.isReserveEnSecurite(this.actor);
|
||||||
(EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord))) {
|
const reserveExtensible = this.isReserveExtensible(coord);
|
||||||
let msg = "Vous êtes sur une case avec un Sort en Réserve. Grâce à votre Tête <strong>Reserve en Sécurité</strong> ou <strong>Réserve Exensible</strong>, vous pouvez contrôler le déclenchement. Cliquez si vous souhaitez le déclencher : <ul>";
|
if (!EffetsDraconiques.isUrgenceDraconique(this.actor) && (reserveSecurite || reserveExtensible)) {
|
||||||
for (let sort of sorts) {
|
const msg = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-demande-declencher-sort.hbs`, {
|
||||||
msg += `<li><a class="chat-card-button declencher-sort-reserve" data-actor-id="${this.actor.id}" data-tmr-coord="${coord}" data-sort-id='${sort.id}">${sort.name}</a></li>`;
|
actor: this.actor,
|
||||||
}
|
sorts: sorts,
|
||||||
msg += "</ol>";
|
coord: coord,
|
||||||
|
tete: { reserveSecurite: reserveSecurite, reserveExtensible: reserveExtensible }
|
||||||
|
})
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
content: msg,
|
content: msg,
|
||||||
whisper: ChatMessage.getWhisperRecipients(game.user.name)
|
whisper: ChatMessage.getWhisperRecipients(game.user.name)
|
||||||
@@ -861,7 +909,8 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
nettoyerRencontre() {
|
nettoyerRencontre() {
|
||||||
if (!this.currentRencontre) return; // Sanity check
|
if (!this.currentRencontre) return; // Sanity check
|
||||||
if (this.currentRencontre.graphics) {
|
if (this.currentRencontre.graphics) {
|
||||||
for (let drawRect of this.currentRencontre.graphics) { // Suppression des dessins des zones possibles
|
for (let drawRect of this.currentRencontre.graphics) {
|
||||||
|
// Suppression des dessins des zones possibles
|
||||||
this.pixiApp.stage.removeChild(drawRect);
|
this.pixiApp.stage.removeChild(drawRect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -894,8 +943,8 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
isConnaissanceFleuve(currentTMR, nextTMR) {
|
isConnaissanceFleuve(tmrApp, nextTMR) {
|
||||||
return TMRUtility.getTMR(currentTMR).type == 'fleuve' &&
|
return TMRUtility.getTMR(tmrApp).type == 'fleuve' &&
|
||||||
TMRUtility.getTMR(nextTMR).type == 'fleuve' &&
|
TMRUtility.getTMR(nextTMR).type == 'fleuve' &&
|
||||||
EffetsDraconiques.isConnaissanceFleuve(this.actor);
|
EffetsDraconiques.isConnaissanceFleuve(this.actor);
|
||||||
}
|
}
|
||||||
@@ -905,15 +954,15 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
if (this.viewOnly) {
|
if (this.viewOnly) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let clickOddq = RdDTMRDialog._computeEventOddq(event.data.originalEvent);
|
if (this.subdialog) {
|
||||||
await this._onClickTMRPos(clickOddq); // Vérifier l'état des compteurs reve/fatigue/vie
|
return this.forceTMRContinueAction()
|
||||||
}
|
}
|
||||||
|
let clickOddq = TMRUtility.computeEventOddq(event);
|
||||||
/* -------------------------------------------- */
|
|
||||||
async _onClickTMRPos(clickOddq) {
|
|
||||||
let currentOddq = TMRUtility.coordTMRToOddq(this._getActorCoord());
|
let currentOddq = TMRUtility.coordTMRToOddq(this._getActorCoord());
|
||||||
|
|
||||||
let targetCoord = TMRUtility.oddqToCoordTMR(clickOddq);
|
let targetCoord = TMRUtility.oddqToCoordTMR(clickOddq);
|
||||||
let currentCoord = TMRUtility.oddqToCoordTMR(currentOddq);
|
let currentCoord = TMRUtility.oddqToCoordTMR(currentOddq);
|
||||||
|
|
||||||
// Validation de la case de destination (gestion du cas des rencontres qui peuvent téléporter)
|
// Validation de la case de destination (gestion du cas des rencontres qui peuvent téléporter)
|
||||||
let deplacementType = this._calculDeplacement(targetCoord, currentCoord, currentOddq, clickOddq);
|
let deplacementType = this._calculDeplacement(targetCoord, currentCoord, currentOddq, clickOddq);
|
||||||
|
|
||||||
@@ -945,7 +994,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
await this._messagerDemiReve(targetCoord);
|
await this._messagerDemiReve(targetCoord);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ui.notifications.error("Vous ne pouvez pas vous déplacer que sur des cases adjacentes à votre position ou valides dans le cas d'une rencontre");
|
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 :", this.rencontreState, this.currentRencontre);
|
console.log("STATUS :", this.rencontreState, this.currentRencontre);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -974,9 +1023,11 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _messagerDemiReve(targetCoord) {
|
async _messagerDemiReve(targetCoord) {
|
||||||
/*
|
/*
|
||||||
TODO: si la case a un sort en réserve, lancer ce sort.
|
TODO:
|
||||||
|
Si la case a un sort en réserve, lancer ce sort.
|
||||||
Si la case est le demi-rêve, ne pas lancer de sort.
|
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)
|
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)
|
||||||
*/
|
*/
|
||||||
this.notifierResonanceSigneDraconique(targetCoord);
|
this.notifierResonanceSigneDraconique(targetCoord);
|
||||||
await this.actor.rollUnSort(targetCoord);
|
await this.actor.rollUnSort(targetCoord);
|
||||||
@@ -993,6 +1044,9 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async _deplacerDemiReve(targetCoord, deplacementType) {
|
async _deplacerDemiReve(targetCoord, deplacementType) {
|
||||||
|
if (this.subdialog) {
|
||||||
|
return this.forceTMRContinueAction()
|
||||||
|
}
|
||||||
if (this.currentRencontre != 'normal') {
|
if (this.currentRencontre != 'normal') {
|
||||||
this.nettoyerRencontre();
|
this.nettoyerRencontre();
|
||||||
}
|
}
|
||||||
@@ -1003,7 +1057,7 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
await this.actor.updateCoordTMR(tmr.coord);
|
await this.actor.updateCoordTMR(tmr.coord);
|
||||||
|
|
||||||
this.forceDemiRevePositionView();
|
this.forceDemiRevePositionView();
|
||||||
if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
|
if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
|
||||||
this.cumulFatigue += this.fatigueParCase;
|
this.cumulFatigue += this.fatigueParCase;
|
||||||
}
|
}
|
||||||
this.updateValuesDisplay();
|
this.updateValuesDisplay();
|
||||||
@@ -1042,24 +1096,16 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async positionnerDemiReve(coord) {
|
async positionnerDemiReve(coord) {
|
||||||
|
if (this.subdialog) {
|
||||||
|
return this.forceTMRContinueAction()
|
||||||
|
}
|
||||||
|
|
||||||
await this.actor.updateCoordTMR(coord);
|
await this.actor.updateCoordTMR(coord);
|
||||||
this.forceDemiRevePositionView();
|
this.forceDemiRevePositionView();
|
||||||
let tmr = TMRUtility.getTMR(coord);
|
let tmr = TMRUtility.getTMR(coord);
|
||||||
await this.postRencontre(tmr);
|
await this.postRencontre(tmr);
|
||||||
return tmr;
|
return tmr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static _computeEventOddq(origEvent) {
|
|
||||||
let canvasRect = origEvent.target.getBoundingClientRect();
|
|
||||||
let x = origEvent.clientX - canvasRect.left;
|
|
||||||
let y = origEvent.clientY - canvasRect.top;
|
|
||||||
let col = Math.floor(x / tmrConstants.cellw); // [From 0 -> 12]
|
|
||||||
y -= col % 2 == 0 ? tmrConstants.col1_y : tmrConstants.col2_y;
|
|
||||||
let row = Math.floor(y / tmrConstants.cellh); // [From 0 -> 14]
|
|
||||||
return { col: col, row: row };
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/** Retourne les coordonnées x, h, w, h du rectangle d'une case donnée */
|
/** Retourne les coordonnées x, h, w, h du rectangle d'une case donnée */
|
||||||
_getCaseRectangleCoord(coord) {
|
_getCaseRectangleCoord(coord) {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
export class RdDTMRRencontreDialog extends Dialog {
|
export class RdDTMRRencontreDialog extends Dialog {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
constructor(tmrApp, rencontre, tmr) {
|
constructor(actor, rencontre, tmr) {
|
||||||
const dialogConf = {
|
const dialogConf = {
|
||||||
title: "Rencontre en TMR!",
|
title: "Rencontre en TMR!",
|
||||||
content: "Vous rencontrez un " + rencontre.name + " de force " + rencontre.system.force + "<br>",
|
content: "Vous rencontrez un " + rencontre.name + " de force " + rencontre.system.force + "<br>",
|
||||||
@@ -28,23 +28,30 @@ export class RdDTMRRencontreDialog extends Dialog {
|
|||||||
|
|
||||||
this.toClose = false;
|
this.toClose = false;
|
||||||
this.tmr = tmr;
|
this.tmr = tmr;
|
||||||
this.tmrApp = tmrApp;
|
this.actor = actor;
|
||||||
this.rencontre = rencontre;
|
this.rencontre = rencontre;
|
||||||
this.tmrApp.minimize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async onButtonAction(action) {
|
async onButtonAction(action) {
|
||||||
this.toClose = true;
|
this.toClose = true;
|
||||||
this.tmrApp.onActionRencontre(action, this.tmr, this.rencontre)
|
await this.actor.tmrApp?.restoreTMRAfterAction();
|
||||||
|
this.actor.tmrApp?.onActionRencontre(action, this.tmr, this.rencontre)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
close() {
|
async close() {
|
||||||
if (this.toClose) {
|
if (this.actor.tmrApp){
|
||||||
this.tmrApp.maximize();
|
if (this.toClose) {
|
||||||
return super.close();
|
return await super.close();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ui.notifications.info("Vous devez résoudre la rencontre.");
|
||||||
|
return this.actor.tmrApp.forceTMRContinueAction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return await super.close();
|
||||||
}
|
}
|
||||||
ui.notifications.info("Vous devez résoudre la rencontre.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import { HtmlUtility } from "./html-utility.js";
|
import { HtmlUtility } from "./html-utility.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { RdDCombatManager } from "./rdd-combat.js";
|
import { RdDCombatManager } from "./rdd-combat.js";
|
||||||
|
import { Targets } from "./targets.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RdDTokenHud {
|
export class RdDTokenHud {
|
||||||
@@ -18,29 +19,39 @@ export class RdDTokenHud {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async addExtensionHud(app, html, tokenId) {
|
static async addExtensionHud(app, html, tokenId, isCombat) {
|
||||||
|
|
||||||
let token = canvas.tokens.get(tokenId);
|
let token = canvas.tokens.get(tokenId);
|
||||||
let actor = token.actor;
|
let actor = token.actor;
|
||||||
let combatant = game.combat.combatants.find(c => c.tokenId == tokenId);
|
app.hasExtension = true;
|
||||||
if (! (combatant?.actor) ) {
|
// soins
|
||||||
|
await RdDTokenHud.addExtensionHudSoins(html, actor);
|
||||||
|
|
||||||
|
if (isCombat) {
|
||||||
|
let combatant = game.combat.combatants.find(c => c.tokenId == tokenId);
|
||||||
|
if (!(combatant?.actor)) {
|
||||||
ui.notifications.warn(`Le combatant ${token.name} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
|
ui.notifications.warn(`Le combatant ${token.name} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
let actions = RdDCombatManager.listActionsCombat(combatant);
|
||||||
|
// initiative
|
||||||
|
await RdDTokenHud.addExtensionHudInit(html, combatant, actions);
|
||||||
|
// combat
|
||||||
|
await RdDTokenHud.addExtensionHudCombat(html, combatant, actions);
|
||||||
}
|
}
|
||||||
app.hasExtension = true;
|
|
||||||
|
|
||||||
let actionsCombat = RdDCombatManager.listActionsCombat(combatant);
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static async addExtensionHudInit(html, combatant, actions) {
|
||||||
const hudData = {
|
const hudData = {
|
||||||
combatant: combatant,
|
combatant, actions,
|
||||||
actions: actionsCombat,
|
|
||||||
commandes: [
|
commandes: [
|
||||||
{ name: "Autre action", command: 'autre' },
|
{ name: "Autre action", command: 'autre' },
|
||||||
{ name: 'Initiative +1', command: 'inc', value: 0.01 },
|
{ name: 'Initiative +1', command: 'inc', value: 0.01 },
|
||||||
{ name: 'Initiative -1', command: 'dec', value: -0.01 }]
|
{ name: 'Initiative -1', command: 'dec', value: -0.01 }]
|
||||||
};
|
};
|
||||||
|
|
||||||
const controlIconCombat = html.find('.control-icon[data-action=combat]');
|
const controlIconCombat = html.find('.control-icon[data-action=combat]');
|
||||||
// initiative
|
|
||||||
await RdDTokenHud._configureSubMenu(controlIconCombat,
|
await RdDTokenHud._configureSubMenu(controlIconCombat,
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-init.html',
|
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-init.html',
|
||||||
hudData,
|
hudData,
|
||||||
@@ -51,48 +62,70 @@ export class RdDTokenHud {
|
|||||||
RdDTokenHud._initiativeCommand(initCommand, combatantId);
|
RdDTokenHud._initiativeCommand(initCommand, combatantId);
|
||||||
} else {
|
} else {
|
||||||
let index = event.currentTarget.attributes['data-action-index'].value;
|
let index = event.currentTarget.attributes['data-action-index'].value;
|
||||||
let action = actionsCombat[index];
|
let action = hudData.actions[index];
|
||||||
RdDCombatManager.rollInitiativeAction(combatantId, action);
|
RdDCombatManager.rollInitiativeAction(combatantId, action);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static async addExtensionHudCombat(html, combatant, actions) {
|
||||||
|
const hudData = { combatant, actions, commandes: [] };
|
||||||
const controlIconTarget = html.find('.control-icon[data-action=target]');
|
const controlIconTarget = html.find('.control-icon[data-action=target]');
|
||||||
// combat
|
|
||||||
await RdDTokenHud._configureSubMenu(controlIconTarget, 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.html', hudData,
|
await RdDTokenHud._configureSubMenu(controlIconTarget, 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.html', hudData,
|
||||||
(event) => {
|
(event) => {
|
||||||
const actionIndex = event.currentTarget.attributes['data-action-index']?.value;
|
const actionIndex = event.currentTarget.attributes['data-action-index']?.value;
|
||||||
const action = actionsCombat[actionIndex];
|
const action = hudData.actions[actionIndex];
|
||||||
if (action.action == 'conjurer') {
|
const possession = action.action == 'possession' ? combatant.actor.getPossession(action.system.possessionid) : undefined;
|
||||||
actor.conjurerPossession(actor.getPossession(action.system.possessionid));
|
if (possession) {
|
||||||
|
combatant.actor.conjurerPossession(possession);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
actor.rollArme(action);
|
combatant.actor.rollArme(action);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async addExtensionHudSoins(html, sourceActor) {
|
||||||
|
const target = Targets.getTarget({ warn: false });
|
||||||
|
if (target?.actor) {
|
||||||
|
const hudSoins = { blessures: target.actor.blessuresASoigner() ?? [] };
|
||||||
|
if (hudSoins.blessures.length > 0) {
|
||||||
|
// soins
|
||||||
|
const controlIconTarget = html.find('.control-icon[data-action=combat]');
|
||||||
|
await RdDTokenHud._configureSubMenu(controlIconTarget,
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-soins.hbs',
|
||||||
|
hudSoins,
|
||||||
|
(event) => {
|
||||||
|
const blessureId = event.currentTarget.attributes['data-blessure-id']?.value;
|
||||||
|
sourceActor.rollSoins(target.actor, blessureId)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static _initiativeCommand(initCommand, combatantId) {
|
static _initiativeCommand(initCommand, combatantId) {
|
||||||
switch (initCommand) {
|
switch (initCommand) {
|
||||||
case 'inc': return RdDCombatManager.incDecInit(combatantId, 0.01);
|
case 'inc': return RdDCombatManager.incDecInit(combatantId, 0.01);
|
||||||
case 'dec': return RdDCombatManager.incDecInit(combatantId, -0.01);
|
case 'dec': return RdDCombatManager.incDecInit(combatantId, -0.01);
|
||||||
case 'autre': return RdDCombatManager.rollInitiativeAction(combatantId,
|
case 'autre': return RdDCombatManager.rollInitiativeAction(combatantId,
|
||||||
{ name: "Autre action", action: 'autre', system: { initOnly: true, competence: "Autre action" } });
|
{ name: "Autre action", action: 'autre', system: { initOnly: true, competence: "Autre action" } });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async addTokenHudExtensions(app, html, tokenId) {
|
static async addTokenHudExtensions(app, html, tokenId) {
|
||||||
const controlIconCombat = html.find('.control-icon[data-action=combat]');
|
const controlIconCombat = html.find('.control-icon[data-action=combat]');
|
||||||
controlIconCombat.click(event => {
|
if (controlIconCombat.length > 0) {
|
||||||
if (event.currentTarget.className.includes('active')) {
|
controlIconCombat.click(event => {
|
||||||
RdDTokenHud.removeExtensionHud(app, html, tokenId);
|
if (event.currentTarget.className.includes('active')) {
|
||||||
} else {
|
RdDTokenHud.removeExtensionHud(app, html, tokenId);
|
||||||
setTimeout(function () { RdDTokenHud.addExtensionHud(app, html, tokenId) }, 200);
|
} else {
|
||||||
}
|
setTimeout(() => RdDTokenHud.addExtensionHud(app, html, tokenId), 200);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (controlIconCombat.length>0 && controlIconCombat[0].className.includes('active')) {
|
const isCombat = controlIconCombat[0].className.includes('active');
|
||||||
RdDTokenHud.addExtensionHud(app, html, tokenId);
|
RdDTokenHud.addExtensionHud(app, html, tokenId, isCombat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,9 +133,9 @@ export class RdDTokenHud {
|
|||||||
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
|
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
|
||||||
const hud = $(await renderTemplate(template, hudData));
|
const hud = $(await renderTemplate(template, hudData));
|
||||||
const list = hud.find('div.rdd-hud-list');
|
const list = hud.find('div.rdd-hud-list');
|
||||||
|
|
||||||
RdDTokenHud._toggleHudListActive(hud, list);
|
RdDTokenHud._toggleHudListActive(hud, list);
|
||||||
|
|
||||||
hud.find('img.rdd-hud-togglebutton').click(event => RdDTokenHud._toggleHudListActive(hud, list));
|
hud.find('img.rdd-hud-togglebutton').click(event => RdDTokenHud._toggleHudListActive(hud, list));
|
||||||
list.find('.rdd-hud-menu').click(onMenuItem);
|
list.find('.rdd-hud-menu').click(onMenuItem);
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { Misc } from "./misc.js";
|
|||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { TMRUtility } from "./tmr-utility.js";
|
import { TMRUtility } from "./tmr-utility.js";
|
||||||
import { DialogItemAchat } from "./dialog-item-achat.js";
|
import { DialogItemAchat } from "./dialog-item-achat.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
import { RdDDice } from "./rdd-dice.js";
|
||||||
import { RdDItem } from "./item.js";
|
import { RdDItem } from "./item.js";
|
||||||
import { RdDPossession } from "./rdd-possession.js";
|
import { RdDPossession } from "./rdd-possession.js";
|
||||||
@@ -13,20 +13,22 @@ import { RdDNameGen } from "./rdd-namegen.js";
|
|||||||
import { RdDConfirm } from "./rdd-confirm.js";
|
import { RdDConfirm } from "./rdd-confirm.js";
|
||||||
import { RdDItemCompetence } from "./item-competence.js";
|
import { RdDItemCompetence } from "./item-competence.js";
|
||||||
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
||||||
import { RdDTimestamp } from "./rdd-timestamp.js";
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
||||||
import { RdDRaretes } from "./item/raretes.js";
|
import { RdDRaretes } from "./item/raretes.js";
|
||||||
|
import { RdDEmpoignade } from "./rdd-empoignade.js";
|
||||||
|
import { ExperienceLog } from "./actor/experience-log.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// This table starts at 0 -> niveau -10
|
// This table starts at 0 -> niveau -10
|
||||||
const carac_array = ["taille", "apparence", "constitution", "force", "agilite", "dexterite", "vue", "ouie", "odoratgout", "volonte", "intellect", "empathie", "reve", "chance", "melee", "tir", "lancer", "derobee"];
|
const carac_array = ["taille", "apparence", "constitution", "force", "agilite", "dexterite", "vue", "ouie", "odoratgout", "volonte", "intellect", "empathie", "reve", "chance", "melee", "tir", "lancer", "derobee"];
|
||||||
const difficultesLibres = [0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10];
|
const difficultesLibres = Misc.intArray(0, -11);
|
||||||
const ajustementsConditions = [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10];
|
const ajustementsConditions = Misc.intArray(-10, 11);
|
||||||
const ajustementsEncaissement = [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25];
|
const ajustementsEncaissement = Misc.intArray(-10, 26);
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
function _buildAllSegmentsFatigue(max) {
|
function _buildAllSegmentsFatigue(max) {
|
||||||
const cycle = [5, 2, 4, 1, 3, 0];
|
const cycle = [5, 2, 4, 1, 3, 0];
|
||||||
let fatigue = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
|
const fatigue = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
|
||||||
for (let i = 0; i <= max; i++) {
|
for (let i = 0; i <= max; i++) {
|
||||||
const ligneFatigue = duplicate(fatigue[i]);
|
const ligneFatigue = duplicate(fatigue[i]);
|
||||||
const caseIncrementee = cycle[i % 6];
|
const caseIncrementee = cycle[i % 6];
|
||||||
@@ -53,7 +55,8 @@ function _cumulSegmentsFatigue(matrix) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const fatigueMatrix = _buildAllSegmentsFatigue(60);
|
export const MAX_ENDURANCE_FATIGUE = 60;
|
||||||
|
const fatigueMatrix = _buildAllSegmentsFatigue(MAX_ENDURANCE_FATIGUE);
|
||||||
const cumulFatigueMatrix = _cumulSegmentsFatigue(fatigueMatrix);
|
const cumulFatigueMatrix = _cumulSegmentsFatigue(fatigueMatrix);
|
||||||
|
|
||||||
const fatigueMalus = [0, 0, 0, -1, -1, -1, -2, -3, -4, -5, -6, -7]; // Provides the malus for each segment of fatigue
|
const fatigueMalus = [0, 0, 0, -1, -1, -1, -2, -3, -4, -5, -6, -7]; // Provides the malus for each segment of fatigue
|
||||||
@@ -66,38 +69,31 @@ const fatigueMarche = {
|
|||||||
"tresdifficile": { "4": 4, "6": 6 }
|
"tresdifficile": { "4": 4, "6": 6 }
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
const definitionsBlessures = [
|
|
||||||
{ type: "legere", facteur: 2 },
|
|
||||||
{ type: "grave", facteur: 4 },
|
|
||||||
{ type: "critique", facteur: 6 }
|
|
||||||
]
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const nomEthylisme = ["Emeché", "Gris", "Pinté", "Pas frais", "Ivre", "Bu", "Complètement fait", "Ivre mort"];
|
const nomEthylisme = ["Emeché", "Gris", "Pinté", "Pas frais", "Ivre", "Bu", "Complètement fait", "Ivre mort"];
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const definitionsEncaissement = {
|
const definitionsEncaissement = {
|
||||||
"mortel": [
|
"mortel": [
|
||||||
{ minimum: undefined, maximum: 0, endurance: "0", vie: "0", eraflures: 0, legeres: 0, graves: 0, critiques: 0 },
|
{ minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1},
|
||||||
{ minimum: 1, maximum: 10, endurance: "1d4", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
|
{ minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0},
|
||||||
{ minimum: 11, maximum: 15, endurance: "1d6", vie: "0", eraflures: 0, legeres: 1, graves: 0, critiques: 0 },
|
{ minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 2},
|
||||||
{ minimum: 16, maximum: 19, endurance: "2d6", vie: "2", eraflures: 0, legeres: 0, graves: 1, critiques: 0 },
|
{ minimum: 16, maximum: 19, endurance: "2d6", vie: "2", gravite: 4},
|
||||||
{ minimum: 20, maximum: undefined, endurance: "100", vie: "4 + @over20", eraflures: 0, legeres: 0, graves: 0, critiques: 1 },
|
{ minimum: 20, maximum: undefined, endurance: "100", vie: "4 + @over20", gravite: 6},
|
||||||
],
|
],
|
||||||
"non-mortel": [
|
"non-mortel": [
|
||||||
{ minimum: undefined, maximum: 0, endurance: "0", vie: "0", eraflures: 0, legeres: 0, graves: 0, critiques: 0 },
|
{ minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1},
|
||||||
{ minimum: 1, maximum: 10, endurance: "1d4", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
|
{ minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0 },
|
||||||
{ minimum: 11, maximum: 15, endurance: "1d6", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
|
{ minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 0 },
|
||||||
{ minimum: 16, maximum: 19, endurance: "2d6", vie: "0", eraflures: 0, legeres: 1, graves: 0, critiques: 0 },
|
{ minimum: 16, maximum: 19, endurance: "2d6", vie: "0", gravite: 2 },
|
||||||
{ minimum: 20, maximum: undefined, endurance: "100", vie: "0", eraflures: 0, legeres: 1, graves: 0, critiques: 0 },
|
{ minimum: 20, maximum: undefined, endurance: "100", vie: "0", gravite: 2 },
|
||||||
],
|
],
|
||||||
"cauchemar": [
|
"entiteincarnee": [
|
||||||
{ minimum: undefined, maximum: 0, endurance: "0", vie: "0", eraflures: 0, legeres: 0, graves: 0, critiques: 0 },
|
{ minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1},
|
||||||
{ minimum: 1, maximum: 10, endurance: "1d4", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
|
{ minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0},
|
||||||
{ minimum: 11, maximum: 15, endurance: "1d6", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
|
{ minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 0 },
|
||||||
{ minimum: 16, maximum: 19, endurance: "2d6", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
|
{ minimum: 16, maximum: 19, endurance: "2d6", vie: "0", gravite: 0 },
|
||||||
{ minimum: 20, maximum: undefined, endurance: "3d6 + @over20", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
|
{ minimum: 20, maximum: undefined, endurance: "3d6 + @over20", vie: "0", gravite: 0 },
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -126,6 +122,7 @@ export class RdDUtility {
|
|||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/header-compteurs-entitee.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/header-compteurs-entitee.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/header-effects.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/header-effects.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/header-hautreve.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/header-hautreve.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/archetype.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/vue-detaillee.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/vue-detaillee.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-main.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-main.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-derivee.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-derivee.html',
|
||||||
@@ -139,9 +136,10 @@ export class RdDUtility {
|
|||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/xp-competences.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/xp-competences.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/combat.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/combat.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/blessures.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/blessures.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/blessure.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/blessure.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/maladies-poisons.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/maladies-poisons.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/possessions.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/possessions.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/actor/resonances.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/taches.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/taches.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/taches.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/taches.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/actor/oeuvres.html',
|
'systems/foundryvtt-reve-de-dragon/templates/actor/oeuvres.html',
|
||||||
@@ -183,26 +181,28 @@ export class RdDUtility {
|
|||||||
'systems/foundryvtt-reve-de-dragon/templates/item-queue-sheet.html',
|
'systems/foundryvtt-reve-de-dragon/templates/item-queue-sheet.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/header-item.html',
|
'systems/foundryvtt-reve-de-dragon/templates/header-item.html',
|
||||||
// partial enums
|
// partial enums
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-caracteristiques.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-base-competence.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-aspect-tarot.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-aspect-tarot.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-competence.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-base-competence.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/enum-caracteristiques.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/enum-categories.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-ingredient.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-ingredient.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-parade.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-parade.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-potion.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-potion.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-queue.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-vehicule.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-vehicule.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-competence.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-competence.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/enum-draconic.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-heures.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-heures.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-initpremierround.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-initpremierround.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/enum-mortalite.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-niveau-ethylisme.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-niveau-ethylisme.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-rarete.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-queue.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-draconic.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-tmr-type.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-periode.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-periode.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/enum-rarete.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/enum-tmr-effet.html',
|
'systems/foundryvtt-reve-de-dragon/templates/enum-tmr-effet.html',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/enum-tmr-type.html',
|
||||||
// Partials
|
// Partials
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats-recherche.hbs',
|
'systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats-recherche.hbs',
|
||||||
|
'systems/foundryvtt-reve-de-dragon/templates/time/horloge.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/common/timestamp.hbs',
|
'systems/foundryvtt-reve-de-dragon/templates/common/timestamp.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/common/periodicite.hbs',
|
'systems/foundryvtt-reve-de-dragon/templates/common/periodicite.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/common/enum-duree.hbs',
|
'systems/foundryvtt-reve-de-dragon/templates/common/enum-duree.hbs',
|
||||||
@@ -234,10 +234,10 @@ export class RdDUtility {
|
|||||||
'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-meditation.html',
|
'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-meditation.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html',
|
'systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-alchimie.html',
|
'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-alchimie.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/dialog-astrologie-joueur.html',
|
'systems/foundryvtt-reve-de-dragon/templates/sommeil/sommeil-actor-moral.hbs',
|
||||||
// Calendrier
|
'systems/foundryvtt-reve-de-dragon/templates/sommeil/astrologie-gardien.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/calendar-template.html',
|
'systems/foundryvtt-reve-de-dragon/templates/sommeil/astrologie-joueur.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/calendar-editor-template.html',
|
'systems/foundryvtt-reve-de-dragon/templates/sommeil/astrologie-theme.hbs',
|
||||||
// HUD
|
// HUD
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-init.html',
|
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-init.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.html',
|
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.html',
|
||||||
@@ -246,21 +246,8 @@ export class RdDUtility {
|
|||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-description.html',
|
'systems/foundryvtt-reve-de-dragon/templates/chat-description.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-info-appel-au-moral.html',
|
'systems/foundryvtt-reve-de-dragon/templates/chat-info-appel-au-moral.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-info-distance.html',
|
'systems/foundryvtt-reve-de-dragon/templates/chat-info-distance.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.html',
|
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-acteur.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-particuliere.html',
|
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-sante.hbs',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-appelchance.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-attaque.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-parade.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-esquive.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-competence.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-general.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-tache.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-sort.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-alchimie.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-resultat-possession.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-summary.html',
|
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-competence-xp.html',
|
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-competence-xp.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.html',
|
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.html',
|
||||||
'systems/foundryvtt-reve-de-dragon/templates/chat-potionenchantee-chateaudormant.html',
|
'systems/foundryvtt-reve-de-dragon/templates/chat-potionenchantee-chateaudormant.html',
|
||||||
@@ -273,7 +260,8 @@ export class RdDUtility {
|
|||||||
Handlebars.registerHelper('computeResolutionChances', (row, col) => RdDResolutionTable.computeChances(row, col));
|
Handlebars.registerHelper('computeResolutionChances', (row, col) => RdDResolutionTable.computeChances(row, col));
|
||||||
Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null'));
|
Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null'));
|
||||||
Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null'));
|
Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null'));
|
||||||
Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL');
|
Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? '');
|
||||||
|
Handlebars.registerHelper('lowercase', str => str?.toLowerCase() ?? '');
|
||||||
Handlebars.registerHelper('le', str => Grammar.articleDetermine(str));
|
Handlebars.registerHelper('le', str => Grammar.articleDetermine(str));
|
||||||
Handlebars.registerHelper('apostrophe', (article, str) => Grammar.apostrophe(article, str));
|
Handlebars.registerHelper('apostrophe', (article, str) => Grammar.apostrophe(article, str));
|
||||||
Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str));
|
Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str));
|
||||||
@@ -294,13 +282,16 @@ export class RdDUtility {
|
|||||||
Handlebars.registerHelper('timestamp-formulesPeriode', () => RdDTimestamp.formulesPeriode());
|
Handlebars.registerHelper('timestamp-formulesPeriode', () => RdDTimestamp.formulesPeriode());
|
||||||
|
|
||||||
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
|
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
|
||||||
Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionelles.isUsing(option));
|
Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionnelles.isUsing(option));
|
||||||
Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name)));
|
Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name)));
|
||||||
Handlebars.registerHelper('filtreTriCompetences', competences => RdDItemCompetence.triVisible(competences));
|
Handlebars.registerHelper('filtreTriCompetences', competences => RdDItemCompetence.triVisible(competences));
|
||||||
Handlebars.registerHelper('linkCompendium', (pack, id, name) => RdDUtility.linkCompendium(pack, id, name));
|
Handlebars.registerHelper('linkCompendium', (pack, id, name) => RdDUtility.linkCompendium(pack, id, name));
|
||||||
Handlebars.registerHelper('uniteQuantite', (itemId, actorId) => RdDUtility.getItem(itemId, actorId)?.getUniteQuantite());
|
Handlebars.registerHelper('uniteQuantite', (itemId, actorId) => RdDUtility.getItem(itemId, actorId)?.getUniteQuantite());
|
||||||
Handlebars.registerHelper('isFieldInventaireModifiable', (type, field) => RdDItem.isFieldInventaireModifiable(type, field));
|
Handlebars.registerHelper('isFieldInventaireModifiable', (type, field) => RdDItem.isFieldInventaireModifiable(type, field));
|
||||||
Handlebars.registerHelper('rarete-getChamp', (rarete, field) => RdDRaretes.getChamp(rarete, field));
|
Handlebars.registerHelper('rarete-getChamp', (rarete, field) => RdDRaretes.getChamp(rarete, field));
|
||||||
|
|
||||||
|
Handlebars.registerHelper('experienceLog-topic', topic => ExperienceLog.labelTopic(topic));
|
||||||
|
|
||||||
return loadTemplates(templatePaths);
|
return loadTemplates(templatePaths);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -352,13 +343,13 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static buildArbreDeConteneurs(conteneurs, objets) {
|
static buildArbreDeConteneurs(conteneurs, inventaires) {
|
||||||
let objetVersConteneur = {};
|
let objetVersConteneur = {};
|
||||||
// Attribution des objets aux conteneurs
|
// Attribution des objets aux conteneurs
|
||||||
for (let conteneur of conteneurs) {
|
for (let conteneur of conteneurs) {
|
||||||
conteneur.subItems = [];
|
conteneur.subItems = [];
|
||||||
for (let id of conteneur.system.contenu ?? []) {
|
for (let id of conteneur.system.contenu ?? []) {
|
||||||
let objet = objets.find(objet => (id == objet._id));
|
let objet = inventaires.find(objet => (id == objet._id));
|
||||||
if (objet) {
|
if (objet) {
|
||||||
objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template
|
objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template
|
||||||
objetVersConteneur[id] = conteneur._id;
|
objetVersConteneur[id] = conteneur._id;
|
||||||
@@ -367,20 +358,20 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let conteneur of conteneurs) {
|
for (let conteneur of conteneurs) {
|
||||||
conteneur.system.encTotal = RdDUtility.calculEncContenu(conteneur, objets);
|
conteneur.system.encTotal = RdDUtility.calculEncContenu(conteneur, inventaires);
|
||||||
}
|
}
|
||||||
return objetVersConteneur;
|
return objetVersConteneur;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static calculEncContenu(conteneur, objets) {
|
static calculEncContenu(conteneur, inventaires) {
|
||||||
const contenus = (conteneur.system.contenu ?? []).filter(id => id != undefined)
|
const contenus = (conteneur.system.contenu ?? []).filter(id => id != undefined)
|
||||||
.map(id => objets.find(it => (id == it.id)))
|
.map(id => inventaires.find(it => (id == it.id)))
|
||||||
.filter(it => it);
|
.filter(it => it);
|
||||||
let enc = Number(conteneur.system.encombrement ?? 0) * Number(conteneur.system.quantite ?? 1);
|
let enc = Number(conteneur.system.encombrement ?? 0) * Number(conteneur.system.quantite ?? 1);
|
||||||
for (let contenu of contenus) {
|
for (let contenu of contenus) {
|
||||||
if (contenu.type == 'conteneur') {
|
if (contenu.type == 'conteneur') {
|
||||||
enc += RdDUtility.calculEncContenu(contenu, objets);
|
enc += RdDUtility.calculEncContenu(contenu, inventaires);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
enc += Number(contenu.system.encombrement ?? 0) * Number(contenu.system.quantite ?? 1)
|
enc += Number(contenu.system.encombrement ?? 0) * Number(contenu.system.quantite ?? 1)
|
||||||
@@ -443,12 +434,16 @@ export class RdDUtility {
|
|||||||
static buildContenuConteneur(conteneur, options = {}, optionsArbre = {}) {
|
static buildContenuConteneur(conteneur, options = {}, optionsArbre = {}) {
|
||||||
RdDUtility.prepareOptionsArbreInventaire(conteneur, optionsArbre);
|
RdDUtility.prepareOptionsArbreInventaire(conteneur, optionsArbre);
|
||||||
const display = optionsArbre.ouvert ? 'item-display-show' : 'item-display-hide';
|
const display = optionsArbre.ouvert ? 'item-display-show' : 'item-display-hide';
|
||||||
let strContenu = `<ul class='item-list alterne-list ${display} list-item-margin${Math.min(optionsArbre.profondeur, 6)}'>`;
|
const profondeur = optionsArbre.profondeur;
|
||||||
|
|
||||||
optionsArbre.profondeur++;
|
optionsArbre.profondeur++;
|
||||||
for (let contenu of conteneur.subItems) {
|
const lignesContenu = conteneur.subItems.sort(Misc.ascending(it => it.name))
|
||||||
strContenu += this.buildLigneInventaire(contenu, options, optionsArbre);
|
.map(contenu => this.buildLigneInventaire(contenu, options, optionsArbre));
|
||||||
}
|
|
||||||
return strContenu + "</ul>";
|
return `<ul class='item-list alterne-list ${display} list-item-margin${Math.min(profondeur, 6)}'>`
|
||||||
|
+ lignesContenu.reduce(Misc.joining(''), '')
|
||||||
|
+ "</ul>";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -465,23 +460,16 @@ export class RdDUtility {
|
|||||||
return ajustementsEncaissement;
|
return ajustementsEncaissement;
|
||||||
}
|
}
|
||||||
|
|
||||||
static getDefinitionsBlessures() {
|
/* -------------------------------------------- */
|
||||||
return definitionsBlessures;
|
static getSegmentsFatigue(maxEndurance) {
|
||||||
|
return fatigueMatrix[Math.min(Math.max(maxEndurance, 1), fatigueMatrix.length)];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getSegmentsFatigue(maxEnd) {
|
static calculMalusFatigue(fatigue, endurance) {
|
||||||
maxEnd = Math.max(maxEnd, 1);
|
endurance = Math.min(Math.max(endurance, 1), cumulFatigueMatrix.length);
|
||||||
maxEnd = Math.min(maxEnd, fatigueMatrix.length);
|
let segments = cumulFatigueMatrix[endurance];
|
||||||
return fatigueMatrix[maxEnd];
|
for (let i = 0; i < segments.length; i++) {
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static calculMalusFatigue(fatigue, maxEnd) {
|
|
||||||
maxEnd = Math.max(maxEnd, 1);
|
|
||||||
maxEnd = Math.min(maxEnd, cumulFatigueMatrix.length);
|
|
||||||
let segments = cumulFatigueMatrix[maxEnd];
|
|
||||||
for (let i = 0; i < 12; i++) {
|
|
||||||
if (fatigue <= segments[i]) {
|
if (fatigue <= segments[i]) {
|
||||||
return fatigueMalus[i]
|
return fatigueMalus[i]
|
||||||
}
|
}
|
||||||
@@ -491,7 +479,7 @@ export class RdDUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static calculFatigueHtml(fatigue, endurance) {
|
static calculFatigueHtml(fatigue, endurance) {
|
||||||
return ReglesOptionelles.isUsing("appliquer-fatigue") ? {
|
return ReglesOptionnelles.isUsing("appliquer-fatigue") ? {
|
||||||
malus: RdDUtility.calculMalusFatigue(fatigue, endurance),
|
malus: RdDUtility.calculMalusFatigue(fatigue, endurance),
|
||||||
html: "<table class='table-fatigue'>" + RdDUtility.makeHTMLfatigueMatrix(fatigue, endurance).html() + "</table>"
|
html: "<table class='table-fatigue'>" + RdDUtility.makeHTMLfatigueMatrix(fatigue, endurance).html() + "</table>"
|
||||||
} : { malus: 0, html: '' };
|
} : { malus: 0, html: '' };
|
||||||
@@ -501,7 +489,7 @@ export class RdDUtility {
|
|||||||
// Build the nice (?) html table used to manage fatigue.
|
// Build the nice (?) html table used to manage fatigue.
|
||||||
// max should be the endurance max value
|
// max should be the endurance max value
|
||||||
static makeHTMLfatigueMatrix(fatigue, maxEndurance) {
|
static makeHTMLfatigueMatrix(fatigue, maxEndurance) {
|
||||||
let segments = this.getSegmentsFatigue(maxEndurance);
|
const segments = this.getSegmentsFatigue(maxEndurance);
|
||||||
return this.makeHTMLfatigueMatrixForSegment(fatigue, segments);
|
return this.makeHTMLfatigueMatrixForSegment(fatigue, segments);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -567,14 +555,14 @@ export class RdDUtility {
|
|||||||
let formula = "2d10";
|
let formula = "2d10";
|
||||||
|
|
||||||
// Chaque dé fait au minmum la difficulté libre
|
// Chaque dé fait au minmum la difficulté libre
|
||||||
if (ReglesOptionelles.isUsing('degat-minimum-malus-libre')) {
|
if (ReglesOptionnelles.isUsing('degat-minimum-malus-libre')) {
|
||||||
if (rollData.diffLibre < 0) {
|
if (rollData.diffLibre < 0) {
|
||||||
let valeurMin = Math.abs(rollData.diffLibre);
|
let valeurMin = Math.abs(rollData.diffLibre);
|
||||||
formula += "min" + valeurMin;
|
formula += "min" + valeurMin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Chaque dé fait au minmum la difficulté libre
|
// Chaque dé fait au minmum la difficulté libre
|
||||||
if (ReglesOptionelles.isUsing('degat-ajout-malus-libre')) {
|
if (ReglesOptionnelles.isUsing('degat-ajout-malus-libre')) {
|
||||||
if (rollData.diffLibre < 0) {
|
if (rollData.diffLibre < 0) {
|
||||||
let valeurMin = Math.abs(rollData.diffLibre);
|
let valeurMin = Math.abs(rollData.diffLibre);
|
||||||
formula += "+" + valeurMin;
|
formula += "+" + valeurMin;
|
||||||
@@ -584,7 +572,7 @@ export class RdDUtility {
|
|||||||
let roll = await RdDDice.roll(formula, options);
|
let roll = await RdDDice.roll(formula, options);
|
||||||
|
|
||||||
// 1 dé fait au minmum la difficulté libre
|
// 1 dé fait au minmum la difficulté libre
|
||||||
if (ReglesOptionelles.isUsing('degat-minimum-malus-libre-simple')) {
|
if (ReglesOptionnelles.isUsing('degat-minimum-malus-libre-simple')) {
|
||||||
if (rollData.diffLibre < 0) {
|
if (rollData.diffLibre < 0) {
|
||||||
let valeurMin = Math.abs(rollData.diffLibre);
|
let valeurMin = Math.abs(rollData.diffLibre);
|
||||||
if (roll.terms[0].results[0].result < valeurMin) {
|
if (roll.terms[0].results[0].result < valeurMin) {
|
||||||
@@ -609,17 +597,10 @@ export class RdDUtility {
|
|||||||
encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;';
|
encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;';
|
||||||
encaissement.roll = roll;
|
encaissement.roll = roll;
|
||||||
encaissement.armure = armure;
|
encaissement.armure = armure;
|
||||||
|
encaissement.penetration = rollData.arme?.system.penetration ?? 0;
|
||||||
encaissement.total = jetTotal;
|
encaissement.total = jetTotal;
|
||||||
encaissement.vie = await RdDUtility._evaluatePerte(encaissement.vie, over20);
|
encaissement.vie = await RdDUtility._evaluatePerte(encaissement.vie, over20);
|
||||||
encaissement.endurance = await RdDUtility._evaluatePerte(encaissement.endurance, over20);
|
encaissement.endurance = await RdDUtility._evaluatePerte(encaissement.endurance, over20);
|
||||||
encaissement.penetration = rollData.arme?.system.penetration ?? 0;
|
|
||||||
encaissement.blessures = (
|
|
||||||
encaissement.critiques > 0 ? "Critique" :
|
|
||||||
encaissement.graves > 0 ? "Grave" :
|
|
||||||
encaissement.legeres > 0 ? "Légère" :
|
|
||||||
encaissement.eraflures > 0 ? "Contusions/Eraflures" :
|
|
||||||
'Aucune'
|
|
||||||
);
|
|
||||||
return encaissement;
|
return encaissement;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -642,25 +623,6 @@ export class RdDUtility {
|
|||||||
return perte.total;
|
return perte.total;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static currentFatigueMalus(value, max) {
|
|
||||||
if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
|
|
||||||
max = Math.max(1, Math.min(max, 60));
|
|
||||||
value = Math.min(max * 2, Math.max(0, value));
|
|
||||||
|
|
||||||
let fatigueTab = fatigueMatrix[max];
|
|
||||||
let fatigueRem = value;
|
|
||||||
for (let idx = 0; idx < fatigueTab.length; idx++) {
|
|
||||||
fatigueRem -= fatigueTab[idx];
|
|
||||||
if (fatigueRem <= 0) {
|
|
||||||
return fatigueMalus[idx];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -7; // This is the max !
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async responseNombreAstral(callData) {
|
static async responseNombreAstral(callData) {
|
||||||
let actor = game.actors.get(callData.id);
|
let actor = game.actors.get(callData.id);
|
||||||
@@ -688,6 +650,7 @@ export class RdDUtility {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async chatListeners(html) {
|
static async chatListeners(html) {
|
||||||
RdDCombat.registerChatCallbacks(html);
|
RdDCombat.registerChatCallbacks(html);
|
||||||
|
RdDEmpoignade.registerChatCallbacks(html);
|
||||||
|
|
||||||
// Gestion spécifique message passeurs
|
// Gestion spécifique message passeurs
|
||||||
html.on("click", '.tmr-passeur-coord a', event => {
|
html.on("click", '.tmr-passeur-coord a', event => {
|
||||||
@@ -846,17 +809,13 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static confirmerSuppressionSubacteur(sheet, subActor, htmlToDelete) {
|
static confirmerSuppressionSubacteur(sheet, subActor, htmlToDelete, onSuppression = ()=>{}) {
|
||||||
RdDConfirm.confirmer({
|
RdDConfirm.confirmer({
|
||||||
settingConfirmer: "confirmation-supprimer-lien-acteur",
|
settingConfirmer: "confirmation-supprimer-lien-acteur",
|
||||||
content: `<p>Etes vous certain de vouloir supprimer le lien vers ${subActor.name} ?</p>`,
|
content: `<p>Etes vous certain de vouloir supprimer le lien vers ${subActor.name} ?</p>`,
|
||||||
title: 'Confirmer la suppression',
|
title: 'Confirmer la suppression',
|
||||||
buttonLabel: 'Supprimer le lien',
|
buttonLabel: 'Supprimer le lien',
|
||||||
onAction: () => {
|
onAction: onSuppression
|
||||||
console.log('Delete : ', subActor.id);
|
|
||||||
sheet.actor.removeSubacteur(subActor.id);
|
|
||||||
RdDUtility.slideOnDelete(sheet, htmlToDelete);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,9 @@ import { RdDItemSort } from "./item-sort.js";
|
|||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { RdDBonus } from "./rdd-bonus.js";
|
import { RdDBonus } from "./rdd-bonus.js";
|
||||||
import { RdDCarac } from "./rdd-carac.js";
|
import { RdDCarac } from "./rdd-carac.js";
|
||||||
|
import { RdDPossession } from "./rdd-possession.js";
|
||||||
import { RdDUtility } from "./rdd-utility.js";
|
import { RdDUtility } from "./rdd-utility.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tous les ajustements pouvant s'appliquer.
|
* tous les ajustements pouvant s'appliquer.
|
||||||
@@ -30,7 +31,7 @@ export const referenceAjustements = {
|
|||||||
},
|
},
|
||||||
diffLibre: {
|
diffLibre: {
|
||||||
isUsed: (rollData, actor) => rollData.diffLibre != undefined,
|
isUsed: (rollData, actor) => rollData.diffLibre != undefined,
|
||||||
getLabel: (rollData, actor) => rollData.selectedSort?.name ?? rollData.attackerRoll ? 'Imposée' : 'Libre',
|
getLabel: (rollData, actor) => rollData.selectedSort?.name ?? rollData.attackerRoll ?? RdDPossession.isDefensePossession(rollData) ? 'Imposée' : 'Libre',
|
||||||
getValue: (rollData, actor) => rollData.selectedSort
|
getValue: (rollData, actor) => rollData.selectedSort
|
||||||
? RdDItemSort.getDifficulte(rollData.selectedSort, rollData.diffLibre)
|
? RdDItemSort.getDifficulte(rollData.selectedSort, rollData.diffLibre)
|
||||||
: rollData.diffLibre ?? rollData.competence?.system.default_diffLibre ?? 0
|
: rollData.diffLibre ?? rollData.competence?.system.default_diffLibre ?? 0
|
||||||
@@ -51,7 +52,7 @@ export const referenceAjustements = {
|
|||||||
getValue: (rollData, actor) => RdDBonus.find(rollData.surpriseDefenseur).attaque,
|
getValue: (rollData, actor) => RdDBonus.find(rollData.surpriseDefenseur).attaque,
|
||||||
},
|
},
|
||||||
etat: {
|
etat: {
|
||||||
isUsed: (rollData, actor) => !RdDCarac.isIgnoreEtatGeneral(rollData),
|
isUsed: (rollData, actor) => !RollDataAjustements.isIgnoreEtatGeneral(rollData),
|
||||||
getLabel: (rollData, actor) => 'Etat général',
|
getLabel: (rollData, actor) => 'Etat général',
|
||||||
getValue: (rollData, actor) => actor.getEtatGeneral({ ethylisme: rollData.forceAlcool != undefined })
|
getValue: (rollData, actor) => actor.getEtatGeneral({ ethylisme: rollData.forceAlcool != undefined })
|
||||||
},
|
},
|
||||||
@@ -68,8 +69,8 @@ export const referenceAjustements = {
|
|||||||
getValue: (rollData, actor) => -actor.getEncTotal()
|
getValue: (rollData, actor) => -actor.getEncTotal()
|
||||||
},
|
},
|
||||||
surenc: {
|
surenc: {
|
||||||
isVisible: (rollData, actor) => actor.isSurenc(),
|
isVisible: (rollData, actor) => RdDCarac.isActionPhysique(rollData.selectedCarac) && actor.isSurenc(),
|
||||||
isUsed: (rollData, actor) => rollData.use?.surenc,
|
isUsed: (rollData, actor) => rollData.use?.surenc && RdDCarac.isActionPhysique(rollData.selectedCarac),
|
||||||
getLabel: (rollData, actor) => 'Sur-encombrement',
|
getLabel: (rollData, actor) => 'Sur-encombrement',
|
||||||
getValue: (rollData, actor) => actor.computeMalusSurEncombrement()
|
getValue: (rollData, actor) => actor.computeMalusSurEncombrement()
|
||||||
},
|
},
|
||||||
@@ -85,7 +86,7 @@ export const referenceAjustements = {
|
|||||||
getValue: (rollData, actor) => actor.getMoralTotal()
|
getValue: (rollData, actor) => actor.getMoralTotal()
|
||||||
},
|
},
|
||||||
astrologique: {
|
astrologique: {
|
||||||
isUsed: (rollData, actor) => ReglesOptionelles.isUsing("astrologie") && RdDBonus.isAjustementAstrologique(rollData),
|
isUsed: (rollData, actor) => ReglesOptionnelles.isUsing("astrologie") && RdDBonus.isAjustementAstrologique(rollData),
|
||||||
getLabel: (rollData, actor) => 'Astrologique',
|
getLabel: (rollData, actor) => 'Astrologique',
|
||||||
getValue: (rollData, actor) => actor.ajustementAstrologique()
|
getValue: (rollData, actor) => actor.ajustementAstrologique()
|
||||||
},
|
},
|
||||||
@@ -139,6 +140,12 @@ export const referenceAjustements = {
|
|||||||
isUsed: (rollData, actor) => rollData.ethylisme != undefined,
|
isUsed: (rollData, actor) => rollData.ethylisme != undefined,
|
||||||
getLabel: (rollData, actor) => "Ethylisme - " + RdDUtility.getNomEthylisme(rollData.ethylisme),
|
getLabel: (rollData, actor) => "Ethylisme - " + RdDUtility.getNomEthylisme(rollData.ethylisme),
|
||||||
getValue: (rollData, actor) => rollData.ethylisme,
|
getValue: (rollData, actor) => rollData.ethylisme,
|
||||||
|
},
|
||||||
|
tailleempoignade: {
|
||||||
|
isVisible: (rollData, actor) => rollData.isEmpoignade,
|
||||||
|
isUsed: (rollData, actor) => rollData.isEmpoignade,
|
||||||
|
getLabel: (rollData, actor) => "Malus de taille",
|
||||||
|
getValue: (rollData, actor) => rollData.malusTaille,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,7 +164,7 @@ export class RollDataAjustements {
|
|||||||
descr: reference.getDescr && reference.getDescr(rollData, actor)
|
descr: reference.getDescr && reference.getDescr(rollData, actor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rollData.finalLevel = RollDataAjustements.sum(rollData.ajustements);
|
rollData.finalLevel = RollDataAjustements.sum(rollData.ajustements)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -171,4 +178,11 @@ export class RollDataAjustements {
|
|||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static isIgnoreEtatGeneral(rollData) {
|
||||||
|
const selectedCarac = rollData.selectedCarac;
|
||||||
|
return !selectedCarac ||
|
||||||
|
rollData.ethylisme ||
|
||||||
|
RdDCarac.isChance(selectedCarac) ||
|
||||||
|
(RdDCarac.isReve(selectedCarac) && !rollData.competence);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,118 +0,0 @@
|
|||||||
import { SYSTEM_RDD } from "../constants.js";
|
|
||||||
import { Misc } from "../misc.js";
|
|
||||||
|
|
||||||
const listeReglesOptionelles = [
|
|
||||||
{ group: 'Règles de combat', name: 'recul', descr: "Appliquer le recul en cas de particulière en force ou de charge" },
|
|
||||||
{ group: 'Règles de combat', name: 'resistanceArmeParade', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" },
|
|
||||||
{ group: 'Règles de combat', name: 'deteriorationArmure', descr: "Tenir compte de la détérioration des armures" },
|
|
||||||
{ group: 'Règles de combat', name: 'defenseurDesarme', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" },
|
|
||||||
{ group: 'Règles de combat', name: 'categorieParade', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" },
|
|
||||||
{ group: 'Règles de combat', name: 'tripleSignificative', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" },
|
|
||||||
{ group: 'Règles de combat', name: 'degat-minimum-malus-libre-simple', descr: "Le malus libre d'attaque remplace une des valeurs de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, si le plus petit dé est inférieur à 4, alors il devient 4.", default: false },
|
|
||||||
{ group: 'Règles de combat', name: 'degat-minimum-malus-libre', descr: "Le malus libre d'attaque remplace une valeur de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, tout résultat inférieur à 4 devient 4.", default: false },
|
|
||||||
{ group: 'Règles de combat', name: 'degat-ajout-malus-libre', descr: "Le malus libre d'attaque s'ajoute au jet d'encaissement et aux autres bonus. Exemple : la difficulté libre de l'attaquant est de -4. Le jet d'encaissement est effectué à 2d10+4, plus les bonus de situation et d'armes.", default: false },
|
|
||||||
{ group: 'Règles de combat', name: 'validation-encaissement-gr', descr: "Le Gardien des Rêves doit valider les jets d'encaissement et peut les changer.", default: false },
|
|
||||||
|
|
||||||
{ group: 'Règles générales', name: 'astrologie', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels"},
|
|
||||||
{ group: 'Règles générales', name: 'afficher-prix-joueurs', descr: "Afficher le prix de l'équipement des joueurs", uniquementJoueur: true},
|
|
||||||
{ group: 'Règles générales', name: 'appliquer-fatigue', descr: "Appliquer les règles de fatigue"},
|
|
||||||
{ group: 'Règles générales', name: 'afficher-colonnes-reussite', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false },
|
|
||||||
|
|
||||||
{ group: 'Confirmations', name: 'confirmer-combat-sans-cible', descr: "Confirmer avant une attaque sans cible", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-tmr', descr: "Confirmer pour monter dans les TMR", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-refouler', descr: "Confirmer avant de refouler", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-vider', descr: "Confirmer pour vider l'équipement", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-supprimer-lien-acteur', descr: "Confirmer pour détacher un animal/suivant/véhicule", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-supprimer-equipement', descr: "Confirmer la suppression des équipements", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-supprimer-oeuvre', descr: "Confirmer la suppression des oeuvres", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-supprimer-connaissance', descr: "Confirmer la suppression des connaissances", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-supprimer-draconique', descr: "Confirmer la suppression des queues, souffles, têtes", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-supprimer-effet', descr: "Confirmer la suppression des effets", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-supprimer-competence', descr: "Confirmer la suppression des compétences", scope: "client"},
|
|
||||||
{ group: 'Confirmations', name: 'confirmation-supprimer-autres', descr: "Confirmer la suppression des autres types d'Objets", scope: "client"},
|
|
||||||
];
|
|
||||||
|
|
||||||
const uniquementJoueur = listeReglesOptionelles.filter(it => it.uniquementJoueur).map(it=>it.name);
|
|
||||||
|
|
||||||
export class ReglesOptionelles extends FormApplication {
|
|
||||||
static init() {
|
|
||||||
for (const regle of listeReglesOptionelles) {
|
|
||||||
const name = regle.name;
|
|
||||||
const id = ReglesOptionelles._getIdRegle(name);
|
|
||||||
game.settings.register(SYSTEM_RDD, id, { name: id, scope: regle.scope ?? "world", config: false, default: regle.default == undefined ? true : regle.default, type: Boolean });
|
|
||||||
}
|
|
||||||
|
|
||||||
game.settings.registerMenu(SYSTEM_RDD, "rdd-options-regles", {
|
|
||||||
name: "Choisir les règles optionelles",
|
|
||||||
label: "Règles optionelles",
|
|
||||||
hint: "Ouvre la fenêtre de sélection des règles optionelles",
|
|
||||||
icon: "fas fa-bars",
|
|
||||||
type: ReglesOptionelles
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(...args) {
|
|
||||||
super(...args);
|
|
||||||
}
|
|
||||||
|
|
||||||
static _getIdRegle(name) {
|
|
||||||
return `rdd-option-${name}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static get defaultOptions() {
|
|
||||||
const options = super.defaultOptions;
|
|
||||||
mergeObject(options, {
|
|
||||||
id: "regles-optionelles",
|
|
||||||
template: "systems/foundryvtt-reve-de-dragon/templates/settings/regles-optionelles.html",
|
|
||||||
height: 600,
|
|
||||||
width: 450,
|
|
||||||
minimizable: false,
|
|
||||||
closeOnSubmit: true,
|
|
||||||
title: "Règles optionnelles"
|
|
||||||
});
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
|
|
||||||
getData() {
|
|
||||||
let formData = super.getData();
|
|
||||||
const regles = listeReglesOptionelles.filter(it => game.user.isGM || it.scope == "client").map(it => {
|
|
||||||
it = duplicate(it);
|
|
||||||
it.id = ReglesOptionelles._getIdRegle(it.name);
|
|
||||||
it.active = ReglesOptionelles.isSet(it.name);
|
|
||||||
return it;
|
|
||||||
});
|
|
||||||
formData.regles = regles;
|
|
||||||
formData.groups = Misc.classify(regles, it => it.group);
|
|
||||||
return formData;
|
|
||||||
}
|
|
||||||
|
|
||||||
static isUsing(name) {
|
|
||||||
if (game.user.isGM && uniquementJoueur.includes(name)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return ReglesOptionelles.isSet(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static isSet(name) {
|
|
||||||
return game.settings.get(SYSTEM_RDD, ReglesOptionelles._getIdRegle(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
static set(name, value) {
|
|
||||||
return game.settings.set(SYSTEM_RDD, ReglesOptionelles._getIdRegle(name), value ? true: false);
|
|
||||||
}
|
|
||||||
|
|
||||||
activateListeners(html) {
|
|
||||||
html.find(".select-option").click((event) => {
|
|
||||||
if (event.currentTarget.attributes.name) {
|
|
||||||
let id = event.currentTarget.attributes.name.value;
|
|
||||||
let isChecked = event.currentTarget.checked;
|
|
||||||
game.settings.set(SYSTEM_RDD, id, isChecked);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async _updateObject(event, formData) {
|
|
||||||
this.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
128
module/settings/regles-optionnelles.js
Normal file
128
module/settings/regles-optionnelles.js
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
import { SYSTEM_RDD } from "../constants.js";
|
||||||
|
import { Misc } from "../misc.js";
|
||||||
|
|
||||||
|
const listeReglesOptionnelles = [
|
||||||
|
{ group: 'Règles générales', name: 'appliquer-fatigue', descr: "Appliquer les règles de fatigue"},
|
||||||
|
{ group: 'Règles générales', name: 'astrologie', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels"},
|
||||||
|
{ group: 'Récupération', name: 'transformation-stress', descr: "Transformer le stress durant Château Dormant"},
|
||||||
|
{ group: 'Récupération', name: 'recuperation-chance', descr: "Récupérer la chance durant Château Dormant"},
|
||||||
|
{ group: 'Récupération', name: 'recuperation-ethylisme', descr: "Récupérer l'éthylisme"},
|
||||||
|
{ group: 'Récupération', name: 'recuperation-reve', descr: "Récupérer le rêve pendant la nuit (les jets sont toujours faits pour les Rêves de Dragons)"},
|
||||||
|
{ group: 'Récupération', name: 'recuperation-moral', descr: "Le moral revient vers 0 durant Château Dormant"},
|
||||||
|
|
||||||
|
|
||||||
|
{ group: 'Règles de combat', name: 'recul', descr: "Appliquer le recul en cas de particulière en force ou de charge" },
|
||||||
|
{ group: 'Règles de combat', name: 'resistanceArmeParade', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" },
|
||||||
|
{ group: 'Règles de combat', name: 'deteriorationArmure', descr: "Tenir compte de la détérioration des armures" },
|
||||||
|
{ group: 'Règles de combat', name: 'defenseurDesarme', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" },
|
||||||
|
{ group: 'Règles de combat', name: 'categorieParade', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" },
|
||||||
|
{ group: 'Règles de combat', name: 'tripleSignificative', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" },
|
||||||
|
{ group: 'Règles de combat', name: 'validation-encaissement-gr', descr: "Le Gardien des Rêves doit valider les jets d'encaissement et peut les changer.", default: false },
|
||||||
|
|
||||||
|
{ group: 'Automatisation', name: 'chateau-dormant-gardien', descr: "Saisie des heures de sommeil/jets de moral par le gardien des rêves", default: true },
|
||||||
|
|
||||||
|
{ group: 'Affichage', name: 'afficher-colonnes-reussite', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false },
|
||||||
|
{ group: 'Affichage', name: 'afficher-prix-joueurs', descr: "Afficher le prix de l'équipement des joueurs", uniquementJoueur: true},
|
||||||
|
|
||||||
|
{ group: 'Confirmations', name: 'confirmer-combat-sans-cible', descr: "Confirmer avant une attaque sans cible", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-tmr', descr: "Confirmer pour monter dans les TMR", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-refouler', descr: "Confirmer avant de refouler", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-vider', descr: "Confirmer pour vider l'équipement", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-supprimer-lien-acteur', descr: "Confirmer pour détacher un animal/suivant/véhicule", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-supprimer-equipement', descr: "Confirmer la suppression des équipements", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-supprimer-oeuvre', descr: "Confirmer la suppression des oeuvres", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-supprimer-connaissance', descr: "Confirmer la suppression des connaissances", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-supprimer-draconique', descr: "Confirmer la suppression des queues, souffles, têtes", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-supprimer-effet', descr: "Confirmer la suppression des effets", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-supprimer-competence', descr: "Confirmer la suppression des compétences", scope: "client"},
|
||||||
|
{ group: 'Confirmations', name: 'confirmation-supprimer-autres', descr: "Confirmer la suppression des autres types d'Objets", scope: "client"},
|
||||||
|
|
||||||
|
{ group: 'Options alternatives', name: 'degat-minimum-malus-libre-simple', descr: "Le malus libre d'attaque remplace une des valeurs de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, si le plus petit dé est inférieur à 4, alors il devient 4.", default: false },
|
||||||
|
{ group: 'Options alternatives', name: 'degat-minimum-malus-libre', descr: "Le malus libre d'attaque remplace une valeur de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, tout résultat inférieur à 4 devient 4.", default: false },
|
||||||
|
{ group: 'Options alternatives', name: 'degat-ajout-malus-libre', descr: "Le malus libre d'attaque s'ajoute au jet d'encaissement et aux autres bonus. Exemple : la difficulté libre de l'attaquant est de -4. Le jet d'encaissement est effectué à 2d10+4, plus les bonus de situation et d'armes.", default: false },
|
||||||
|
];
|
||||||
|
|
||||||
|
const uniquementJoueur = listeReglesOptionnelles.filter(it => it.uniquementJoueur).map(it=>it.name);
|
||||||
|
|
||||||
|
export class ReglesOptionnelles extends FormApplication {
|
||||||
|
static init() {
|
||||||
|
for (const regle of listeReglesOptionnelles) {
|
||||||
|
const name = regle.name;
|
||||||
|
const id = ReglesOptionnelles._getIdRegle(name);
|
||||||
|
game.settings.register(SYSTEM_RDD, id, { name: id, scope: regle.scope ?? "world", config: false, default: regle.default == undefined ? true : regle.default, type: Boolean });
|
||||||
|
}
|
||||||
|
|
||||||
|
game.settings.registerMenu(SYSTEM_RDD, "rdd-options-regles", {
|
||||||
|
name: "Choisir les règles optionnelles",
|
||||||
|
label: "Règles optionnelles",
|
||||||
|
hint: "Ouvre la fenêtre de sélection des règles optionnelles",
|
||||||
|
icon: "fas fa-bars",
|
||||||
|
type: ReglesOptionnelles
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(...args) {
|
||||||
|
super(...args);
|
||||||
|
}
|
||||||
|
|
||||||
|
static _getIdRegle(name) {
|
||||||
|
return `rdd-option-${name}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
static get defaultOptions() {
|
||||||
|
const options = super.defaultOptions;
|
||||||
|
mergeObject(options, {
|
||||||
|
id: "regles-optionnelles",
|
||||||
|
template: "systems/foundryvtt-reve-de-dragon/templates/settings/regles-optionnelles.html",
|
||||||
|
height: 600,
|
||||||
|
width: 450,
|
||||||
|
minimizable: false,
|
||||||
|
closeOnSubmit: true,
|
||||||
|
title: "Règles optionnelles"
|
||||||
|
});
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
getData() {
|
||||||
|
let formData = super.getData();
|
||||||
|
const regles = listeReglesOptionnelles.filter(it => game.user.isGM || it.scope == "client").map(it => {
|
||||||
|
it = duplicate(it);
|
||||||
|
it.id = ReglesOptionnelles._getIdRegle(it.name);
|
||||||
|
it.active = ReglesOptionnelles.isSet(it.name);
|
||||||
|
return it;
|
||||||
|
});
|
||||||
|
formData.regles = regles;
|
||||||
|
formData.groups = Misc.classify(regles, it => it.group);
|
||||||
|
return formData;
|
||||||
|
}
|
||||||
|
|
||||||
|
static isUsing(name) {
|
||||||
|
if (game.user.isGM && uniquementJoueur.includes(name)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return ReglesOptionnelles.isSet(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static isSet(name) {
|
||||||
|
return game.settings.get(SYSTEM_RDD, ReglesOptionnelles._getIdRegle(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
static set(name, value) {
|
||||||
|
return game.settings.set(SYSTEM_RDD, ReglesOptionnelles._getIdRegle(name), value ? true: false);
|
||||||
|
}
|
||||||
|
|
||||||
|
activateListeners(html) {
|
||||||
|
html.find(".select-option").click((event) => {
|
||||||
|
if (event.currentTarget.attributes.name) {
|
||||||
|
let id = event.currentTarget.attributes.name.value;
|
||||||
|
let isChecked = event.currentTarget.checked;
|
||||||
|
game.settings.set(SYSTEM_RDD, id, isChecked);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async _updateObject(event, formData) {
|
||||||
|
this.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -47,6 +47,7 @@ export class SystemCompendiums extends FormApplication {
|
|||||||
label: "Compendiums système",
|
label: "Compendiums système",
|
||||||
hint: "Ouvre la fenêtre de sélection des compendiums système",
|
hint: "Ouvre la fenêtre de sélection des compendiums système",
|
||||||
icon: "fas fa-bars",
|
icon: "fas fa-bars",
|
||||||
|
restricted: true,
|
||||||
type: SystemCompendiums
|
type: SystemCompendiums
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
206
module/sommeil/app-astrologie.js
Normal file
206
module/sommeil/app-astrologie.js
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "../constants.js";
|
||||||
|
import { Misc } from "../misc.js";
|
||||||
|
import { RdDTimestamp } from "../time/rdd-timestamp.js";
|
||||||
|
|
||||||
|
export const APP_ASTROLOGIE_REFRESH = `${SYSTEM_RDD}-refresh-astrologie`
|
||||||
|
|
||||||
|
export class AppAstrologie extends Application {
|
||||||
|
static async create(actor = undefined, options = {}) {
|
||||||
|
if (actor == undefined && !game.user.isGM) {
|
||||||
|
actor = game.user.character
|
||||||
|
}
|
||||||
|
if (!actor && !game.user.isGM) {
|
||||||
|
console.error("AppAstrologie uniquement accessible pour le MJ, ou depuis un personnage pour un joueur")
|
||||||
|
}
|
||||||
|
new AppAstrologie(actor, options).render(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static get defaultOptions() {
|
||||||
|
return mergeObject(super.defaultOptions, {
|
||||||
|
template: "systems/foundryvtt-reve-de-dragon/templates/sommeil/app-astrologie.hbs",
|
||||||
|
title: "Astrologie",
|
||||||
|
width: 'fit-content',
|
||||||
|
height: 'fit-content',
|
||||||
|
classes: ['calendar-astrologie'],
|
||||||
|
popOut: true,
|
||||||
|
resizable: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(actor, options = {}) {
|
||||||
|
super(options);
|
||||||
|
this.actor = actor;
|
||||||
|
this.hookReference = Hooks.on(APP_ASTROLOGIE_REFRESH, () => this.refreshAstrologie());
|
||||||
|
}
|
||||||
|
|
||||||
|
getData(options) {
|
||||||
|
this.appData = super.getData(options)
|
||||||
|
const calendrier = game.system.rdd.calendrier;
|
||||||
|
mergeObject(this.appData, {
|
||||||
|
isGM: game.user.isGM,
|
||||||
|
isActor: this.actor != undefined,
|
||||||
|
calendrier: calendrier.getTimestamp().toCalendrier(),
|
||||||
|
dates: calendrier.getJoursSuivants(10),
|
||||||
|
heures: RdDTimestamp.definitions(),
|
||||||
|
actorAstrologie: this.getActorAstrologie(),
|
||||||
|
gmAstrologie: this.getGMAstrologie(calendrier),
|
||||||
|
theme: {
|
||||||
|
signeAstral: RdDTimestamp.definition(0),
|
||||||
|
signeNaissance: RdDTimestamp.definition(0)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return this.appData;
|
||||||
|
}
|
||||||
|
|
||||||
|
getActorAstrologie() {
|
||||||
|
if (this.actor) {
|
||||||
|
return {
|
||||||
|
actor: this.actor,
|
||||||
|
nombres: this._organizeNombresAstraux(this.actor.itemTypes['nombreastral']),
|
||||||
|
ajustements: CONFIG.RDD.difficultesLibres,
|
||||||
|
etat: this.actor.getEtatGeneral(),
|
||||||
|
astrologie: this.actor.getCompetence('Astrologie')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
|
||||||
|
_organizeNombresAstraux(nombresAstraux) {
|
||||||
|
let organized = {};
|
||||||
|
nombresAstraux.forEach(na => {
|
||||||
|
if (!organized[na.system.jourindex]) {
|
||||||
|
organized[na.system.jourindex] = {
|
||||||
|
listValues: [],
|
||||||
|
jourlabel: na.system.jourlabel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
organized[na.system.jourindex].listValues.push(na.system.value);
|
||||||
|
})
|
||||||
|
return organized;
|
||||||
|
}
|
||||||
|
|
||||||
|
getGMAstrologie(calendrier) {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
const nbAstral = calendrier.getNombreAstral()
|
||||||
|
const heures = RdDTimestamp.heures();
|
||||||
|
return {
|
||||||
|
ajustementsActors: game.actors.filter(it => it.isPersonnage() && it.hasPlayerOwner)
|
||||||
|
.map(actor => this.getAjustementActor(actor, nbAstral, heures)),
|
||||||
|
nombresAstraux: calendrier.getNombresAstraux().map(na => this.getDetailNombreAstral(na))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
|
||||||
|
getAjustementActor(actor, nbAstral, heures) {
|
||||||
|
const hn = RdDTimestamp.findHeure(actor.getHeureNaissance())?.heure ?? 0;
|
||||||
|
return {
|
||||||
|
actor,
|
||||||
|
ajustements: heures.map(heure => {
|
||||||
|
return { heure, ajustement: RdDTimestamp.ajustementAstrologiqueHeure(hn, nbAstral, heure) };
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getDetailNombreAstral(nombreAstral) {
|
||||||
|
const detail = duplicate(nombreAstral);
|
||||||
|
const timestamp = new RdDTimestamp({ indexDate: nombreAstral.index });
|
||||||
|
detail.date = { mois: timestamp.mois, jour: timestamp.jour + 1 };
|
||||||
|
detail.valeursFausses.forEach(fausse => fausse.actorName = game.actors.get(fausse.actorId).name ?? "Inconnu");
|
||||||
|
return detail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
activateListeners(html) {
|
||||||
|
super.activateListeners(html);
|
||||||
|
this.html = html;
|
||||||
|
this.html.find('select[name="signe-astral"]').change(event => {
|
||||||
|
this.selectNombreAstral(this.html.find('select[name="signe-astral"]').val());
|
||||||
|
})
|
||||||
|
this.html.find('select[name="signe-naissance"]').change(event => {
|
||||||
|
this.selectHeureNaissance(this.html.find('select[name="signe-naissance"]').val());
|
||||||
|
})
|
||||||
|
this.html.find('td.nombre-astral').click(event => {
|
||||||
|
this.selectNombreAstral(Number.parseInt(event.currentTarget.attributes['data-nombre-astral'].value) - 1);
|
||||||
|
})
|
||||||
|
this.html.find('tr.heure-naissance').click(event => {
|
||||||
|
this.selectHeureNaissance(event.currentTarget.attributes['data-heure-naissance'].value);
|
||||||
|
})
|
||||||
|
this.html.find('[name="jet-astrologie"]').click(event => this.requestJetAstrologie());
|
||||||
|
this.html.find('[name="rebuild-nombres-astraux"]').click(event => this.onRebuild());
|
||||||
|
|
||||||
|
this.onCalculThemeAstral();
|
||||||
|
}
|
||||||
|
|
||||||
|
selectHeureNaissance(heureNaissance) {
|
||||||
|
this.appData.theme.signeNaissance = RdDTimestamp.definition(heureNaissance);
|
||||||
|
this.onCalculThemeAstral();
|
||||||
|
}
|
||||||
|
|
||||||
|
selectNombreAstral(nombreAstral) {
|
||||||
|
this.appData.theme.signeAstral = RdDTimestamp.definition(nombreAstral);
|
||||||
|
this.onCalculThemeAstral();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async onRebuild() {
|
||||||
|
game.system.rdd.calendrier.resetNombresAstraux();
|
||||||
|
|
||||||
|
await game.system.rdd.calendrier.rebuildNombresAstraux();
|
||||||
|
}
|
||||||
|
|
||||||
|
onCalculThemeAstral() {
|
||||||
|
const chiffreAstral = this.appData.theme.signeAstral.heure + 1;
|
||||||
|
const heureNaissance = this.appData.theme.signeNaissance.heure + 1;
|
||||||
|
RdDTimestamp.definitions().forEach(dh => {
|
||||||
|
const ajustement = RdDTimestamp.ajustementAstrologiqueHeure(heureNaissance, chiffreAstral, dh.heure + 1);
|
||||||
|
const txtAjustement = ajustement == 0 ? '' : Misc.toSignedString(ajustement);
|
||||||
|
this.html.find(`div.horloge-ajustement.heure-${dh.hh}`).text(txtAjustement)
|
||||||
|
});
|
||||||
|
|
||||||
|
this.html.find(`select[name="signe-astral"]`).val(this.appData.theme.signeAstral.key)
|
||||||
|
this.html.find(`select[name="signe-naissance"]`).val(this.appData.theme.signeNaissance.key)
|
||||||
|
|
||||||
|
const angleAstrologie = ((chiffreAstral + heureNaissance) * 30) % 360 - 45;
|
||||||
|
this.html.find(`div.horloge-roue div.disque-astro img`).css(Misc.cssRotation(angleAstrologie));
|
||||||
|
|
||||||
|
const timestamp = game.system.rdd.calendrier.getTimestamp();
|
||||||
|
|
||||||
|
this.html.find(`div.horloge-roue div.horloge-aiguille-heure img`).css(Misc.cssRotation(timestamp.angleHeure));
|
||||||
|
this.html.find(`div.horloge-roue div.horloge-aiguille-minute img`).css(Misc.cssRotation(timestamp.angleMinute));
|
||||||
|
}
|
||||||
|
|
||||||
|
requestJetAstrologie() {
|
||||||
|
if (!this.appData?.isActor) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let socketData = {
|
||||||
|
id: this.appData.actorAstrologie.actor.id,
|
||||||
|
carac_vue: this.actor.system.carac['vue'].value,
|
||||||
|
etat: this.actor.getEtatGeneral(),
|
||||||
|
astrologie: this.actor.getCompetence('Astrologie'),
|
||||||
|
conditions: this.html.find('[name="diffConditions"]').val(),
|
||||||
|
date: this.html.find('[name="joursAstrologie"]').val(),
|
||||||
|
userId: game.user.id
|
||||||
|
}
|
||||||
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
|
game.system.rdd.calendrier.requestNombreAstral(socketData);
|
||||||
|
} else {
|
||||||
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
|
msg: "msg_request_nombre_astral",
|
||||||
|
data: socketData
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshAstrologie() {
|
||||||
|
this.render(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
async close(options) {
|
||||||
|
Hooks.off(APP_ASTROLOGIE_REFRESH, this.hookReference);
|
||||||
|
this.hookReference = undefined
|
||||||
|
await super.close(options)
|
||||||
|
}
|
||||||
|
}
|
||||||
105
module/sommeil/dialog-chateau-dormant.js
Normal file
105
module/sommeil/dialog-chateau-dormant.js
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
|
||||||
|
export class DialogChateauDormant extends Dialog {
|
||||||
|
|
||||||
|
static async create() {
|
||||||
|
const date = game.system.rdd.calendrier.dateCourante();
|
||||||
|
const actors = game.actors.filter(actor => actor.hasPlayerOwner && actor.isPersonnage());
|
||||||
|
|
||||||
|
const dialogData = {
|
||||||
|
actors: actors,
|
||||||
|
date: date,
|
||||||
|
motifStress: `Nuit du ${date}`,
|
||||||
|
finChateauDormant: game.system.rdd.calendrier.getTimestampFinChateauDormant()
|
||||||
|
};
|
||||||
|
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/sommeil/dialog-chateau-dormant.hbs",
|
||||||
|
dialogData);
|
||||||
|
|
||||||
|
new DialogChateauDormant(dialogData, html)
|
||||||
|
.render(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(dialogData, html) {
|
||||||
|
const options = {
|
||||||
|
classes: ["rdd-dialog-chateau-dormant"],
|
||||||
|
width: 600,
|
||||||
|
height: 'fit-content',
|
||||||
|
'z-index': 99999
|
||||||
|
};
|
||||||
|
const conf = {
|
||||||
|
title: "De Chateau dormant à Vaisseau",
|
||||||
|
content: html,
|
||||||
|
buttons: {
|
||||||
|
chateauDormant: { label: "Passer à Vaisseau!", callback: it => { this.onChateauDormant(); } }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
super(conf, options);
|
||||||
|
this.dialogData = dialogData;
|
||||||
|
}
|
||||||
|
|
||||||
|
activateListeners(html) {
|
||||||
|
super.activateListeners(html);
|
||||||
|
this.html = html;
|
||||||
|
this.html.find('input.sommeil-insomnie').change(event => this.onInsomnie(event));
|
||||||
|
this._activateListenerOnActorMoral(this.html);
|
||||||
|
}
|
||||||
|
|
||||||
|
_activateListenerOnActorMoral(html) {
|
||||||
|
html.find(`span.sommeil-actor-moral a`).click(event => this.onActorMoral(event));
|
||||||
|
}
|
||||||
|
|
||||||
|
onInsomnie(event) {
|
||||||
|
const sommeilInsomnie = this.html.find(event.currentTarget);
|
||||||
|
const isInsomnie = sommeilInsomnie.is(':checked');
|
||||||
|
const sommeilHeures = sommeilInsomnie.parents('.set-sommeil-actor').find('input.sommeil-heures');
|
||||||
|
sommeilHeures.prop('disabled', isInsomnie);
|
||||||
|
if (isInsomnie) {
|
||||||
|
sommeilHeures.val('0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async onActorMoral(event) {
|
||||||
|
const selected = this.html.find(event.currentTarget);
|
||||||
|
const actorRow = selected.parents('.set-sommeil-actor');
|
||||||
|
const actorId = actorRow.data('actor-id');
|
||||||
|
const actor = this.getActor(actorId);
|
||||||
|
actor.system.sommeil.moral = selected.data('moral');
|
||||||
|
const htmlMoral = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/sommeil/sommeil-actor-moral.hbs', actor.system.sommeil)
|
||||||
|
actorRow.find('.sommeil-actor-moral').html(htmlMoral);
|
||||||
|
// re-attach listeners for actor row
|
||||||
|
this._activateListenerOnActorMoral(actorRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
getActor(actorId) {
|
||||||
|
return this.dialogData.actors.find(it => it.id == actorId);
|
||||||
|
}
|
||||||
|
|
||||||
|
async onChateauDormant() {
|
||||||
|
const motifStress = this.html.find("form input[name='motifStress']").val();
|
||||||
|
jQuery.map(
|
||||||
|
this.html.find('li.set-sommeil-actor'),
|
||||||
|
it => this.extractConsigneActor(this.html.find(it), motifStress)
|
||||||
|
).forEach(async consigne => await consigne.actor.prepareChateauDormant(consigne))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extractConsigneActor(actorRow, motifStress) {
|
||||||
|
const actorId = actorRow.data('actor-id');
|
||||||
|
const actor = this.getActor(actorId);
|
||||||
|
const insomnie = actorRow.find('input.sommeil-insomnie').is(':checked');
|
||||||
|
return {
|
||||||
|
actor,
|
||||||
|
ignorer: actorRow.find('input.sommeil-ignorer').is(':checked'),
|
||||||
|
stress: {
|
||||||
|
motif: motifStress,
|
||||||
|
valeur: Number.parseInt(actorRow.find('input.sommeil-stress').val()),
|
||||||
|
},
|
||||||
|
sommeil: {
|
||||||
|
nouveaujour: true,
|
||||||
|
date: this.dialogData.finChateauDormant,
|
||||||
|
insomnie: insomnie,
|
||||||
|
heures: insomnie ? 0 : Number.parseInt(actorRow.find('input.sommeil-heures').val()),
|
||||||
|
moral: actor.system.sommeil.moral ?? 'neutre',
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
87
module/sommeil/dialog-repos.js
Normal file
87
module/sommeil/dialog-repos.js
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
||||||
|
import { EffetsDraconiques } from "../tmr/effets-draconiques.js";
|
||||||
|
|
||||||
|
export class DialogRepos extends Dialog {
|
||||||
|
|
||||||
|
static async create(actor) {
|
||||||
|
if (!actor.isPersonnage()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!ReglesOptionnelles.isUsing("chateau-dormant-gardien") || !actor.hasPlayerOwner) {
|
||||||
|
actor.system.sommeil = {
|
||||||
|
"nouveaujour": true,
|
||||||
|
"insomnie": EffetsDraconiques.isSujetInsomnie(actor),
|
||||||
|
"moral": "neutre",
|
||||||
|
"heures": 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/sommeil/dialog-repos.html", actor);
|
||||||
|
const dialog = new DialogRepos(html, actor);
|
||||||
|
dialog.render(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(html, actor) {
|
||||||
|
let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 400, height: 'fit-content', 'z-index': 99999 };
|
||||||
|
let conf = {
|
||||||
|
title: "Se reposer",
|
||||||
|
content: html,
|
||||||
|
default: "repos",
|
||||||
|
buttons: {
|
||||||
|
"repos": { label: "Se reposer", callback: async it => { this.repos(); } }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
super(conf, options);
|
||||||
|
this.actor = actor;
|
||||||
|
}
|
||||||
|
activateListeners(html) {
|
||||||
|
super.activateListeners(html);
|
||||||
|
this.html = html;
|
||||||
|
this.html.find(`.sommeil-actor-moral a`).click(event => this.onActorMoral(event));
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
|
async repos() {
|
||||||
|
const selection = await this.html.find("[name='repos']:checked").val();
|
||||||
|
switch (selection) {
|
||||||
|
case "sieste": return await this.sieste();
|
||||||
|
case "nuit": return await this.nuit();
|
||||||
|
case "chateau-dormant": return await this.chateauDormant();
|
||||||
|
case "gris-reve": return await this.grisReve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async grisReve() {
|
||||||
|
await this.html.find("[name='nb-jours']").change();
|
||||||
|
const nbJours = Number.parseInt(await this.html.find("[name='nb-jours']").val());
|
||||||
|
await this.actor.grisReve(nbJours);
|
||||||
|
}
|
||||||
|
|
||||||
|
async chateauDormant() {
|
||||||
|
await this.actor.dormirChateauDormant();
|
||||||
|
}
|
||||||
|
|
||||||
|
async nuit() {
|
||||||
|
await this.html.find("[name='sommeil.heures']").change();
|
||||||
|
const val = await this.html.find("[name='sommeil.heures']").val();
|
||||||
|
const sommeilHeures = Number.parseInt(val ?? '0');
|
||||||
|
await this.actor.dormir(sommeilHeures, { chateauDormant: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
async sieste() {
|
||||||
|
await this.html.find("[name='sieste.heures']").change();
|
||||||
|
const siesteHeures = Number.parseInt(await this.html.find("[name='sieste.heures']").val());
|
||||||
|
await this.actor.dormir(siesteHeures);
|
||||||
|
}
|
||||||
|
|
||||||
|
async onActorMoral(event) {
|
||||||
|
const selected = this.html.find(event.currentTarget);
|
||||||
|
const parentDiv = selected.parents().find('.sommeil-actor-moral');
|
||||||
|
const situationMoral = selected.data('moral');
|
||||||
|
await this.actor.setInfoSommeilMoral(situationMoral);
|
||||||
|
const htmlMoral = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/sommeil/sommeil-actor-moral.hbs', {
|
||||||
|
moral: situationMoral
|
||||||
|
});
|
||||||
|
parentDiv.html(htmlMoral);
|
||||||
|
this.html.find(`.sommeil-actor-moral a`).click(event => this.onActorMoral(event));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,7 +15,7 @@ export class DialogStress extends Dialog {
|
|||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-stress.html", dialogData);
|
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/sommeil/dialog-stress.html", dialogData);
|
||||||
new DialogStress(dialogData, html)
|
new DialogStress(dialogData, html)
|
||||||
.render(true);
|
.render(true);
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,7 @@ export class DialogStress extends Dialog {
|
|||||||
|
|
||||||
this.dialogData.actors.filter(it => it.selected)
|
this.dialogData.actors.filter(it => it.selected)
|
||||||
.map(it => game.actors.get(it.id))
|
.map(it => game.actors.get(it.id))
|
||||||
.forEach(actor => actor.distribuerStress(compteur, stress, motif));
|
.forEach(async actor => await actor.distribuerStress(compteur, stress, motif));
|
||||||
}
|
}
|
||||||
|
|
||||||
async onSelectActor(event) {
|
async onSelectActor(event) {
|
||||||
@@ -39,18 +39,18 @@ export class Targets {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static getTarget() {
|
static getTarget(options = { warn: true }) {
|
||||||
const targets = Targets.listTargets();
|
const targets = Targets.listTargets();
|
||||||
switch (targets.length) {
|
switch (targets.length) {
|
||||||
case 1:
|
case 1:
|
||||||
return targets[0];
|
return targets[0];
|
||||||
case 0:
|
case 0:
|
||||||
ui.notifications.warn("Vous devez choisir une cible à attaquer!");
|
if (options.warn) ui.notifications.warn("Vous devez choisir une cible à attaquer!");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ui.notifications.warn("Vous devez choisir une cible (et <strong>une seule</strong>) à attaquer!");
|
if (options.warn) ui.notifications.warn("Vous devez choisir une cible (et <strong>une seule</strong>) à attaquer!");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
34
module/time/auto-adjust-darkness.js
Normal file
34
module/time/auto-adjust-darkness.js
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import { SYSTEM_RDD } from "../constants.js";
|
||||||
|
|
||||||
|
export const AUTO_ADJUST_DARKNESS = "auto-adjust-darkness";
|
||||||
|
|
||||||
|
export class AutoAdjustDarkness {
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
game.settings.register(SYSTEM_RDD, AUTO_ADJUST_DARKNESS, {
|
||||||
|
name: AUTO_ADJUST_DARKNESS,
|
||||||
|
scope: "world",
|
||||||
|
config: false,
|
||||||
|
default: true,
|
||||||
|
type: Boolean
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static async adjust(darkness) {
|
||||||
|
if (AutoAdjustDarkness.isAuto()) {
|
||||||
|
const scene = game.scenes.viewed;
|
||||||
|
if (scene.globalLight && scene.tokenVision) {
|
||||||
|
await scene.update({ darkness });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static isAuto() {
|
||||||
|
return game.settings.get(SYSTEM_RDD, AUTO_ADJUST_DARKNESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static async toggle() {
|
||||||
|
const previous = AutoAdjustDarkness.isAuto();
|
||||||
|
await game.settings.set(SYSTEM_RDD, AUTO_ADJUST_DARKNESS, !previous)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@ import { RdDTimestamp } from "./rdd-timestamp.js";
|
|||||||
* Extend the base Dialog entity by defining a custom window to perform roll.
|
* Extend the base Dialog entity by defining a custom window to perform roll.
|
||||||
* @extends {Dialog}
|
* @extends {Dialog}
|
||||||
*/
|
*/
|
||||||
export class RdDCalendrierEditeur extends Dialog {
|
export class RdDCalendrierEditor extends Dialog {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
constructor(html, calendrier, calendrierData) {
|
constructor(html, calendrier, calendrierData) {
|
||||||
@@ -30,8 +30,8 @@ export class RdDCalendrierEditeur extends Dialog {
|
|||||||
this.html.find("input[name='calendar.annee']").val(this.calendrierData.annee);
|
this.html.find("input[name='calendar.annee']").val(this.calendrierData.annee);
|
||||||
this.html.find("select[name='calendar.mois']").val(this.calendrierData.mois.key);
|
this.html.find("select[name='calendar.mois']").val(this.calendrierData.mois.key);
|
||||||
this.html.find("select[name='calendar.heure']").val(this.calendrierData.heure.key);
|
this.html.find("select[name='calendar.heure']").val(this.calendrierData.heure.key);
|
||||||
RdDCalendrierEditeur.setLimited(this.html.find("input[name='calendar.jourDuMois']"), this.calendrierData.jourDuMois, 1, 28);
|
RdDCalendrierEditor.setLimited(this.html.find("input[name='calendar.jourDuMois']"), this.calendrierData.jourDuMois, 1, 28);
|
||||||
RdDCalendrierEditeur.setLimited(this.html.find("input[name='calendar.minute']"), this.calendrierData.minute, 0, 119);
|
RdDCalendrierEditor.setLimited(this.html.find("input[name='calendar.minute']"), this.calendrierData.minute, 0, 119);
|
||||||
}
|
}
|
||||||
|
|
||||||
static setLimited(input, init, min, max) {
|
static setLimited(input, init, min, max) {
|
||||||
444
module/time/rdd-calendrier.js
Normal file
444
module/time/rdd-calendrier.js
Normal file
@@ -0,0 +1,444 @@
|
|||||||
|
import { MAX_NOMBRE_ASTRAL, RdDTimestamp, WORLD_TIMESTAMP_SETTING } from "./rdd-timestamp.js";
|
||||||
|
import { RdDCalendrierEditor } from "./rdd-calendrier-editor.js";
|
||||||
|
import { RdDResolutionTable } from "../rdd-resolution-table.js";
|
||||||
|
import { RdDUtility } from "../rdd-utility.js";
|
||||||
|
import { RdDDice } from "../rdd-dice.js";
|
||||||
|
import { Misc } from "../misc.js";
|
||||||
|
import { DialogChronologie } from "../dialog-chronologie.js";
|
||||||
|
import { HIDE_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "../constants.js";
|
||||||
|
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
||||||
|
import { DialogChateauDormant } from "../sommeil/dialog-chateau-dormant.js";
|
||||||
|
import { APP_ASTROLOGIE_REFRESH, AppAstrologie } from "../sommeil/app-astrologie.js";
|
||||||
|
import { AutoAdjustDarkness } from "./auto-adjust-darkness.js";
|
||||||
|
|
||||||
|
const TEMPLATE_CALENDRIER = "systems/foundryvtt-reve-de-dragon/templates/time/calendar.hbs";
|
||||||
|
|
||||||
|
const INITIAL_CALENDAR_POS = { top: 200, left: 200, horlogeAnalogique: true };
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
export class RdDCalendrier extends Application {
|
||||||
|
static init() {
|
||||||
|
game.settings.register(SYSTEM_RDD, "liste-nombre-astral", {
|
||||||
|
name: "liste-nombre-astral",
|
||||||
|
scope: "world",
|
||||||
|
config: false,
|
||||||
|
default: [],
|
||||||
|
type: Object
|
||||||
|
});
|
||||||
|
|
||||||
|
game.settings.register(SYSTEM_RDD, "calendrier-pos", {
|
||||||
|
name: "calendrierPos",
|
||||||
|
scope: "client",
|
||||||
|
config: false,
|
||||||
|
default: INITIAL_CALENDAR_POS,
|
||||||
|
type: Object
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static get defaultOptions() {
|
||||||
|
return mergeObject(super.defaultOptions, {
|
||||||
|
title: "Calendrier",
|
||||||
|
template: TEMPLATE_CALENDRIER,
|
||||||
|
classes: ["calendar"],
|
||||||
|
popOut: true,
|
||||||
|
resizable: false,
|
||||||
|
width: 'fit-content',
|
||||||
|
height: 'fit-content',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.timestamp = RdDTimestamp.getWorldTime();
|
||||||
|
if (Misc.isUniqueConnectedGM()) { // Uniquement si GM
|
||||||
|
RdDTimestamp.setWorldTime(this.timestamp);
|
||||||
|
this.nombresAstraux = this.getNombresAstraux();
|
||||||
|
this.rebuildNombresAstraux(); // Ensure always up-to-date
|
||||||
|
}
|
||||||
|
Hooks.on('updateSetting', async (setting, update, options, id) => this.onUpdateSetting(setting, update, options, id));
|
||||||
|
}
|
||||||
|
|
||||||
|
get title() {
|
||||||
|
const calendrier = this.timestamp.toCalendrier();
|
||||||
|
return `${calendrier.heure.label}, ${calendrier.jourDuMois} ${calendrier.mois.label} ${calendrier.annee} (${calendrier.mois.saison})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
savePosition() {
|
||||||
|
game.settings.set(SYSTEM_RDD, "calendrier-pos", {
|
||||||
|
top: this.position.top,
|
||||||
|
left: this.position.left,
|
||||||
|
horlogeAnalogique: this.horlogeAnalogique
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getSavePosition() {
|
||||||
|
const pos = game.settings.get(SYSTEM_RDD, "calendrier-pos");
|
||||||
|
if (pos?.top == undefined) {
|
||||||
|
return INITIAL_CALENDAR_POS;
|
||||||
|
}
|
||||||
|
this.horlogeAnalogique = pos.horlogeAnalogique;
|
||||||
|
return pos
|
||||||
|
}
|
||||||
|
|
||||||
|
setPosition(position) {
|
||||||
|
super.setPosition(position)
|
||||||
|
this.savePosition()
|
||||||
|
}
|
||||||
|
|
||||||
|
display() {
|
||||||
|
AutoAdjustDarkness.adjust(RdDTimestamp.getWorldTime().darkness);
|
||||||
|
const pos = this.getSavePosition()
|
||||||
|
this.render(true, { left: pos.left, top: pos.top });
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
_getHeaderButtons() {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
return [
|
||||||
|
{ class: "calendar-astrologie", icon: "fa-solid fa-moon-over-sun", onclick: ev => this.showAstrologieEditor() },
|
||||||
|
{ class: "calendar-set-datetime", icon: "fa-solid fa-calendar-pen", onclick: ev => this.showCalendarEditor() },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
async close() { }
|
||||||
|
|
||||||
|
async onUpdateSetting(setting, update, options, id) {
|
||||||
|
if (setting.key == SYSTEM_RDD + '.' + WORLD_TIMESTAMP_SETTING) {
|
||||||
|
this.timestamp = RdDTimestamp.getWorldTime();
|
||||||
|
this.positionAiguilles()
|
||||||
|
this.render(false);
|
||||||
|
Hooks.callAll(APP_ASTROLOGIE_REFRESH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getData() {
|
||||||
|
const formData = super.getData();
|
||||||
|
this.fillCalendrierData(formData);
|
||||||
|
return formData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
fillCalendrierData(formData = {}) {
|
||||||
|
mergeObject(formData, this.timestamp.toCalendrier());
|
||||||
|
formData.isGM = game.user.isGM;
|
||||||
|
formData.heures = RdDTimestamp.definitions()
|
||||||
|
formData.horlogeAnalogique = this.horlogeAnalogique;
|
||||||
|
formData.autoDarkness = AutoAdjustDarkness.isAuto()
|
||||||
|
return formData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/** @override */
|
||||||
|
async activateListeners(html) {
|
||||||
|
super.activateListeners(html);
|
||||||
|
this.html = html;
|
||||||
|
this.html.find('.ajout-chronologie').click(ev => DialogChronologie.create());
|
||||||
|
this.html.find('.toggle-horloge-analogique').click(ev => this.onToggleHorlogeAnalogique())
|
||||||
|
this.html.find('.toggle-auto-darkness').click(ev => this.onToggleAutoDarkness())
|
||||||
|
this.html.find('.calendar-btn').click(ev => this.onCalendarButton(ev));
|
||||||
|
this.html.find('.horloge-roue .horloge-heure').click(event => {
|
||||||
|
const h = this.html.find(event.currentTarget)?.data('heure');
|
||||||
|
this.positionnerHeure(Number(h));
|
||||||
|
})
|
||||||
|
this.html.find('.calendar-set-datetime').click(ev => {
|
||||||
|
ev.preventDefault();
|
||||||
|
this.showCalendarEditor();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.html.find('.calendar-astrologie').click(ev => {
|
||||||
|
ev.preventDefault();
|
||||||
|
this.showAstrologieEditor();
|
||||||
|
});
|
||||||
|
this.positionAiguilles()
|
||||||
|
}
|
||||||
|
|
||||||
|
positionAiguilles() {
|
||||||
|
const timestamp = this.getTimestamp();
|
||||||
|
this.html.find(`div.horloge-roue div.horloge-aiguille-heure img`).css(Misc.cssRotation(timestamp.angleHeure));
|
||||||
|
this.html.find(`div.horloge-roue div.horloge-aiguille-minute img`).css(Misc.cssRotation(timestamp.angleMinute));
|
||||||
|
}
|
||||||
|
|
||||||
|
onToggleHorlogeAnalogique() {
|
||||||
|
this.horlogeAnalogique = !this.horlogeAnalogique;
|
||||||
|
this.savePosition()
|
||||||
|
this.display()
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getNombresAstraux() {
|
||||||
|
return game.settings.get(SYSTEM_RDD, "liste-nombre-astral") ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
dateCourante() {
|
||||||
|
return this.timestamp.formatDate();
|
||||||
|
}
|
||||||
|
|
||||||
|
dateReel() {
|
||||||
|
return new Date().toLocaleString("sv-SE", {
|
||||||
|
year: "numeric",
|
||||||
|
month: "2-digit",
|
||||||
|
day: "2-digit",
|
||||||
|
hour: "2-digit",
|
||||||
|
minute: "2-digit"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
isAfterIndexDate(indexDate) {
|
||||||
|
// TODO: standardize
|
||||||
|
return indexDate < this.timestamp.indexDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
heureCourante() { return RdDTimestamp.definition(this.timestamp.heure); }
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getCurrentMinute() { return this.timestamp.indexMinute; }
|
||||||
|
|
||||||
|
getTimestamp() {
|
||||||
|
return this.timestamp;
|
||||||
|
}
|
||||||
|
getTimestampFinChateauDormant(nbJours = 0) {
|
||||||
|
return this.timestamp.nouveauJour().addJours(nbJours);
|
||||||
|
}
|
||||||
|
|
||||||
|
getTimestampFinHeure(nbHeures = 0) {
|
||||||
|
return this.timestamp.nouvelleHeure().addHeures(nbHeures);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getIndexFromDate(jour, mois) {
|
||||||
|
const addYear = mois < this.timestamp.mois || (mois == this.timestamp.mois && jour < this.timestamp.jour)
|
||||||
|
const time = RdDTimestamp.timestamp(this.timestamp.annee + (addYear ? 1 : 0), mois, jour);
|
||||||
|
return time.indexDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getJoursSuivants(count) {
|
||||||
|
return Misc.intArray(this.timestamp.indexDate, this.timestamp.indexDate + count)
|
||||||
|
.map(i => { return { label: RdDTimestamp.formatIndexDate(i), index: i } })
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async ajouterNombreAstral(indexDate) {
|
||||||
|
const nombreAstral = await RdDDice.rollTotal("1dh", { showDice: HIDE_DICE, rollMode: "selfroll" });
|
||||||
|
return {
|
||||||
|
nombreAstral: nombreAstral,
|
||||||
|
valeursFausses: [],
|
||||||
|
index: indexDate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
resetNombresAstraux() {
|
||||||
|
this.nombresAstraux = [];
|
||||||
|
game.settings.set(SYSTEM_RDD, "liste-nombre-astral", []);
|
||||||
|
|
||||||
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
|
msg: "msg_reset_nombre_astral",
|
||||||
|
data: {}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {*} indexDate la date pour laquelle obtenir le nombre astral. Si undefined, on prend la date du jour
|
||||||
|
* @returns le nombre astral pour la date, ou pour la date du jour si la date n'est pas fournie.
|
||||||
|
* Si aucun nombre astral n'est trouvé, retourne 0 (cas où l'on demanderait un nombre astral en dehors des 12 jours courant et à venir)
|
||||||
|
*/
|
||||||
|
getNombreAstral(indexDate = undefined) {
|
||||||
|
if (indexDate == undefined) {
|
||||||
|
indexDate = this.timestamp.indexDate;
|
||||||
|
}
|
||||||
|
this.nombresAstraux = this.getNombresAstraux();
|
||||||
|
let astralData = this.nombresAstraux.find((nombreAstral, i) => nombreAstral.index == indexDate);
|
||||||
|
return astralData?.nombreAstral ?? 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async rebuildNombresAstraux() {
|
||||||
|
if (Misc.isUniqueConnectedGM()) {
|
||||||
|
let newList = [];
|
||||||
|
for (let i = 0; i < MAX_NOMBRE_ASTRAL; i++) {
|
||||||
|
let dayIndex = this.timestamp.indexDate + i;
|
||||||
|
let na = this.nombresAstraux.find(n => n.index == dayIndex);
|
||||||
|
if (na) {
|
||||||
|
newList[i] = na;
|
||||||
|
} else {
|
||||||
|
newList[i] = await this.ajouterNombreAstral(dayIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.nombresAstraux = newList;
|
||||||
|
game.settings.set(SYSTEM_RDD, "liste-nombre-astral", newList);
|
||||||
|
game.actors.filter(it => it.isPersonnage()).forEach(actor => actor.supprimerAnciensNombresAstraux());
|
||||||
|
this.notifyChangeNombresAstraux();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
notifyChangeNombresAstraux() {
|
||||||
|
Hooks.callAll(APP_ASTROLOGIE_REFRESH);
|
||||||
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
|
msg: "msg_refresh_nombre_astral",
|
||||||
|
data: {}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async setNewTimestamp(newTimestamp) {
|
||||||
|
const oldTimestamp = this.timestamp;
|
||||||
|
await Promise.all(game.actors.map(async actor => await actor.onTimeChanging(oldTimestamp, newTimestamp)));
|
||||||
|
RdDTimestamp.setWorldTime(newTimestamp);
|
||||||
|
if (oldTimestamp.indexDate + 1 == newTimestamp.indexDate && ReglesOptionnelles.isUsing("chateau-dormant-gardien")) {
|
||||||
|
await DialogChateauDormant.create();
|
||||||
|
}
|
||||||
|
this.timestamp = newTimestamp;
|
||||||
|
await this.rebuildNombresAstraux();
|
||||||
|
this.positionAiguilles()
|
||||||
|
this.display();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async onCalendarButton(ev) {
|
||||||
|
ev.preventDefault();
|
||||||
|
const calendarAvance = ev.currentTarget.attributes['data-calendar-avance'];
|
||||||
|
const calendarSet = ev.currentTarget.attributes['data-calendar-set'];
|
||||||
|
if (calendarAvance) {
|
||||||
|
await this.incrementTime(Number(calendarAvance.value));
|
||||||
|
}
|
||||||
|
else if (calendarSet) {
|
||||||
|
this.positionnerHeure(Number(calendarSet.value));
|
||||||
|
}
|
||||||
|
this.positionAiguilles()
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async incrementTime(minutes = 0) {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
await this.setNewTimestamp(this.timestamp.addMinutes(minutes));
|
||||||
|
Hooks.callAll(APP_ASTROLOGIE_REFRESH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async incrementerJour() {
|
||||||
|
await this.setNewTimestamp(this.timestamp.nouveauJour());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async positionnerHeure(heure) {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
const indexDate = this.timestamp.indexDate;
|
||||||
|
const addDay = this.timestamp.heure < heure ? 0 : 1;
|
||||||
|
const newTimestamp = new RdDTimestamp({ indexDate: indexDate + addDay }).addHeures(heure);
|
||||||
|
await this.setNewTimestamp(newTimestamp)
|
||||||
|
Hooks.callAll(APP_ASTROLOGIE_REFRESH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getLectureAstrologieDifficulte(dateIndex) {
|
||||||
|
let indexNow = this.timestamp.indexDate;
|
||||||
|
let diffDay = dateIndex - indexNow;
|
||||||
|
return - Math.floor(diffDay / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async requestNombreAstral(request) {
|
||||||
|
const actor = game.actors.get(request.id);
|
||||||
|
if (Misc.isUniqueConnectedGM()) { // Only once
|
||||||
|
console.log(request);
|
||||||
|
let jourDiff = this.getLectureAstrologieDifficulte(request.date);
|
||||||
|
let niveau = Number(request.astrologie.system.niveau) + Number(request.conditions) + Number(jourDiff) + Number(request.etat);
|
||||||
|
let rollData = {
|
||||||
|
caracValue: request.carac_vue,
|
||||||
|
finalLevel: niveau,
|
||||||
|
showDice: HIDE_DICE,
|
||||||
|
rollMode: "blindroll"
|
||||||
|
};
|
||||||
|
await RdDResolutionTable.rollData(rollData);
|
||||||
|
request.rolled = rollData.rolled;
|
||||||
|
request.isValid = request.rolled.isSuccess;
|
||||||
|
request.nbAstral = this.getNombreAstral(request.date);
|
||||||
|
|
||||||
|
if (request.rolled.isSuccess) {
|
||||||
|
if (request.rolled.isPart) {
|
||||||
|
// Gestion expérience (si existante)
|
||||||
|
request.competence = actor.getCompetence('Astrologie')
|
||||||
|
request.selectedCarac = actor.system.carac["vue"];
|
||||||
|
actor.appliquerAjoutExperience(request, 'hide');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
request.nbAstral = await RdDDice.rollTotal("1dhr" + request.nbAstral, {
|
||||||
|
rollMode: "selfroll", showDice: HIDE_DICE
|
||||||
|
});
|
||||||
|
// Mise à jour des nombres astraux du joueur
|
||||||
|
this.addNbAstralIncorect(request.id, request.date, request.nbAstral);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Misc.getActiveUser(request.userId)?.isGM) {
|
||||||
|
RdDUtility.responseNombreAstral(request);
|
||||||
|
} else {
|
||||||
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
|
msg: "msg_response_nombre_astral",
|
||||||
|
data: request
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addNbAstralIncorect(actorId, date, nbAstral) {
|
||||||
|
const astralData = this.nombresAstraux.find((nombreAstral, i) => nombreAstral.index == date);
|
||||||
|
astralData.valeursFausses.push({ actorId: actorId, nombreAstral: nbAstral });
|
||||||
|
game.settings.set(SYSTEM_RDD, "liste-nombre-astral", this.nombresAstraux);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getAjustementAstrologique(heureNaissance, name = undefined) {
|
||||||
|
const defHeure = RdDTimestamp.findHeure(heureNaissance);
|
||||||
|
if (defHeure) {
|
||||||
|
return RdDTimestamp.ajustementAstrologiqueHeure(defHeure.heure, this.getNombreAstral(), this.timestamp.heure);
|
||||||
|
}
|
||||||
|
else if (name) {
|
||||||
|
ui.notifications.warn(name + " n'a pas d'heure de naissance, ou elle est incorrecte : " + heureNaissance);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ui.notifications.warn(heureNaissance + " ne correspond pas à une heure de naissance");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async saveEditeur(calendrierData) {
|
||||||
|
const newTimestamp = RdDTimestamp.timestamp(
|
||||||
|
Number.parseInt(calendrierData.annee),
|
||||||
|
calendrierData.mois.heure,
|
||||||
|
Number.parseInt(calendrierData.jourMois),
|
||||||
|
calendrierData.heure.heure,
|
||||||
|
Number.parseInt(calendrierData.minutes)
|
||||||
|
);
|
||||||
|
await this.setNewTimestamp(newTimestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async showCalendarEditor() {
|
||||||
|
const calendrierData = this.fillCalendrierData();
|
||||||
|
if (this.editeur == undefined) {
|
||||||
|
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/time/calendar-editor.hbs', calendrierData);
|
||||||
|
this.editeur = new RdDCalendrierEditor(html, this, calendrierData)
|
||||||
|
}
|
||||||
|
this.editeur.updateData(calendrierData);
|
||||||
|
this.editeur.render(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async showAstrologieEditor() {
|
||||||
|
await AppAstrologie.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
async onToggleAutoDarkness() {
|
||||||
|
await AutoAdjustDarkness.toggle()
|
||||||
|
this.display()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,31 +1,33 @@
|
|||||||
import { SHOW_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
import { SHOW_DICE, SYSTEM_RDD } from "../constants.js";
|
||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "../grammar.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "../misc.js";
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
import { RdDDice } from "../rdd-dice.js";
|
||||||
|
import { AutoAdjustDarkness } from "./auto-adjust-darkness.js";
|
||||||
|
|
||||||
export const WORLD_TIMESTAMP_SETTING = "calendrier";
|
export const WORLD_TIMESTAMP_SETTING = "calendrier";
|
||||||
|
|
||||||
const RDD_MOIS_PAR_AN = 12;
|
|
||||||
const RDD_JOURS_PAR_MOIS = 28;
|
|
||||||
const RDD_JOURS_PAR_AN = 336; //RDD_JOURS_PAR_MOIS * RDD_MOIS_PAR_AN;
|
const RDD_JOURS_PAR_AN = 336; //RDD_JOURS_PAR_MOIS * RDD_MOIS_PAR_AN;
|
||||||
const RDD_HEURES_PAR_JOUR = 12;
|
const RDD_MOIS_PAR_AN = 12;
|
||||||
const RDD_MINUTES_PAR_HEURES = 120;
|
export const RDD_JOURS_PAR_MOIS = 28;
|
||||||
const RDD_MINUTES_PAR_JOUR = 1440; //RDD_HEURES_PAR_JOUR * RDD_MINUTES_PAR_HEURES;
|
export const RDD_HEURES_PAR_JOUR = 12;
|
||||||
|
export const MAX_NOMBRE_ASTRAL = 12;
|
||||||
|
export const RDD_MINUTES_PAR_HEURES = 120;
|
||||||
|
export const RDD_MINUTES_PAR_JOUR = 1440; //RDD_HEURES_PAR_JOUR * RDD_MINUTES_PAR_HEURES;
|
||||||
const ROUNDS_PAR_MINUTE = 10;
|
const ROUNDS_PAR_MINUTE = 10;
|
||||||
|
|
||||||
const DEFINITION_HEURES = [
|
const DEFINITION_HEURES = [
|
||||||
{ key: "vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "Printemps" },
|
{ key: "vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "Printemps" , darkness: 0.7},
|
||||||
{ key: "sirene", label: "Sirène", lettreFont: 'i', saison: "Printemps" },
|
{ key: "sirene", label: "Sirène", lettreFont: 'i', saison: "Printemps" , darkness: 0.4},
|
||||||
{ key: "faucon", label: "Faucon", lettreFont: 'f', saison: "Printemps" },
|
{ key: "faucon", label: "Faucon", lettreFont: 'f', saison: "Printemps" , darkness: 0},
|
||||||
{ key: "couronne", label: "Couronne", lettreFont: '', saison: "Eté" },
|
{ key: "couronne", label: "Couronne", lettreFont: '', saison: "Eté" , darkness: 0},
|
||||||
{ key: "dragon", label: "Dragon", lettreFont: 'd', saison: "Eté" },
|
{ key: "dragon", label: "Dragon", lettreFont: 'd', saison: "Eté", darkness: 0 },
|
||||||
{ key: "epees", label: "Epées", lettreFont: 'e', saison: "Eté" },
|
{ key: "epees", label: "Epées", lettreFont: 'e', saison: "Eté", darkness: 0},
|
||||||
{ key: "lyre", label: "Lyre", lettreFont: 'l', saison: "Automne" },
|
{ key: "lyre", label: "Lyre", lettreFont: 'l', saison: "Automne", darkness: 0.4 },
|
||||||
{ key: "serpent", label: "Serpent", lettreFont: 's', saison: "Automne" },
|
{ key: "serpent", label: "Serpent", lettreFont: 's', saison: "Automne", darkness: 0.7 },
|
||||||
{ key: "poissonacrobate", label: "Poisson Acrobate", lettreFont: 'p', saison: "Automne" },
|
{ key: "poissonacrobate", label: "Poisson Acrobate", lettreFont: 'p', saison: "Automne", darkness: 1 },
|
||||||
{ key: "araignee", label: "Araignée", lettreFont: 'a', saison: "Hiver" },
|
{ key: "araignee", label: "Araignée", lettreFont: 'a', saison: "Hiver", darkness: 1 },
|
||||||
{ key: "roseau", label: "Roseau", lettreFont: 'r', saison: "Hiver" },
|
{ key: "roseau", label: "Roseau", lettreFont: 'r', saison: "Hiver", darkness: 1 },
|
||||||
{ key: "chateaudormant", label: "Château Dormant", lettreFont: 'c', saison: "Hiver" },
|
{ key: "chateaudormant", label: "Château Dormant", lettreFont: 'c', saison: "Hiver", darkness: 1 },
|
||||||
]
|
]
|
||||||
|
|
||||||
const FORMULES_DUREE = [
|
const FORMULES_DUREE = [
|
||||||
@@ -48,10 +50,6 @@ const FORMULES_PERIODE = [
|
|||||||
|
|
||||||
export class RdDTimestamp {
|
export class RdDTimestamp {
|
||||||
|
|
||||||
static iconeHeure(heure) {
|
|
||||||
return `systems/foundryvtt-reve-de-dragon/icons/heures/hd${heure < 9 ? '0' : ''}${heure + 1}.svg`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static init() {
|
static init() {
|
||||||
game.settings.register(SYSTEM_RDD, WORLD_TIMESTAMP_SETTING, {
|
game.settings.register(SYSTEM_RDD, WORLD_TIMESTAMP_SETTING, {
|
||||||
name: WORLD_TIMESTAMP_SETTING,
|
name: WORLD_TIMESTAMP_SETTING,
|
||||||
@@ -61,17 +59,43 @@ export class RdDTimestamp {
|
|||||||
type: Object
|
type: Object
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
for (let i = 0; i < DEFINITION_HEURES.length; i++) {
|
for (let i = 0; i < DEFINITION_HEURES.length; i++) {
|
||||||
DEFINITION_HEURES[i].heure = i;
|
DEFINITION_HEURES[i].heure = i;
|
||||||
|
DEFINITION_HEURES[i].hh = RdDTimestamp.hh(i);
|
||||||
DEFINITION_HEURES[i].icon = RdDTimestamp.iconeHeure(i);
|
DEFINITION_HEURES[i].icon = RdDTimestamp.iconeHeure(i);
|
||||||
DEFINITION_HEURES[i].webp = DEFINITION_HEURES[i].icon.replace(".svg", ".webp");
|
DEFINITION_HEURES[i].webp = DEFINITION_HEURES[i].icon.replace(".svg", ".webp");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static hh(heure) {
|
||||||
|
return heure < 9 ? `0${heure + 1}` : `${heure + 1}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
static iconeHeure(heure) {
|
||||||
|
return `systems/foundryvtt-reve-de-dragon/icons/heures/hd${RdDTimestamp.hh(heure)}.svg`;
|
||||||
|
}
|
||||||
|
|
||||||
|
static definitions() {
|
||||||
|
return DEFINITION_HEURES
|
||||||
|
}
|
||||||
|
|
||||||
|
static formulesDuree() {
|
||||||
|
return FORMULES_DUREE
|
||||||
|
}
|
||||||
|
|
||||||
|
static formulesPeriode() {
|
||||||
|
return FORMULES_PERIODE
|
||||||
|
}
|
||||||
|
|
||||||
|
static heures() {
|
||||||
|
return Misc.intArray(0, RDD_HEURES_PAR_JOUR)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param signe
|
* @param signe
|
||||||
* @returns L'entrée de DEFINITION_HEURES correspondant au signe
|
* @returns L'entrée de DEFINITION_HEURES correspondant au signe
|
||||||
*/
|
*/
|
||||||
static definition(signe) {
|
static definition(signe) {
|
||||||
if (signe == undefined) {
|
if (signe == undefined) {
|
||||||
signe = 0;
|
signe = 0;
|
||||||
@@ -86,20 +110,26 @@ export class RdDTimestamp {
|
|||||||
return definition
|
return definition
|
||||||
}
|
}
|
||||||
|
|
||||||
static formulesDuree() {
|
|
||||||
return FORMULES_DUREE
|
|
||||||
}
|
|
||||||
|
|
||||||
static formulesPeriode() {
|
|
||||||
return FORMULES_PERIODE
|
|
||||||
}
|
|
||||||
|
|
||||||
static imgSigneHeure(heure) {
|
static imgSigneHeure(heure) {
|
||||||
return RdDTimestamp.imgSigne(RdDTimestamp.definition(heure));
|
return RdDTimestamp.imgSigne(RdDTimestamp.definition(heure));
|
||||||
}
|
}
|
||||||
|
|
||||||
static imgSigne(signe) {
|
static imgSigne(signe) {
|
||||||
return signe == undefined ? '' : `<img class="img-signe-heure" src="${signe.webp}" alt="${signe.label}"/>`
|
return signe == undefined ? '' : `<img class="img-signe-heure" src="${signe.webp}" alt="${signe.label}" title="${signe.label}"/>`
|
||||||
|
}
|
||||||
|
|
||||||
|
static ajustementAstrologiqueHeure(hn, nbAstral, heure) {
|
||||||
|
let ecart = (hn + nbAstral - heure) % RDD_HEURES_PAR_JOUR;
|
||||||
|
if (ecart < 0) {
|
||||||
|
ecart = (ecart + RDD_HEURES_PAR_JOUR) % RDD_HEURES_PAR_JOUR;
|
||||||
|
}
|
||||||
|
switch (ecart) {
|
||||||
|
case 0: return 4;
|
||||||
|
case 4: case 8: return 2;
|
||||||
|
case 6: return -4;
|
||||||
|
case 3: case 9: return -2;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static handleTimestampEditor(html, path, consumeTimestamp = async (path, timestamp) => { }) {
|
static handleTimestampEditor(html, path, consumeTimestamp = async (path, timestamp) => { }) {
|
||||||
@@ -127,7 +157,9 @@ export class RdDTimestamp {
|
|||||||
fields.minute.change(async (event) => await onChangeTimestamp(fields, path));
|
fields.minute.change(async (event) => await onChangeTimestamp(fields, path));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static defHeure(heure) {
|
||||||
|
return DEFINITION_HEURES.find(it => (it.heure) == heure % RDD_HEURES_PAR_JOUR);
|
||||||
|
}
|
||||||
static findHeure(heure) {
|
static findHeure(heure) {
|
||||||
heure = Grammar.toLowerCaseNoAccentNoSpace(heure);
|
heure = Grammar.toLowerCaseNoAccentNoSpace(heure);
|
||||||
let parHeureOuLabel = DEFINITION_HEURES.filter(it => (it.heure) == parseInt(heure) % RDD_HEURES_PAR_JOUR || Grammar.toLowerCaseNoAccentNoSpace(it.label) == heure);
|
let parHeureOuLabel = DEFINITION_HEURES.filter(it => (it.heure) == parseInt(heure) % RDD_HEURES_PAR_JOUR || Grammar.toLowerCaseNoAccentNoSpace(it.label) == heure);
|
||||||
@@ -199,6 +231,21 @@ export class RdDTimestamp {
|
|||||||
this.indexMinute = indexMinute ?? 0
|
this.indexMinute = indexMinute ?? 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get annee() { return Math.floor(this.indexDate / RDD_JOURS_PAR_AN) }
|
||||||
|
get mois() { return Math.floor((this.indexDate % RDD_JOURS_PAR_AN) / RDD_JOURS_PAR_MOIS) }
|
||||||
|
get jour() { return (this.indexDate % RDD_JOURS_PAR_AN) % RDD_JOURS_PAR_MOIS }
|
||||||
|
get heure() { return Math.floor(this.indexMinute / RDD_MINUTES_PAR_HEURES) }
|
||||||
|
get minute() { return this.indexMinute % RDD_MINUTES_PAR_HEURES }
|
||||||
|
get round() { return ROUNDS_PAR_MINUTE * (this.indexMinute - Math.floor(this.indexMinute)) }
|
||||||
|
get angleHeure() { return this.indexMinute / RDD_MINUTES_PAR_JOUR * 360 - 45 }
|
||||||
|
get angleMinute() { return this.indexMinute / RDD_MINUTES_PAR_HEURES * 360 + 45 }
|
||||||
|
|
||||||
|
get darkness() {
|
||||||
|
const darknessDebut = RdDTimestamp.definition(this.heure).darkness *100
|
||||||
|
const darknessFin = RdDTimestamp.definition(this.heure + 1).darkness *100
|
||||||
|
const darknessMinute = Math.round((darknessFin - darknessDebut) * this.minute / RDD_MINUTES_PAR_HEURES);
|
||||||
|
return (darknessDebut + darknessMinute)/100
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convertit le timestamp en une structure avec les informations utiles
|
* Convertit le timestamp en une structure avec les informations utiles
|
||||||
@@ -216,13 +263,6 @@ export class RdDTimestamp {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
get annee() { return Math.floor(this.indexDate / RDD_JOURS_PAR_AN) }
|
|
||||||
get mois() { return Math.floor((this.indexDate % RDD_JOURS_PAR_AN) / RDD_JOURS_PAR_MOIS) }
|
|
||||||
get jour() { return (this.indexDate % RDD_JOURS_PAR_AN) % RDD_JOURS_PAR_MOIS }
|
|
||||||
get heure() { return Math.floor(this.indexMinute / RDD_MINUTES_PAR_HEURES) }
|
|
||||||
get minute() { return this.indexMinute % RDD_MINUTES_PAR_HEURES }
|
|
||||||
get round() { return ROUNDS_PAR_MINUTE * (this.indexMinute - Math.floor(this.indexMinute)) }
|
|
||||||
|
|
||||||
formatDate() {
|
formatDate() {
|
||||||
const jour = this.jour + 1;
|
const jour = this.jour + 1;
|
||||||
const mois = RdDTimestamp.definition(this.mois).label;
|
const mois = RdDTimestamp.definition(this.mois).label;
|
||||||
@@ -230,6 +270,10 @@ export class RdDTimestamp {
|
|||||||
return `${jour} ${mois}` + (annee ? ' ' + annee : '');
|
return `${jour} ${mois}` + (annee ? ' ' + annee : '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
formatDateHeure() {
|
||||||
|
return `${RdDTimestamp.definition(this.heure).label}, ${this.formatDate()}`;
|
||||||
|
}
|
||||||
|
|
||||||
nouveauJour() { return new RdDTimestamp({ indexDate: this.indexDate + 1, indexMinute: 0 }) }
|
nouveauJour() { return new RdDTimestamp({ indexDate: this.indexDate + 1, indexMinute: 0 }) }
|
||||||
|
|
||||||
nouvelleHeure() {
|
nouvelleHeure() {
|
||||||
@@ -189,30 +189,6 @@ export class FenetreRechercheTirage extends Application {
|
|||||||
const row = await CompendiumTableHelpers.getRandom(table, 'Item')
|
const row = await CompendiumTableHelpers.getRandom(table, 'Item')
|
||||||
await CompendiumTableHelpers.tableRowToChatMessage(row, 'Item');
|
await CompendiumTableHelpers.tableRowToChatMessage(row, 'Item');
|
||||||
})
|
})
|
||||||
|
|
||||||
// this.html.find('.recherche')
|
|
||||||
// .each((index, field) => {
|
|
||||||
// if (this.options.recherche) {
|
|
||||||
// field.focus();
|
|
||||||
// field.setSelectionRange(this.options.recherche.start, this.options.recherche.end);
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// .keyup(async event => {
|
|
||||||
// const nouvelleRecherche = this._optionRecherche(event.currentTarget);
|
|
||||||
// if (this.options.recherche?.text != nouvelleRecherche?.text) {
|
|
||||||
// this.options.recherche = nouvelleRecherche;
|
|
||||||
// if (this.timerRecherche) {
|
|
||||||
// clearTimeout(this.timerRecherche);
|
|
||||||
// }
|
|
||||||
// this.timerRecherche = setTimeout(() => {
|
|
||||||
// this.timerRecherche = undefined;
|
|
||||||
// this.render(true);
|
|
||||||
// }, 500);
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// .change(async event =>
|
|
||||||
// this.options.recherche = this._optionRecherche(event.currentTarget)
|
|
||||||
// );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
showFilterGroup(groupDiv, show) {
|
showFilterGroup(groupDiv, show) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
import { RdDDice } from "./rdd-dice.js";
|
import { RdDDice } from "./rdd-dice.js";
|
||||||
|
import { tmrConstants } from "./tmr-constants.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const TMRMapping = {
|
const TMRMapping = {
|
||||||
@@ -163,7 +164,7 @@ const TMRMapping = {
|
|||||||
C12: { type: "lac", label: "Lac de Fricassa" },
|
C12: { type: "lac", label: "Lac de Fricassa" },
|
||||||
D12: { type: "collines", label: "Collines d’Huaï" },
|
D12: { type: "collines", label: "Collines d’Huaï" },
|
||||||
E12: { type: "monts", label: "Monts Ajourés" },
|
E12: { type: "monts", label: "Monts Ajourés" },
|
||||||
F12: { type: "necropole", label: "Nécropole de Troat" },
|
F12: { type: "necropole", label: "Nécropole de Throat" },
|
||||||
G12: { type: "plaines", label: "Plaines de Lufmil" },
|
G12: { type: "plaines", label: "Plaines de Lufmil" },
|
||||||
H12: { type: "collines", label: "Collines de Tooth" },
|
H12: { type: "collines", label: "Collines de Tooth" },
|
||||||
I12: { type: "gouffre", label: "Gouffre Abimeux" },
|
I12: { type: "gouffre", label: "Gouffre Abimeux" },
|
||||||
@@ -199,7 +200,7 @@ const TMRMapping = {
|
|||||||
K14: { type: "necropole", label: "Nécropole d’Antinéar" },
|
K14: { type: "necropole", label: "Nécropole d’Antinéar" },
|
||||||
L14: { type: "plaines", label: "Plaines de Jislith" },
|
L14: { type: "plaines", label: "Plaines de Jislith" },
|
||||||
M14: { type: "desolation", label: "Désolation d’Après" },
|
M14: { type: "desolation", label: "Désolation d’Après" },
|
||||||
|
|
||||||
A15: { type: "cite", label: "Cité de Mielh" },
|
A15: { type: "cite", label: "Cité de Mielh" },
|
||||||
C15: { type: "plaines", label: "Plaines de Toué" },
|
C15: { type: "plaines", label: "Plaines de Toué" },
|
||||||
E15: { type: "foret", label: "Forêt des Furies" },
|
E15: { type: "foret", label: "Forêt des Furies" },
|
||||||
@@ -226,9 +227,6 @@ export const TMRType = {
|
|||||||
desolation: { name: "désolation", genre: "f" }
|
desolation: { name: "désolation", genre: "f" }
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
const caseSpecificModes = ["attache", "trounoir", "debordement", "reserve_extensible", "maitrisee"];
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const tmrRandomMovePatten =
|
const tmrRandomMovePatten =
|
||||||
[{ name: 'top', col: 0, row: -1 },
|
[{ name: 'top', col: 0, row: -1 },
|
||||||
@@ -239,8 +237,6 @@ const tmrRandomMovePatten =
|
|||||||
{ name: 'topleft', col: -1, row: -1 }
|
{ name: 'topleft', col: -1, row: -1 }
|
||||||
]
|
]
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class TMRUtility {
|
export class TMRUtility {
|
||||||
static init() {
|
static init() {
|
||||||
@@ -258,39 +254,32 @@ export class TMRUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static verifyTMRCoord(coord) {
|
static verifyTMRCoord(coord) {
|
||||||
let TMRregexp = new RegExp(/([A-M])(\d+)/g);
|
return Grammar.equalsInsensitive(coord, 'Fleuve') || TMRUtility.getTMR(coord);
|
||||||
let res = TMRregexp.exec(coord);
|
|
||||||
if (res && res[1] && res[2]) {
|
|
||||||
if (res[2] > 0 && res[2] < 16) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getTMR(coord) {
|
static getTMR(coord) {
|
||||||
return TMRMapping[coord];
|
return coord == 'Fleuve' ? TMRMapping['D1'] : TMRMapping[coord];
|
||||||
}
|
}
|
||||||
|
|
||||||
static getTMRLabel(coord) {
|
static getTMRLabel(coord) {
|
||||||
return TMRMapping[coord]?.label ?? (coord + ": case inconnue");
|
return TMRUtility.getTMR(coord)?.label ?? (coord + ": case inconnue");
|
||||||
}
|
}
|
||||||
|
|
||||||
static getTMRType(coord) {
|
static getTMRType(coord) {
|
||||||
const tmr = TMRMapping[coord];
|
const tmr = TMRUtility.getTMR(coord);
|
||||||
return Misc.upperFirst(TMRType[tmr.type].name);
|
return Misc.upperFirst(TMRType[tmr.type].name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static getTMRDescr(coord) {
|
static getTMRDescr(coord) {
|
||||||
const tmr = TMRMapping[coord];
|
const tmr = TMRUtility.getTMR(coord);
|
||||||
return Grammar.articleDetermine(tmr.type) + ' ' + tmr.label;
|
return Grammar.articleDetermine(tmr.type) + ' ' + tmr.label;
|
||||||
}
|
}
|
||||||
|
|
||||||
static findTMRLike(type, options = {inclusMauvaise:true}) {
|
static findTMRLike(type, options = { inclusMauvaise: true }) {
|
||||||
const choix = [...Object.values(TMRType)]
|
const choix = [...Object.values(TMRType)]
|
||||||
if (options.inclusMauvaise){
|
if (options.inclusMauvaise) {
|
||||||
choix.push({name: 'Mauvaise'});
|
choix.push({ name: 'Mauvaise' });
|
||||||
}
|
}
|
||||||
const selection = Misc.findAllLike(type, choix).map(it => it.name);
|
const selection = Misc.findAllLike(type, choix).map(it => it.name);
|
||||||
if (selection.length == 0) {
|
if (selection.length == 0) {
|
||||||
@@ -309,7 +298,7 @@ export class TMRUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static buildSelectionTypesTMR(typesTMR) {
|
static buildSelectionTypesTMR(typesTMR) {
|
||||||
typesTMR = typesTMR?? [];
|
typesTMR = typesTMR ?? [];
|
||||||
return Object.values(TMRType).map(value => Misc.upperFirst(value.name))
|
return Object.values(TMRType).map(value => Misc.upperFirst(value.name))
|
||||||
.sort()
|
.sort()
|
||||||
.map(name => { return { name: name, selected: typesTMR.includes(name) } });
|
.map(name => { return { name: name, selected: typesTMR.includes(name) } });
|
||||||
@@ -387,6 +376,36 @@ export class TMRUtility {
|
|||||||
return caseList;
|
return caseList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// /* -------------------------------------------- */
|
||||||
|
static computeEventPosition(event) {
|
||||||
|
if (!event.nativeEvent.target.getBoundingClientRect) {
|
||||||
|
return { x: 0, y: 0 }
|
||||||
|
}
|
||||||
|
const canvasRect = event.nativeEvent.target.getBoundingClientRect();
|
||||||
|
return {
|
||||||
|
x: event.nativeEvent.clientX - canvasRect.left,
|
||||||
|
y: event.nativeEvent.clientY - canvasRect.top
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static computeEventOddq(event) {
|
||||||
|
var { x, y } = TMRUtility.computeEventPosition(event);
|
||||||
|
return TMRUtility.computeOddq(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static computeOddq(x, y) {
|
||||||
|
const col = Math.floor(x / tmrConstants.cellw); // [From 0 -> 12]
|
||||||
|
const decallageColonne = col % 2 == 0 ? tmrConstants.col1_y : tmrConstants.col2_y;
|
||||||
|
const row = Math.floor((y - decallageColonne) / tmrConstants.cellh); // [From 0 -> 14]
|
||||||
|
return { col, row };
|
||||||
|
}
|
||||||
|
|
||||||
|
static computeEventCoord(event) {
|
||||||
|
const oddq = TMRUtility.computeEventOddq(event);
|
||||||
|
return TMRUtility.oddqToCoordTMR(oddq);
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// https://www.redblobgames.com/grids/hexagons/#distances
|
// https://www.redblobgames.com/grids/hexagons/#distances
|
||||||
// TMR Letter-row correspond to "odd-q" grid (letter => col, numeric => row )
|
// TMR Letter-row correspond to "odd-q" grid (letter => col, numeric => row )
|
||||||
@@ -412,7 +431,7 @@ export class TMRUtility {
|
|||||||
col >= 0 && col < 13 &&
|
col >= 0 && col < 13 &&
|
||||||
row >= 0 &&
|
row >= 0 &&
|
||||||
(row + col % 2 <= 14)
|
(row + col % 2 <= 14)
|
||||||
);
|
);
|
||||||
// if (x >= 0 && x < 13 && y >= 0 && y < 14) return true;
|
// if (x >= 0 && x < 13 && y >= 0 && y < 14) return true;
|
||||||
// if (x >= 0 && x < 13 && x % 2 == 0 && y == 14) return true;
|
// if (x >= 0 && x < 13 && x % 2 == 0 && y == 14) return true;
|
||||||
// return false;
|
// return false;
|
||||||
@@ -456,7 +475,7 @@ export class TMRUtility {
|
|||||||
|
|
||||||
static axial_subtract(a, b) {
|
static axial_subtract(a, b) {
|
||||||
return {
|
return {
|
||||||
q: a.q- b.q,
|
q: a.q - b.q,
|
||||||
r: a.r - b.r
|
r: a.r - b.r
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -468,7 +487,7 @@ export class TMRUtility {
|
|||||||
// return Cube(q, r, s)
|
// return Cube(q, r, s)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
// /* -------------------------------------------- */
|
// /* -------------------------------------------- */
|
||||||
// static computeRealPictureCoordinates(coordOddq) {
|
// static computeRealPictureCoordinates(coordOddq) {
|
||||||
// let decallagePairImpair = (coordOddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y;
|
// let decallagePairImpair = (coordOddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { Draconique } from "./draconique.js";
|
import { Draconique } from "./draconique.js";
|
||||||
|
import { PixiTMR } from "./pixi-tmr.js";
|
||||||
|
|
||||||
export class CarteTmr extends Draconique {
|
export class CarteTmr extends Draconique {
|
||||||
|
|
||||||
@@ -12,9 +13,25 @@ export class CarteTmr extends Draconique {
|
|||||||
async onActorCreateOwned(actor, item) { }
|
async onActorCreateOwned(actor, item) { }
|
||||||
|
|
||||||
code() { return 'tmr' }
|
code() { return 'tmr' }
|
||||||
img() { return 'systems/foundryvtt-reve-de-dragon/styles/img/ui/tmp_main_r1.webp' }
|
img() { return 'systems/foundryvtt-reve-de-dragon/styles/img/ui/tmr.webp' }
|
||||||
|
|
||||||
createSprite(pixiTMR) {
|
createSprite(pixiTMR) {
|
||||||
return pixiTMR.carteTmr(this.code());
|
|
||||||
|
const img = PixiTMR.getImgFromCode(this.code())
|
||||||
|
const sprite = new PIXI.Sprite(PIXI.utils.TextureCache[img]);
|
||||||
|
// Setup the position of the TMR
|
||||||
|
sprite.x = 0;
|
||||||
|
sprite.y = 0;
|
||||||
|
sprite.width = 722;
|
||||||
|
sprite.height = 860;
|
||||||
|
// Rotate around the center
|
||||||
|
sprite.anchor.set(0);
|
||||||
|
sprite.buttonMode = true;
|
||||||
|
sprite.tmrObject = pixiTMR;
|
||||||
|
|
||||||
|
pixiTMR.addTooltip(sprite, (e,s) => this.computeTooltip(e,s));
|
||||||
|
pixiTMR.pixiApp.stage.addChild(sprite);
|
||||||
|
return sprite;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Misc } from "../misc.js";
|
import { TYPES } from "../item.js";
|
||||||
import { TMRUtility } from "../tmr-utility.js";
|
import { TMRUtility } from "../tmr-utility.js";
|
||||||
import { PixiTMR } from "./pixi-tmr.js";
|
import { PixiTMR } from "./pixi-tmr.js";
|
||||||
|
|
||||||
@@ -9,10 +9,10 @@ const registeredEffects = [
|
|||||||
* Définition des informations d'une "draconique" (queue, ombre, tête, souffle) qui influence les TMR
|
* Définition des informations d'une "draconique" (queue, ombre, tête, souffle) qui influence les TMR
|
||||||
*/
|
*/
|
||||||
export class Draconique {
|
export class Draconique {
|
||||||
static isCaseTMR(item) { return item.type == 'casetmr'; }
|
static isCaseTMR(item) { return item.type == TYPES.casetmr; }
|
||||||
static isQueueDragon(item) { return item.type == 'queue' || item.type == 'ombre'; }
|
static isQueueDragon(item) { return item.isQueueDragon(); }
|
||||||
static isSouffleDragon(item) { return item.type == 'souffle'; }
|
static isSouffleDragon(item) { return item.type == TYPES.souffle; }
|
||||||
static isTeteDragon(item) { return item.type == 'tete'; }
|
static isTeteDragon(item) { return item.type == TYPES.tete; }
|
||||||
static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); }
|
static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); }
|
||||||
|
|
||||||
tmrLabel(linkData) { return TMRUtility.getTMRLabel(linkData.system.coord); }
|
tmrLabel(linkData) { return TMRUtility.getTMRLabel(linkData.system.coord); }
|
||||||
@@ -78,23 +78,45 @@ export class Draconique {
|
|||||||
/**
|
/**
|
||||||
* @param {*} img l'url du fichier image à utiliser pour le token. Si indéfini (et si createSprite n'est pas surchargé),
|
* @param {*} img l'url du fichier image à utiliser pour le token. Si indéfini (et si createSprite n'est pas surchargé),
|
||||||
* un disque est utilisé.
|
* un disque est utilisé.
|
||||||
*/
|
*/
|
||||||
img() { return undefined }
|
img() { return undefined }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* factory d'élément graphique PIXI correpsondant à l'objet draconique
|
* factory d'élément graphique PIXI correspondant à l'objet draconique
|
||||||
* @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks.
|
* @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks.
|
||||||
*/
|
*/
|
||||||
token(pixiTMR, linkData, coordTMR, type = undefined) {
|
token(pixiTMR, linkData, coordTMR, type = undefined) {
|
||||||
const token = {
|
const token = {
|
||||||
sprite: this.createSprite(pixiTMR),
|
sprite: this.createSprite(pixiTMR),
|
||||||
coordTMR: coordTMR
|
coordTMR: coordTMR
|
||||||
};
|
};
|
||||||
token[type ?? this.code()] = linkData;
|
token[type ?? this.code()] = linkData;
|
||||||
pixiTMR.addTooltip(token.sprite, this.tooltip(linkData));
|
this.linkData = linkData;
|
||||||
|
if (this.tooltip(linkData)) {
|
||||||
|
pixiTMR.addTooltip(token.sprite, (e, s) => this.computeTooltip(e, s));
|
||||||
|
}
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* methode en charge de recalculer le tooltip lorsque la souris bouge
|
||||||
|
* @param {*} event evenement contenant les coordonnées
|
||||||
|
* @param {*} sprite sprite pour laquelle calculer le tooltip
|
||||||
|
*/
|
||||||
|
computeTooltip(event, sprite) {
|
||||||
|
if (sprite.isOver) {
|
||||||
|
const oddq = TMRUtility.computeEventOddq(event);
|
||||||
|
const coord = TMRUtility.oddqToCoordTMR(oddq);
|
||||||
|
const tmr = TMRUtility.getTMR(coord)
|
||||||
|
if (tmr){
|
||||||
|
const label = TMRUtility.getTMRLabel(coord);
|
||||||
|
const text = this.tooltip(this.linkData);
|
||||||
|
return text ? `${coord}: ${label}\n${text}` : `${coord}: ${label}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* factory d'élément graphique PIXI correpsondant à l'objet draconique
|
* factory d'élément graphique PIXI correpsondant à l'objet draconique
|
||||||
* @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks.
|
* @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks.
|
||||||
@@ -116,11 +138,11 @@ export class Draconique {
|
|||||||
isCase(item, coord = undefined) {
|
isCase(item, coord = undefined) {
|
||||||
return Draconique.isCaseTMR(item) && item.system.specific == this.code() && (coord ? item.system.coord == coord : true);
|
return Draconique.isCaseTMR(item) && item.system.specific == this.code() && (coord ? item.system.coord == coord : true);
|
||||||
}
|
}
|
||||||
|
|
||||||
find(list, coord = undefined) {
|
find(list, coord = undefined) {
|
||||||
return list.find(c => this.isCase(c, coord));
|
return list.find(c => this.isCase(c, coord));
|
||||||
}
|
}
|
||||||
|
|
||||||
async createCaseTmr(actor, label, tmr, sourceId = undefined) {
|
async createCaseTmr(actor, label, tmr, sourceId = undefined) {
|
||||||
const casetmrData = {
|
const casetmrData = {
|
||||||
name: label, type: 'casetmr', img: this.img(),
|
name: label, type: 'casetmr', img: this.img(),
|
||||||
@@ -128,12 +150,12 @@ export class Draconique {
|
|||||||
};
|
};
|
||||||
await actor.createEmbeddedDocuments('Item', [casetmrData]);
|
await actor.createEmbeddedDocuments('Item', [casetmrData]);
|
||||||
}
|
}
|
||||||
|
|
||||||
async deleteCasesTmr(actor, draconique) {
|
async deleteCasesTmr(actor, draconique) {
|
||||||
let caseTmrs = actor.items.filter(it => this.isCaseForSource(it, draconique));
|
let caseTmrs = actor.items.filter(it => this.isCaseForSource(it, draconique));
|
||||||
await actor.deleteEmbeddedDocuments('Item', caseTmrs.map(it => it.id));
|
await actor.deleteEmbeddedDocuments('Item', caseTmrs.map(it => it.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
isCaseForSource(item, draconique) {
|
isCaseForSource(item, draconique) {
|
||||||
return Draconique.isCaseTMR(item) && item.system.specific == this.code() && item.system.sourceid == draconique.id;
|
return Draconique.isCaseTMR(item) && item.system.specific == this.code() && item.system.sourceid == draconique.id;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import { Periple } from "./periple.js";
|
|||||||
import { UrgenceDraconique } from "./urgence-draconique.js";
|
import { UrgenceDraconique } from "./urgence-draconique.js";
|
||||||
import { Grammar } from "../grammar.js";
|
import { Grammar } from "../grammar.js";
|
||||||
import { AugmentationSeuil } from "./augmentation-seuil.js";
|
import { AugmentationSeuil } from "./augmentation-seuil.js";
|
||||||
|
import { TYPES } from "../item.js";
|
||||||
|
|
||||||
|
|
||||||
export class EffetsDraconiques {
|
export class EffetsDraconiques {
|
||||||
@@ -114,46 +115,57 @@ export class EffetsDraconiques {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static filterItems(actor, filter, name) {
|
static tetesDragon(actor, name) {
|
||||||
return actor.filterItems(filter)
|
return actor.itemTypes[TYPES.tete].filter(it => Grammar.includesLowerCaseNoAccent(it.name, name));
|
||||||
.filter(it => Grammar.includesLowerCaseNoAccent(it.name, name));
|
}
|
||||||
|
|
||||||
|
static soufflesDragon(actor, name) {
|
||||||
|
return actor.itemTypes[TYPES.souffle].filter(it => Grammar.includesLowerCaseNoAccent(it.name, name));
|
||||||
|
}
|
||||||
|
|
||||||
|
static queuesDragon(actor, name) {
|
||||||
|
return actor.filterItems(it => it.isQueueDragon() && Grammar.includesLowerCaseNoAccent(it.name, name));
|
||||||
|
}
|
||||||
|
|
||||||
|
static queuesSoufflesDragon(actor, name) {
|
||||||
|
return actor.filterItems(it => [TYPES.queue, TYPES.ombre, TYPES.souffle].includes(it.type) && Grammar.includesLowerCaseNoAccent(it.name, name));
|
||||||
}
|
}
|
||||||
|
|
||||||
static countAugmentationSeuil(actor) {
|
static countAugmentationSeuil(actor) {
|
||||||
return EffetsDraconiques.filterItems(actor, Draconique.isTeteDragon, 'Augmentation du seuil de rêve').length;
|
return EffetsDraconiques.tetesDragon(actor, 'Augmentation du seuil de rêve').length;
|
||||||
}
|
}
|
||||||
|
|
||||||
static isDonDoubleReve(actor) {
|
static isDonDoubleReve(actor) {
|
||||||
return EffetsDraconiques.filterItems(actor, Draconique.isTeteDragon, 'Don de double-rêve').length>0;
|
return EffetsDraconiques.tetesDragon(actor, 'Don de double-rêve').length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static isConnaissanceFleuve(actor) {
|
static isConnaissanceFleuve(actor) {
|
||||||
return EffetsDraconiques.filterItems(actor, Draconique.isTeteDragon, 'connaissance du fleuve').length>0;
|
return EffetsDraconiques.tetesDragon(actor, 'connaissance du fleuve').length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static isReserveEnSecurite(actor) {
|
static isReserveEnSecurite(actor) {
|
||||||
return EffetsDraconiques.filterItems(actor, Draconique.isTeteDragon, 'réserve en sécurité').length>0;
|
return EffetsDraconiques.tetesDragon(actor, 'réserve en sécurité').length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static isDeplacementAccelere(actor) {
|
static isDeplacementAccelere(actor) {
|
||||||
return EffetsDraconiques.filterItems(actor, Draconique.isTeteDragon, ' déplacement accéléré').length>0;
|
return EffetsDraconiques.tetesDragon(actor, 'déplacement accéléré').length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static isDoubleResistanceFleuve(actor) {
|
static isDoubleResistanceFleuve(actor) {
|
||||||
return EffetsDraconiques.filterItems(actor, Draconique.isSouffleDragon, 'résistance du fleuve').length>0;
|
return EffetsDraconiques.soufflesDragon(actor, 'résistance du fleuve').length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static countInertieDraconique(actor) {
|
static countInertieDraconique(actor) {
|
||||||
return EffetsDraconiques.filterItems(actor, Draconique.isQueueDragon, 'inertie draconique').length;
|
return EffetsDraconiques.queuesDragon(actor, 'inertie draconique').length;
|
||||||
}
|
}
|
||||||
|
|
||||||
static countMonteeLaborieuse(actor) {
|
static countMonteeLaborieuse(actor) {
|
||||||
return EffetsDraconiques.filterItems(actor, Draconique.isQueueSouffle, 'montée laborieuse').length;
|
return EffetsDraconiques.queuesSoufflesDragon(actor, 'montée laborieuse').length;
|
||||||
}
|
}
|
||||||
|
|
||||||
static mauvaiseRencontre(actor) {
|
static mauvaiseRencontre(actor) {
|
||||||
const mauvaisesRencontres = EffetsDraconiques.filterItems(actor, Draconique.isQueueSouffle, 'mauvaise rencontre');
|
const mauvaisesRencontres = EffetsDraconiques.queuesSoufflesDragon(actor, 'mauvaise rencontre');
|
||||||
return mauvaisesRencontres.length>0 ? mauvaisesRencontres[0] : undefined;
|
return mauvaisesRencontres.length > 0 ? mauvaisesRencontres[0] : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
static isPontImpraticable(actor) {
|
static isPontImpraticable(actor) {
|
||||||
@@ -164,8 +176,12 @@ export class EffetsDraconiques {
|
|||||||
return actor.items.find(it => EffetsDraconiques.urgenceDraconique.match(it));
|
return actor.items.find(it => EffetsDraconiques.urgenceDraconique.match(it));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static isSujetInsomnie(actor) {
|
||||||
|
return EffetsDraconiques.queuesDragon(actor, 'Insomnie').length > 0 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
static isPeage(actor) {
|
static isPeage(actor) {
|
||||||
return EffetsDraconiques.filterItems(actor, Draconique.isSouffleDragon, 'péage').length > 0;
|
return EffetsDraconiques.soufflesDragon(actor, 'péage').length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
import { ExperienceLog, XP_TOPIC } from "../actor/experience-log.js";
|
||||||
import { ChatUtility } from "../chat-utility.js";
|
import { ChatUtility } from "../chat-utility.js";
|
||||||
import { Poetique } from "../poetique.js";
|
import { Poetique } from "../poetique.js";
|
||||||
import { RdDDice } from "../rdd-dice.js";
|
import { RdDDice } from "../rdd-dice.js";
|
||||||
|
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
||||||
import { TMRUtility } from "../tmr-utility.js";
|
import { TMRUtility } from "../tmr-utility.js";
|
||||||
|
|
||||||
export class EffetsRencontre {
|
export class EffetsRencontre {
|
||||||
@@ -8,7 +10,7 @@ export class EffetsRencontre {
|
|||||||
static messager = async (dialog, context) => {
|
static messager = async (dialog, context) => {
|
||||||
dialog.setRencontreState('messager', TMRUtility.getTMRPortee(context.tmr.coord, context.rencontre.system.force));
|
dialog.setRencontreState('messager', TMRUtility.getTMRPortee(context.tmr.coord, context.rencontre.system.force));
|
||||||
}
|
}
|
||||||
|
|
||||||
static passeur = async (dialog, context) => {
|
static passeur = async (dialog, context) => {
|
||||||
dialog.setRencontreState('passeur', TMRUtility.getTMRPortee(context.tmr.coord, context.rencontre.system.force));
|
dialog.setRencontreState('passeur', TMRUtility.getTMRPortee(context.tmr.coord, context.rencontre.system.force));
|
||||||
}
|
}
|
||||||
@@ -25,16 +27,25 @@ export class EffetsRencontre {
|
|||||||
static reve_plus_1 = async (dialog, context) => { await EffetsRencontre.$reve_plus(context.actor, 1) }
|
static reve_plus_1 = async (dialog, context) => { await EffetsRencontre.$reve_plus(context.actor, 1) }
|
||||||
static reve_moins_force = async (dialog, context) => { await EffetsRencontre.$reve_plus(context.actor, -context.rencontre.system.force) }
|
static reve_moins_force = async (dialog, context) => { await EffetsRencontre.$reve_plus(context.actor, -context.rencontre.system.force) }
|
||||||
static reve_moins_1 = async (dialog, context) => { await EffetsRencontre.$reve_plus(context.actor, -1) }
|
static reve_moins_1 = async (dialog, context) => { await EffetsRencontre.$reve_plus(context.actor, -1) }
|
||||||
static $reve_plus = async (actor, valeur) => { await actor.reveActuelIncDec(valeur) }
|
static $reve_plus = async (actor, reve) => {
|
||||||
|
if (!ReglesOptionnelles.isUsing("recuperation-reve") && reve < 0) {
|
||||||
|
ChatMessage.create({
|
||||||
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name),
|
||||||
|
content: `Pas de récupération de rêve (${reve} points ignorés)`
|
||||||
|
});
|
||||||
|
return
|
||||||
|
}
|
||||||
|
await actor.reveActuelIncDec(reve)
|
||||||
|
}
|
||||||
|
|
||||||
static vie_moins_1 = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, -1) }
|
static vie_moins_1 = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, -1) }
|
||||||
static vie_moins_force = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, -context.rencontre.system.force) }
|
static vie_moins_force = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, -context.rencontre.system.force) }
|
||||||
static $vie_plus = async (actor, valeur) => { await actor.santeIncDec("vie", valeur) }
|
static $vie_plus = async (actor, valeur) => { await actor.santeIncDec("vie", valeur) }
|
||||||
|
|
||||||
static moral_plus_1 = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, 1) }
|
static moral_plus_1 = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, 1) }
|
||||||
static moral_moins_1 = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, -1) }
|
static moral_moins_1 = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, -1) }
|
||||||
static $moral_plus = async (actor, valeur) => { await actor.moralIncDec(valeur) }
|
static $moral_plus = async (actor, valeur) => { await actor.moralIncDec(valeur) }
|
||||||
|
|
||||||
static end_moins_1 = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, -1) }
|
static end_moins_1 = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, -1) }
|
||||||
static end_moins_force = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, -context.rencontre.system.force) }
|
static end_moins_force = async (dialog, context) => { await EffetsRencontre.$vie_plus(context.actor, -context.rencontre.system.force) }
|
||||||
static $end_plus = async (actor, valeur) => { await actor.santeIncDec("endurance", valeur) }
|
static $end_plus = async (actor, valeur) => { await actor.santeIncDec("endurance", valeur) }
|
||||||
@@ -49,16 +60,17 @@ export class EffetsRencontre {
|
|||||||
const perte = context.rolled.isETotal ? context.rencontre.system.force : 1;
|
const perte = context.rolled.isETotal ? context.rencontre.system.force : 1;
|
||||||
await context.actor.chanceActuelleIncDec("fatigue", -perte);
|
await context.actor.chanceActuelleIncDec("fatigue", -perte);
|
||||||
}
|
}
|
||||||
|
|
||||||
static xp_sort_force = async (dialog, context) => {
|
static xp_sort_force = async (dialog, context) => {
|
||||||
let competence = context.competence;
|
let competence = context.competence;
|
||||||
if (competence) {
|
if (competence) {
|
||||||
const xpSort = Misc.toInt(competence.system.xp_sort) + context.rencontre.system.force;
|
const fromXpSort = Number(competence.system.xp_sort);
|
||||||
await this.updateEmbeddedDocuments("Item", [{ _id: compData._id, 'system.xp_sort': xpSort }]);
|
const toXpSort = fromXpSort + context.rencontre.system.force;
|
||||||
await this.updateExperienceLog("XP Sort", xpSort, `Rencontre d'un ${context.rencontre.name} en TMR`);
|
await this.updateEmbeddedDocuments("Item", [{ _id: compData._id, 'system.xp_sort': toXpSort }]);
|
||||||
|
await ExperienceLog.add(this, XP_TOPIC.XPSORT, fromXpSort, toXpSort, `${competence.name} - ${context.rencontre.name} en TMR`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static stress_plus_1 = async (dialog, context) => {
|
static stress_plus_1 = async (dialog, context) => {
|
||||||
await context.actor.addCompteurValue('stress', 1, `Rencontre d'un ${context.rencontre.name} en TMR`);
|
await context.actor.addCompteurValue('stress', 1, `Rencontre d'un ${context.rencontre.name} en TMR`);
|
||||||
}
|
}
|
||||||
@@ -73,7 +85,7 @@ export class EffetsRencontre {
|
|||||||
|
|
||||||
static demireve_rompu = async (dialog, context) => {
|
static demireve_rompu = async (dialog, context) => {
|
||||||
dialog.close()
|
dialog.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
static sort_aleatoire = async (dialog, context) => {
|
static sort_aleatoire = async (dialog, context) => {
|
||||||
context.sortReserve = await RdDDice.rollOneOf(context.actor.itemTypes['sortreserve']);
|
context.sortReserve = await RdDDice.rollOneOf(context.actor.itemTypes['sortreserve']);
|
||||||
@@ -126,7 +138,7 @@ export class EffetsRencontre {
|
|||||||
|
|
||||||
static regain_seuil = async (dialog, context) => {
|
static regain_seuil = async (dialog, context) => {
|
||||||
await context.actor.regainPointDeSeuil()
|
await context.actor.regainPointDeSeuil()
|
||||||
}
|
}
|
||||||
|
|
||||||
static async $reinsertion(dialog, actor, filter) {
|
static async $reinsertion(dialog, actor, filter) {
|
||||||
const newTMR = await TMRUtility.getTMRAleatoire(filter);
|
const newTMR = await TMRUtility.getTMRAleatoire(filter);
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
import { RdDTMRDialog } from "../rdd-tmr-dialog.js";
|
||||||
import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js";
|
import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js";
|
||||||
|
import { TMRUtility } from "../tmr-utility.js";
|
||||||
|
|
||||||
const tooltipStyle = new PIXI.TextStyle({
|
export const tooltipStyle = new PIXI.TextStyle({
|
||||||
fontFamily: 'CaslonAntique',
|
fontFamily: 'CaslonAntique',
|
||||||
fontSize: 18,
|
fontSize: 18,
|
||||||
fill: '#FFFFFF',
|
fill: '#FFFFFF',
|
||||||
@@ -20,54 +22,37 @@ export class PixiTMR {
|
|||||||
this.callbacksOnAnimate = [];
|
this.callbacksOnAnimate = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
load( onLoad = (loader, resources) => {} ) {
|
async load(onLoad = (loader, resources) => { }) {
|
||||||
let loader = this.pixiApp.loader;
|
// WIP - Deprecated since v7 : let loader = new PIXI.Loader();
|
||||||
for (const [name, img] of Object.entries(PixiTMR.textures)) {
|
for (const [name, img] of Object.entries(PixiTMR.textures)) {
|
||||||
loader = loader.add(name, img);
|
const texture = await PIXI.Assets.load(img);
|
||||||
|
let image = PIXI.Sprite.from(texture);
|
||||||
}
|
}
|
||||||
loader.onError.add((error, reason) => { console.log("ERROR", error, reason) });
|
onLoad();
|
||||||
loader.load( (loader, resources) => {
|
for (let onAnimate of this.callbacksOnAnimate) {
|
||||||
onLoad(loader, resources);
|
onAnimate();
|
||||||
for (let onAnimate of this.callbacksOnAnimate) {
|
}
|
||||||
onAnimate();
|
}
|
||||||
}
|
|
||||||
});
|
static getImgFromCode(code) {
|
||||||
|
return PixiTMR.textures[code]
|
||||||
}
|
}
|
||||||
|
|
||||||
static register(name, img) {
|
static register(name, img) {
|
||||||
PixiTMR.textures[name] = img;
|
PixiTMR.textures[name] = img;
|
||||||
}
|
}
|
||||||
|
|
||||||
animate(animation = pixiApp=>{})
|
animate(animation = pixiApp => { }) {
|
||||||
{
|
|
||||||
this.callbacksOnAnimate.push(() => animation(this.pixiApp));
|
this.callbacksOnAnimate.push(() => animation(this.pixiApp));
|
||||||
}
|
}
|
||||||
|
|
||||||
carteTmr(code) {
|
|
||||||
const carteTmr = new PIXI.Sprite(PIXI.utils.TextureCache[code]);
|
|
||||||
// Setup the position of the TMR
|
|
||||||
carteTmr.x = 0;
|
|
||||||
carteTmr.y = 0;
|
|
||||||
carteTmr.width = 720;
|
|
||||||
carteTmr.height = 860;
|
|
||||||
// Rotate around the center
|
|
||||||
carteTmr.anchor.set(0);
|
|
||||||
carteTmr.interactive = true;
|
|
||||||
carteTmr.buttonMode = true;
|
|
||||||
carteTmr.tmrObject = this;
|
|
||||||
if (!this.tmrObject.viewOnly) {
|
|
||||||
carteTmr.on('pointerdown', event => this.onClickBackground(event));
|
|
||||||
}
|
|
||||||
this.pixiApp.stage.addChild(carteTmr);
|
|
||||||
return carteTmr;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprite(code, options = {}) {
|
sprite(code, options = {}) {
|
||||||
const texture = PIXI.utils.TextureCache[code];
|
let img = PixiTMR.getImgFromCode(code)
|
||||||
|
const texture = PIXI.utils.TextureCache[img];
|
||||||
if (!texture) {
|
if (!texture) {
|
||||||
console.error("Texture manquante", code)
|
console.error("Texture manquante", code, PIXI.utils.TextureCache)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let sprite = new PIXI.Sprite(texture);
|
let sprite = new PIXI.Sprite(texture);
|
||||||
sprite.width = options.taille ?? tmrConstants.half;
|
sprite.width = options.taille ?? tmrConstants.half;
|
||||||
sprite.height = options.taille ?? tmrConstants.half;
|
sprite.height = options.taille ?? tmrConstants.half;
|
||||||
@@ -75,13 +60,13 @@ export class PixiTMR {
|
|||||||
if (options.color) {
|
if (options.color) {
|
||||||
sprite.tint = options.color;
|
sprite.tint = options.color;
|
||||||
}
|
}
|
||||||
sprite.zIndex = options.zIndex ?? tmrTokenZIndex.casehumide+1;
|
sprite.zIndex = options.zIndex ?? tmrTokenZIndex.casehumide + 1;
|
||||||
sprite.alpha = options.alpha ?? 0.75;
|
sprite.alpha = options.alpha ?? 0.75;
|
||||||
sprite.decallage = options.decallage ?? tmrConstants.center;
|
sprite.decallage = options.decallage ?? tmrConstants.center;
|
||||||
this.pixiApp.stage.addChild(sprite);
|
this.pixiApp.stage.addChild(sprite);
|
||||||
return sprite;
|
return sprite;
|
||||||
}
|
}
|
||||||
|
|
||||||
circle(name, options = {}) {
|
circle(name, options = {}) {
|
||||||
let sprite = new PIXI.Graphics();
|
let sprite = new PIXI.Graphics();
|
||||||
sprite.beginFill(options.color, options.opacity);
|
sprite.beginFill(options.color, options.opacity);
|
||||||
@@ -92,26 +77,37 @@ export class PixiTMR {
|
|||||||
return sprite;
|
return sprite;
|
||||||
}
|
}
|
||||||
|
|
||||||
addTooltip(sprite, text) {
|
addTooltip(sprite, computeTooltip) {
|
||||||
if (text) {
|
sprite.tooltip = new PIXI.Text('', tooltipStyle);
|
||||||
sprite.tooltip = new PIXI.Text(text, tooltipStyle);
|
sprite.tooltip.zIndex = tmrTokenZIndex.tooltip;
|
||||||
sprite.tooltip.zIndex = tmrTokenZIndex.tooltip;
|
sprite.isOver = false;
|
||||||
sprite.isOver = false;
|
sprite.eventMode = 'static';
|
||||||
sprite.interactive = true;
|
sprite
|
||||||
sprite.on('pointerdown', event => this.onClickBackground(event))
|
.on('pointermove', event => this.onPointerMove(event, sprite, computeTooltip))
|
||||||
.on('pointerover', () => this.onShowTooltip(sprite))
|
.on('pointerdown', event => this.onClickBackground(event))
|
||||||
.on('pointerout', () => this.onHideTooltip(sprite));
|
.on('pointerover', event => this.onShowTooltip(event, sprite))
|
||||||
}
|
.on('pointerout', event => this.onHideTooltip(event, sprite));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
onClickBackground(event) {
|
onClickBackground(event) {
|
||||||
this.tmrObject.onClickTMR(event)
|
if (!this.viewOnly) {
|
||||||
|
this.tmrObject.onClickTMR(event)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onShowTooltip(sprite) {
|
onPointerMove(event, sprite, computeTooltip) {
|
||||||
if (sprite.tooltip) {
|
if (sprite.isOver && sprite.tooltip) {
|
||||||
|
var { x, y } = TMRUtility.computeEventPosition(event);
|
||||||
|
const oddq = TMRUtility.computeOddq(x, y);
|
||||||
|
|
||||||
|
sprite.tooltip.x = x + (oddq.col > 8 ? - 3 * tmrConstants.full : tmrConstants.half)
|
||||||
|
sprite.tooltip.y = y + (oddq.row > 10 ? - tmrConstants.half : tmrConstants.half)
|
||||||
|
sprite.tooltip.text = computeTooltip(event, sprite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onShowTooltip(event, sprite) {
|
||||||
|
if (sprite.tooltip) {
|
||||||
if (!sprite.isOver) {
|
if (!sprite.isOver) {
|
||||||
sprite.tooltip.x = sprite.x;
|
sprite.tooltip.x = sprite.x;
|
||||||
sprite.tooltip.y = sprite.y;
|
sprite.tooltip.y = sprite.y;
|
||||||
@@ -121,7 +117,7 @@ export class PixiTMR {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onHideTooltip(sprite) {
|
onHideTooltip(event, sprite) {
|
||||||
if (sprite.tooltip) {
|
if (sprite.tooltip) {
|
||||||
if (sprite.isOver) {
|
if (sprite.isOver) {
|
||||||
this.pixiApp.stage.removeChild(sprite.tooltip);
|
this.pixiApp.stage.removeChild(sprite.tooltip);
|
||||||
@@ -130,7 +126,7 @@ export class PixiTMR {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setPosition( sprite, oddq) {
|
setPosition(sprite, oddq) {
|
||||||
let decallagePairImpair = (oddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y;
|
let decallagePairImpair = (oddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y;
|
||||||
let dx = (sprite.decallage == undefined) ? 0 : sprite.decallage.x;
|
let dx = (sprite.decallage == undefined) ? 0 : sprite.decallage.x;
|
||||||
let dy = (sprite.decallage == undefined) ? 0 : sprite.decallage.y;
|
let dy = (sprite.decallage == undefined) ? 0 : sprite.decallage.y;
|
||||||
|
|||||||
@@ -49,12 +49,13 @@ export class PresentCites extends Draconique {
|
|||||||
const presents = await game.system.rdd.rencontresTMR.getPresentsCite()
|
const presents = await game.system.rdd.rencontresTMR.getPresentsCite()
|
||||||
const buttons = {};
|
const buttons = {};
|
||||||
presents.forEach(r => buttons['present'+r.id] = { icon: '<i class="fas fa-check"></i>', label: r.name, callback: async () => onChoixPresent(r) });
|
presents.forEach(r => buttons['present'+r.id] = { icon: '<i class="fas fa-check"></i>', label: r.name, callback: async () => onChoixPresent(r) });
|
||||||
let d = new Dialog({
|
let dialog = new Dialog({
|
||||||
title: "Présent des cités",
|
title: "Présent des cités",
|
||||||
content: `La ${this.tmrLabel(casetmr)} vous offre un présent, faites votre choix`,
|
content: `La ${this.tmrLabel(casetmr)} vous offre un présent, faites votre choix`,
|
||||||
buttons: buttons
|
buttons: buttons
|
||||||
});
|
});
|
||||||
d.render(true);
|
dialog.render(true);
|
||||||
|
return dialog
|
||||||
}
|
}
|
||||||
|
|
||||||
async ouvrirLePresent(actor, casetmr) {
|
async ouvrirLePresent(actor, casetmr) {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,198 +1,206 @@
|
|||||||
{"name":"Argent (1 sol)","type":"monnaie","img":"systems/foundryvtt-reve-de-dragon/icons/objets/piece_argent_sol.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.6M7WG9ciKuoYtN9i"}},"_id":"0I30m9qcYJk6UR6o","system":{"description":"","descriptionmj":"","encombrement":null,"quantite":null,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}]},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206013,"modifiedTime":1674002002070,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Argent (1 sol)","type":"monnaie","img":"systems/foundryvtt-reve-de-dragon/icons/objets/piece_argent_sol.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.6M7WG9ciKuoYtN9i"}},"_id":"0I30m9qcYJk6UR6o","system":{"description":"","descriptionmj":"","encombrement":null,"quantite":null,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}]},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206013,"modifiedTime":1676074487962,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"0Vgscex1VV4ybSUQ","name":"Bonnet de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bonnet_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.0Vgscex1VV4ybSUQ"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.06,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206013,"modifiedTime":1674002002070,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"0Vgscex1VV4ybSUQ","name":"Bonnet de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bonnet_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.0Vgscex1VV4ybSUQ"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.06,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206013,"modifiedTime":1676074487962,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"1Dc4KzZageae7lhI","name":"Balles de jongleur","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/balle_jongleur.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.1Dc4KzZageae7lhI"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":4,"qualite":0,"cout":0.32,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206013,"modifiedTime":1674002002070,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"1Dc4KzZageae7lhI","name":"Balles de jongleur","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/balle_jongleur.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.1Dc4KzZageae7lhI"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":4,"qualite":0,"cout":0.32,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206013,"modifiedTime":1676074487962,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"1O7IJiQSDYxJ5VsD","name":"Bouclier moyen","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_moyen.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.1O7IJiQSDYxJ5VsD"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":15,"categorie_parade":"boucliers","dommages":"0","penetration":0,"force":"11","competence":"Bouclier","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206014,"modifiedTime":1674002002071,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"1O7IJiQSDYxJ5VsD","name":"Bouclier moyen","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_moyen.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.1O7IJiQSDYxJ5VsD"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":15,"categorie_parade":"boucliers","dommages":"0","penetration":0,"force":"11","competence":"Bouclier","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206014,"modifiedTime":1676074487962,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Provisions cuites","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/objets/provision_cuite.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.1keQMXTZ2iriOuJh"}},"_id":"1keQMXTZ2iriOuJh","system":{"description":"<p>pain, fromage, viande séchée...</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.02,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":1,"exotisme":0,"cuisinier":"","boisson":false,"desaltere":0,"alcoolise":false,"force":0},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206014,"modifiedTime":1674002002071,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Provisions cuites","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/objets/provision_cuite.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.1keQMXTZ2iriOuJh"}},"_id":"1keQMXTZ2iriOuJh","system":{"description":"<p>pain, fromage, viande séchée...</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.02,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":1,"exotisme":0,"cuisinier":"","boisson":false,"desaltere":0,"alcoolise":false,"force":0},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206014,"modifiedTime":1676074487962,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"2y61gBIFbATQaKDl","name":"1 m2 de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tissu_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.2y61gBIFbATQaKDl"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206014,"modifiedTime":1674002002071,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"2y61gBIFbATQaKDl","name":"1 m2 de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tissu_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.2y61gBIFbATQaKDl"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206014,"modifiedTime":1676074487962,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"3DJePXhrDWQxbUeM","name":"Dé à jouer en os","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/des_en_os.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.3DJePXhrDWQxbUeM"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1674002002072,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Poinçon","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/poincon_2.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.F6ZHJth4t0PA5PMB"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1676074352881,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"39iYJ6mJuy3Kno1C","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"_id":"3cn9nWtY0Vb1PLTx","name":"Dague de jet","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/dagues.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.3cn9nWtY0Vb1PLTx"}},"system":{"description":"<p>Chaque point de force au dessus de 10 augmente les portées de 1m.</p>\n<p>Chaque point de force en dessous de 9 diminue les portées de 1m.</p>","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":0,"categorie_parade":"","dommages":"1","penetration":0,"force":"0","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1674002002072,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"3DJePXhrDWQxbUeM","name":"Dé à jouer en os","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/des_en_os.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.3DJePXhrDWQxbUeM"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1676074487962,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"3t0NhMC0cFQyCZGH","name":"Soufflet","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/soufflet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.3t0NhMC0cFQyCZGH"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1674002002072,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Lime","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lime.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Lz4dA2NwxdSZ3FZK"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1676074352882,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"3WpH3WZk0dPzvhiu","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"_id":"3uWCDH1NOjHJpVo1","name":"Maillet","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/maillet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.3uWCDH1NOjHJpVo1"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.1,"quantite":1,"qualite":0,"cout":0.05,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":7,"categorie_parade":"","dommages":"1","penetration":0,"force":"7","competence":"Masse à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":true,"initpremierround":"masse"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.4","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1674571031725,"lastModifiedBy":"F2zvQUIw6mQepDqs"}}
|
{"_id":"3cn9nWtY0Vb1PLTx","name":"Dague de jet","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/dagues.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.3cn9nWtY0Vb1PLTx"}},"system":{"description":"<p>Chaque point de force au dessus de 10 augmente les portées de 1m.</p>\n<p>Chaque point de force en dessous de 9 diminue les portées de 1m.</p>","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":0,"categorie_parade":"","dommages":"1","penetration":0,"force":"0","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1676074487962,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"4GeV81qoJrjHIgzR","name":"Tournegraisse","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tournegraisse.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.4GeV81qoJrjHIgzR"}},"system":{"description":"<p>Crème sirupeuse blanchâtre.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1674255023054,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"3t0NhMC0cFQyCZGH","name":"Soufflet","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/soufflet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.3t0NhMC0cFQyCZGH"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"4LFXefT0HFpaXQLx","name":"Briquet à silex","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/briquet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.4LFXefT0HFpaXQLx"}},"system":{"description":"","descriptionmj":"","encombrement":0.08,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1674002002072,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"3uWCDH1NOjHJpVo1","name":"Maillet","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/maillet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.3uWCDH1NOjHJpVo1"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.1,"quantite":1,"qualite":0,"cout":0.05,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":7,"categorie_parade":"","dommages":"1","penetration":0,"force":"7","competence":"Masse à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":true,"initpremierround":"masse"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"4qPaCKONcrsK6JbQ","name":"Pichet de grès (1 litre)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pichet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.4qPaCKONcrsK6JbQ"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1674002002072,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"4GeV81qoJrjHIgzR","name":"Tournegraisse","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tournegraisse.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.4GeV81qoJrjHIgzR"}},"system":{"description":"<p>Crème sirupeuse blanchâtre.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"4qoLpa4shvkgDZRy","name":"Culottes de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/culottes_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.4qoLpa4shvkgDZRy"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1674002002072,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"4LFXefT0HFpaXQLx","name":"Briquet à silex","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/briquet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.4LFXefT0HFpaXQLx"}},"system":{"description":"","descriptionmj":"","encombrement":0.08,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"5GOk9cMApM4dBcIU","name":"Casserole de fer (1 litre)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/casserole.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.5GOk9cMApM4dBcIU"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1674002002072,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"4qPaCKONcrsK6JbQ","name":"Pichet de grès (1 litre)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pichet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.4qPaCKONcrsK6JbQ"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"65SRmXVcyiG5ZW9l","name":"Cuillère de fer","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cuillere_fer.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.65SRmXVcyiG5ZW9l"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1674002002073,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"4qoLpa4shvkgDZRy","name":"Culottes de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/culottes_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.4qoLpa4shvkgDZRy"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"6MVWA3DYbpw8122A","name":"Entonnoir de fer","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/entonnoir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.6MVWA3DYbpw8122A"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1674002002073,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"5GOk9cMApM4dBcIU","name":"Casserole de fer (1 litre)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/casserole.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.5GOk9cMApM4dBcIU"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"6s5QjArwz9w9JIGL","name":"Double dragonne","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/double_dragonne.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.6s5QjArwz9w9JIGL"}},"system":{"description":"<p>Apparue vers la fin du Second Âge, c’était<em> une grande épée à deux mains</em>. Encombrante et prohibant le bouclier, c’était avant tout une épée de duel et de frime.</p>","descriptionmj":"","equipe":false,"encombrement":4,"quantite":1,"qualite":0,"cout":50,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":13,"categorie_parade":"epees-lourdes","dommages":"5","penetration":0,"force":"13","competence":"Epée à 2 mains","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1674002002073,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"65SRmXVcyiG5ZW9l","name":"Cuillère de fer","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cuillere_fer.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.65SRmXVcyiG5ZW9l"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"7B9sKLf4ipRyyEjF","name":"Bouclier lourd","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_grand.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.7B9sKLf4ipRyyEjF"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":8,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":20,"categorie_parade":"boucliers","dommages":"0","penetration":0,"force":"13","competence":"Bouclier","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1674002002073,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"6MVWA3DYbpw8122A","name":"Entonnoir de fer","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/entonnoir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.6MVWA3DYbpw8122A"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"7YuWWsFIuZgakGUS","name":"Mortier en marbre","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/mortier.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.7YuWWsFIuZgakGUS"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1674002002073,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"6s5QjArwz9w9JIGL","name":"Double dragonne","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/double_dragonne.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.6s5QjArwz9w9JIGL"}},"system":{"description":"<p>Apparue vers la fin du Second Âge, c’était<em> une grande épée à deux mains</em>. Encombrante et prohibant le bouclier, c’était avant tout une épée de duel et de frime.</p>","descriptionmj":"","equipe":false,"encombrement":4,"quantite":1,"qualite":0,"cout":50,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":13,"categorie_parade":"epees-lourdes","dommages":"5","penetration":0,"force":"13","competence":"Epée à 2 mains","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"7c7CO626TCo4lg8b","name":"Petite scie cadre","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/scie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.7c7CO626TCo4lg8b"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1674002002073,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Luth","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/luth.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.bgkEBYUEFLvAaeVf"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":7,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074487919,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"_id":"72CKhDHc22VSnDX1"}
|
||||||
{"_id":"7u9yAlaFhKcVdEC6","name":"Matériel de chirurgie","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/materiel_chirurgie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.7u9yAlaFhKcVdEC6"}},"system":{"description":"<p>(pincettes, lancette, crin, aiguille)</p>","descriptionmj":"","encombrement":0.06,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1674002002074,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"7B9sKLf4ipRyyEjF","name":"Bouclier lourd","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_grand.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.7B9sKLf4ipRyyEjF"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":8,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":20,"categorie_parade":"boucliers","dommages":"0","penetration":0,"force":"13","competence":"Bouclier","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"8bwP6zncdFP0O9ew","name":"Corde (10 m)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/corde.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.8bwP6zncdFP0O9ew"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1674002002074,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"7YuWWsFIuZgakGUS","name":"Mortier en marbre","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/mortier.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.7YuWWsFIuZgakGUS"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"92GDNmNVa2u0gzpx","name":"Massette","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/massette.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.92GDNmNVa2u0gzpx"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"","dommages":"2","penetration":0,"force":"9","competence":"Masse à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"masse"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1674002002074,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"7c7CO626TCo4lg8b","name":"Petite scie cadre","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/scie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.7c7CO626TCo4lg8b"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"9cLkTDugz84gpHUB","name":"Bitume de Camphre","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bitume_de_camphre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.9cLkTDugz84gpHUB"}},"system":{"description":"<p>Crème sirupeuse grisâtre.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1674254980026,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"7u9yAlaFhKcVdEC6","name":"Matériel de chirurgie","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/materiel_chirurgie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.7u9yAlaFhKcVdEC6"}},"system":{"description":"<p>(pincettes, lancette, crin, aiguille)</p>","descriptionmj":"","encombrement":0.06,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1676074487963,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"A3jx5dPkk5IeXSXn","name":"Lait de lune","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lait_de_lune.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.A3jx5dPkk5IeXSXn"}},"system":{"description":"<p>Fluide.</p>\n<p>Lait de laie.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1674255045991,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"8bwP6zncdFP0O9ew","name":"Corde (10 m)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/corde.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.8bwP6zncdFP0O9ew"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Bronze (10 deniers)","type":"monnaie","img":"systems/foundryvtt-reve-de-dragon/icons/objets/piece_bronze_epees.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.hifMbbRrRdQxflsx"}},"_id":"A8UcYUIIlb6YfczN","system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}]},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1674002002074,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"92GDNmNVa2u0gzpx","name":"Massette","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/massette.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.92GDNmNVa2u0gzpx"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"","dommages":"2","penetration":0,"force":"9","competence":"Masse à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"masse"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"A9nMgTyEwYzdA0zT","name":"Manteau de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/manteau_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.A9nMgTyEwYzdA0zT"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1674002002074,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"9cLkTDugz84gpHUB","name":"Bitume de Camphre","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bitume_de_camphre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.9cLkTDugz84gpHUB"}},"system":{"description":"<p>Crème sirupeuse grisâtre.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"AOQsKTjIbcy8NV9t","name":"Pierre à aiguiser","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pierre_a_aiguiser.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.AOQsKTjIbcy8NV9t"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1674002002074,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"A3jx5dPkk5IeXSXn","name":"Lait de lune","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lait_de_lune.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.A3jx5dPkk5IeXSXn"}},"system":{"description":"<p>Fluide.</p>\n<p>Lait de laie.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"As5kYvyOrWrr8KJm","name":"Etui à luth de cuir","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/etui_luth.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.As5kYvyOrWrr8KJm"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1674002002074,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Bronze (10 deniers)","type":"monnaie","img":"systems/foundryvtt-reve-de-dragon/icons/objets/piece_bronze_epees.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.hifMbbRrRdQxflsx"}},"_id":"A8UcYUIIlb6YfczN","system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}]},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"B2BhuxveVKMnD8fe","name":"Bottes de cuir souple","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bottes_de_cuir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.B2BhuxveVKMnD8fe"}},"system":{"description":"","descriptionmj":"","encombrement":0.4,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"A9nMgTyEwYzdA0zT","name":"Manteau de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/manteau_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.A9nMgTyEwYzdA0zT"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"BQPhNy9AUCpEGgFg","name":"Couteau de cuisine","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/couteau-cuisine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.BQPhNy9AUCpEGgFg"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.2,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":6,"categorie_parade":"dagues","dommages":"1","penetration":0,"force":"0","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.4","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1674573404232,"lastModifiedBy":"F2zvQUIw6mQepDqs"}}
|
{"_id":"AOQsKTjIbcy8NV9t","name":"Pierre à aiguiser","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pierre_a_aiguiser.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.AOQsKTjIbcy8NV9t"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"CMtQM06J3BZsHHxH","name":"Sandales","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sandales.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.CMtQM06J3BZsHHxH"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Alêne","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/poincon_2.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.F6ZHJth4t0PA5PMB"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1676074487919,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"_id":"AWQTOfz3HoidgUOf"}
|
||||||
{"_id":"CQSxJv1mgmIeMCbM","name":"Grappin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/grappin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.CQSxJv1mgmIeMCbM"}},"system":{"description":"","descriptionmj":"","encombrement":0.5,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"As5kYvyOrWrr8KJm","name":"Etui à luth de cuir","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/etui_luth.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.As5kYvyOrWrr8KJm"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"ElweMV283IUpqaik","name":"Sable-Poudre","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sable_poudre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.ElweMV283IUpqaik"}},"system":{"description":"<p>Granulés. Poudre blanche.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1674255033741,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"B2BhuxveVKMnD8fe","name":"Bottes de cuir souple","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bottes_de_cuir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.B2BhuxveVKMnD8fe"}},"system":{"description":"","descriptionmj":"","encombrement":0.4,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Eospy1EFNlhgOyXc","name":"Lacet de cuir (1 m)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lacet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Eospy1EFNlhgOyXc"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.06,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"BQPhNy9AUCpEGgFg","name":"Couteau de cuisine","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/couteau-cuisine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.BQPhNy9AUCpEGgFg"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.2,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":6,"categorie_parade":"dagues","dommages":"1","penetration":0,"force":"0","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"F6ZHJth4t0PA5PMB","name":"Alêne, poinçon","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/poincon_2.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.F6ZHJth4t0PA5PMB"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"CMtQM06J3BZsHHxH","name":"Sandales","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sandales.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.CMtQM06J3BZsHHxH"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"FH3mSvdebfhIL2Af","name":"Topazoïne","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/topazoine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.FH3mSvdebfhIL2Af"}},"system":{"description":"<p>Granulés. Coquille d'oeuf de cane broyé.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1674255027032,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"CQSxJv1mgmIeMCbM","name":"Grappin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/grappin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.CQSxJv1mgmIeMCbM"}},"system":{"description":"","descriptionmj":"","encombrement":0.5,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"FaNRC7YQzibSdqZU","name":"Plume de fer","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/plume_de_fer.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.FaNRC7YQzibSdqZU"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Râpe","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lime.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Lz4dA2NwxdSZ3FZK"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1676074487919,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"_id":"DJIvE20bU09h4YXw"}
|
||||||
{"_id":"Flx5inKGs1GQKoYq","name":"Tube à parchemins","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tube_parchemin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Flx5inKGs1GQKoYq"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":1.3,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"ElweMV283IUpqaik","name":"Sable-Poudre","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sable_poudre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.ElweMV283IUpqaik"}},"system":{"description":"<p>Granulés. Poudre blanche.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"GAJIShPe7WugrIVO","name":"Manteau de fourrure","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/manteau_fourrure.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.GAJIShPe7WugrIVO"}},"system":{"description":"<p>En fonction de la qualité de la fourrure, le prix d'un tel manteau peut varier de 1 à 20 sols.</p>","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Eospy1EFNlhgOyXc","name":"Lacet de cuir (1 m)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lacet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Eospy1EFNlhgOyXc"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.06,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"GiquTnEsiVZn7m6Y","name":"Bas de soie","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bas_soie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.GiquTnEsiVZn7m6Y"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"FH3mSvdebfhIL2Af","name":"Topazoïne","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/topazoine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.FH3mSvdebfhIL2Af"}},"system":{"description":"<p>Granulés. Coquille d'oeuf de cane broyé.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Gp9ZrwXkqZbJoVVT","name":"1 m² de toile de voile","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/voile.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Gp9ZrwXkqZbJoVVT"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"FaNRC7YQzibSdqZU","name":"Plume de fer","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/plume_de_fer.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.FaNRC7YQzibSdqZU"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"HdciYu5J2SrJO8e3","name":"Épée gnome","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_gnome.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.HdciYu5J2SrJO8e3"}},"system":{"description":"<p>C’est une épée <em>courte</em>, essentiellement fabriquée et portée par les Gnomes au Second Âge.</p>","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":12,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":12,"categorie_parade":"epees-courtes","dommages":"2","penetration":0,"force":"8","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeegnome"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Flx5inKGs1GQKoYq","name":"Tube à parchemins","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tube_parchemin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Flx5inKGs1GQKoYq"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":1.3,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"HjbB4f1CDz96Hv88","name":"Rasoir","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/rasoir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.HjbB4f1CDz96Hv88"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":0,"categorie_parade":"dagues","dommages":"1","penetration":0,"force":"0","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1674002002075,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"GAJIShPe7WugrIVO","name":"Manteau de fourrure","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/manteau_fourrure.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.GAJIShPe7WugrIVO"}},"system":{"description":"<p>En fonction de la qualité de la fourrure, le prix d'un tel manteau peut varier de 1 à 20 sols.</p>","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1676074487964,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"HsIJSPQ46cec22Y2","name":"Couverture de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/couverture_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.HsIJSPQ46cec22Y2"}},"system":{"description":"","descriptionmj":"","encombrement":0.6,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1674002002076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"GiquTnEsiVZn7m6Y","name":"Bas de soie","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bas_soie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.GiquTnEsiVZn7m6Y"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Ig9qIzaZ5SveXLF7","name":"Pelle","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pelle.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Ig9qIzaZ5SveXLF7"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1674002002076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Gp9ZrwXkqZbJoVVT","name":"1 m² de toile de voile","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/voile.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Gp9ZrwXkqZbJoVVT"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"InTxnjInfBYHsqcR","name":"Poêle à frire (40 cm)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/poele.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.InTxnjInfBYHsqcR"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1674002002076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"HdciYu5J2SrJO8e3","name":"Épée gnome","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_gnome.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.HdciYu5J2SrJO8e3"}},"system":{"description":"<p>C’est une épée <em>courte</em>, essentiellement fabriquée et portée par les Gnomes au Second Âge.</p>","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":12,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":12,"categorie_parade":"epees-courtes","dommages":"2","penetration":0,"force":"8","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeegnome"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"JXMef7FXVOG1XYWO","name":"Elixir des gnomes","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/elixir_des_gnomes.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.JXMef7FXVOG1XYWO"}},"system":{"description":"<p>Fluide.</p>\n<p>Liqueur violette.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1674255058976,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"HjbB4f1CDz96Hv88","name":"Rasoir","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/rasoir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.HjbB4f1CDz96Hv88"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":0,"categorie_parade":"dagues","dommages":"1","penetration":0,"force":"0","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"JfxFBlokIegRWTDo","name":"Torche 1/2 heure (60 min)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/torche.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.JfxFBlokIegRWTDo"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.02,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1674002002076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"HsIJSPQ46cec22Y2","name":"Couverture de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/couverture_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.HsIJSPQ46cec22Y2"}},"system":{"description":"","descriptionmj":"","encombrement":0.6,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"JhQZDbsmFZBLRcln","name":"Sac en jute (20 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sac_jute_20.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.JhQZDbsmFZBLRcln"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.04,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":10,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1674002002076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Ig9qIzaZ5SveXLF7","name":"Pelle","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pelle.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Ig9qIzaZ5SveXLF7"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"K4n2JuDnoHDUPCZG","name":"Bouilloire de fer (2 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouilloire.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.K4n2JuDnoHDUPCZG"}},"system":{"description":"","descriptionmj":"","encombrement":0.5,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1674002002076,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"InTxnjInfBYHsqcR","name":"Poêle à frire (40 cm)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/poele.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.InTxnjInfBYHsqcR"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"KQZIK8ltQ3sQiDGe","name":"Mailles de Fer","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/mailles.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.KQZIK8ltQ3sQiDGe"}},"system":{"description":"<p>Grand haubert de mailles avec capuche À enfiler sur une cotte de cuir souple ou de drap matelassé) + bottes de cuir / métal.</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":6,"quantite":1,"qualite":0,"cout":50,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"protection":"5","deterioration":null,"malus":-4},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1674002002077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"JXMef7FXVOG1XYWO","name":"Elixir des gnomes","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/elixir_des_gnomes.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.JXMef7FXVOG1XYWO"}},"system":{"description":"<p>Fluide.</p>\n<p>Liqueur violette.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"KlydiUbayqBgJB6J","name":"Tablette de cire","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tablette_cire.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.KlydiUbayqBgJB6J"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1674002002077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"JfxFBlokIegRWTDo","name":"Torche 1/2 heure (60 min)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/torche.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.JfxFBlokIegRWTDo"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.02,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"KvzSNxISkWDoilO8","name":"Gemme Inconnue","type":"objet","flags":{"core":{"sourceId":"Item.V3V3wUXNCG6gzJFB"}},"img":"systems/foundryvtt-reve-de-dragon/icons/gemmes/seliphane.webp","effects":[],"system":{"description":"","descriptionmj":"","encombrement":null,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1674002002077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"JhQZDbsmFZBLRcln","name":"Sac en jute (20 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sac_jute_20.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.JhQZDbsmFZBLRcln"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.04,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":10,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"LZPEdSIv3KywCwdk","name":"Liquide","type":"munition","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_neutre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.LZPEdSIv3KywCwdk"}},"system":{"description":"<p>1 mesure (20cl) d'un liquide.</p>\n<p><em>(à modifier/compléter)</em></p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1674002002077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"K4n2JuDnoHDUPCZG","name":"Bouilloire de fer (2 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouilloire.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.K4n2JuDnoHDUPCZG"}},"system":{"description":"","descriptionmj":"","encombrement":0.5,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"LaAP5tsP1Sc43hKO","name":"Lanterne à huile","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lanterne_huile.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.LaAP5tsP1Sc43hKO"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.3,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1674002002077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"KQZIK8ltQ3sQiDGe","name":"Mailles de Fer","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/mailles.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.KQZIK8ltQ3sQiDGe"}},"system":{"description":"<p>Grand haubert de mailles avec capuche À enfiler sur une cotte de cuir souple ou de drap matelassé) + bottes de cuir / métal.</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":6,"quantite":1,"qualite":0,"cout":50,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"protection":"5","deterioration":null,"malus":-4},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"LkE8EjPfao9m6Rn7","name":"Huile de Sélikanthe","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/huile_de_selikanthe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.LkE8EjPfao9m6Rn7"}},"system":{"description":"<p>Fluide.</p>\n<p>Liquide légèrement huileux.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1674255051160,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"KlydiUbayqBgJB6J","name":"Tablette de cire","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tablette_cire.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.KlydiUbayqBgJB6J"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Lz4dA2NwxdSZ3FZK","name":"Lime, Râpe","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lime.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Lz4dA2NwxdSZ3FZK"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1674002002077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"KvzSNxISkWDoilO8","name":"Gemme Inconnue","type":"objet","flags":{"core":{"sourceId":"Item.V3V3wUXNCG6gzJFB"}},"img":"systems/foundryvtt-reve-de-dragon/icons/gemmes/seliphane.webp","effects":[],"system":{"description":"","descriptionmj":"","encombrement":null,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"M1RgJDuQUvxjqJVV","name":"Chandelle de suif (1 heure)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chandelle.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.M1RgJDuQUvxjqJVV"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.02,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1674002002077,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"LZPEdSIv3KywCwdk","name":"Liquide","type":"munition","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_neutre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.LZPEdSIv3KywCwdk"}},"system":{"description":"<p>1 mesure (20cl) d'un liquide.</p>\n<p><em>(à modifier/compléter)</em></p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"MGvyXFQJpv6nNynl","name":"Masse lourde","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/masse_lourde.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.MGvyXFQJpv6nNynl"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":10,"categorie_parade":"","dommages":"3/4","penetration":0,"force":"12/11","competence":"Masse à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"masse"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"LaAP5tsP1Sc43hKO","name":"Lanterne à huile","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lanterne_huile.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.LaAP5tsP1Sc43hKO"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.3,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"MQxgfYTEQEUhG116","name":"Épée bâtarde","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_batarde.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.MQxgfYTEQEUhG116"}},"system":{"description":"<p>Comme son nom l’indique, c’est une <em>bâtarde </em>de l'épée longue et de l'épée sorde, à la fois longue et large, pouvant s’utiliser à une ou deux mains.</p>","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":30,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":14,"categorie_parade":"epees-lourdes","dommages":"4/5","penetration":0,"force":"13/12","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"epeebatarde"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"LkE8EjPfao9m6Rn7","name":"Huile de Sélikanthe","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/huile_de_selikanthe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.LkE8EjPfao9m6Rn7"}},"system":{"description":"<p>Fluide.</p>\n<p>Liquide légèrement huileux.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1676074487965,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Mbh2M8JS1Rf0vxEX","name":"Harpe","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/harpe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Mbh2M8JS1Rf0vxEX"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"M1RgJDuQUvxjqJVV","name":"Chandelle de suif (1 heure)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chandelle.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.M1RgJDuQUvxjqJVV"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.02,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"NCp2kdTKmQGyAh1U","name":"Dague","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/dague.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sheetClass":"","sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.NCp2kdTKmQGyAh1U"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"dagues","dommages":"1","penetration":0,"force":"7","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"MGvyXFQJpv6nNynl","name":"Masse lourde","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/masse_lourde.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.MGvyXFQJpv6nNynl"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":10,"categorie_parade":"","dommages":"3/4","penetration":0,"force":"12/11","competence":"Masse à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"masse"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"NNLhxjFsoJVdFuit","name":"Bouteille de verre (1 litre)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouteille_verre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.NNLhxjFsoJVdFuit"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.7,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"MQxgfYTEQEUhG116","name":"Épée bâtarde","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_batarde.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.MQxgfYTEQEUhG116"}},"system":{"description":"<p>Comme son nom l’indique, c’est une <em>bâtarde </em>de l'épée longue et de l'épée sorde, à la fois longue et large, pouvant s’utiliser à une ou deux mains.</p>","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":30,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":14,"categorie_parade":"epees-lourdes","dommages":"4/5","penetration":0,"force":"13/12","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"epeebatarde"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"OXFFRZOqlhZDJas3","name":"Béret de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/beret_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.OXFFRZOqlhZDJas3"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Mbh2M8JS1Rf0vxEX","name":"Harpe","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/harpe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Mbh2M8JS1Rf0vxEX"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"OYWzXiQUFsjU5AF2","name":"Perles de Bjwal","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/perles_bjwal.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.OYWzXiQUFsjU5AF2"}},"system":{"description":"<p>Petits granulés translucides.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1674255036916,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"NCp2kdTKmQGyAh1U","name":"Dague","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/dague.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sheetClass":"","sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.NCp2kdTKmQGyAh1U"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"dagues","dommages":"1","penetration":0,"force":"7","competence":"Dague","lancer":"Dague de jet","tir":"","portee_courte":3,"portee_moyenne":8,"portee_extreme":15,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"P0yc6QfgKVmM0fpu","name":"Ecuelle de grès","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/ecuelle_gres.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.P0yc6QfgKVmM0fpu"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"NNLhxjFsoJVdFuit","name":"Bouteille de verre (1 litre)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouteille_verre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.NNLhxjFsoJVdFuit"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.7,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PAqV7Fj8AFEpfEpy","name":"Provisions non-cuites","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/objets/provision_crue.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.2P30CKBRVIPiTf3Z"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":1,"exotisme":0,"cuisinier":"","boisson":false,"desaltere":0,"alcoolise":false,"force":0},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"OXFFRZOqlhZDJas3","name":"Béret de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/beret_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.OXFFRZOqlhZDJas3"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PH2J4zR0hwXSg0vc","name":"Charbon de bois 1 kg","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/charbon.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PH2J4zR0hwXSg0vc"}},"system":{"description":"","descriptionmj":"","encombrement":0.04,"quantite":1,"qualite":0,"cout":0.06,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"OYWzXiQUFsjU5AF2","name":"Perles de Bjwal","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/perles_bjwal.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.OYWzXiQUFsjU5AF2"}},"system":{"description":"<p>Petits granulés translucides.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PSc92VlQCdNnbPlg","name":"Lance courte","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/lance.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PSc92VlQCdNnbPlg"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":5,"categorie_parade":"lances","dommages":"2","penetration":0,"force":"8","competence":"Lance","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"lance"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"P0yc6QfgKVmM0fpu","name":"Ecuelle de grès","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/ecuelle_gres.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.P0yc6QfgKVmM0fpu"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PaJoTirnA6h4F3pH","name":"Hameçon","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/hame%C3%A7on.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PaJoTirnA6h4F3pH"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1674002002078,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"PAqV7Fj8AFEpfEpy","name":"Provisions non-cuites","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/objets/provision_crue.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.2P30CKBRVIPiTf3Z"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":1,"exotisme":0,"cuisinier":"","boisson":false,"desaltere":0,"alcoolise":false,"force":0},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PkDJ36j7mS3Kfetp","name":"Bouteille de grès (1 litre)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouteille_gres.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PkDJ36j7mS3Kfetp"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"PH2J4zR0hwXSg0vc","name":"Charbon de bois 1 kg","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/charbon.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PH2J4zR0hwXSg0vc"}},"system":{"description":"","descriptionmj":"","encombrement":0.04,"quantite":1,"qualite":0,"cout":0.06,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PrnJrG50u1UPdlJN","name":"Liqueur de Bagdol","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/liqueur_de_bagdol.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PrnJrG50u1UPdlJN"}},"system":{"description":"<p>Fluide. Liquide noir et odorant.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1674255043087,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"PSc92VlQCdNnbPlg","name":"Lance courte","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/lance.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PSc92VlQCdNnbPlg"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":5,"categorie_parade":"lances","dommages":"2","penetration":0,"force":"8","competence":"Lance","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"lance"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PuuPn6WGfU8uBAyb","name":"Robe de soie","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_soie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PuuPn6WGfU8uBAyb"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"PaJoTirnA6h4F3pH","name":"Hameçon","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/hame%C3%A7on.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PaJoTirnA6h4F3pH"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1676074487966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Qh4Tp7lZ6wLnX4w0","name":"Bâton","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/baton.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Qh4Tp7lZ6wLnX4w0"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"","dommages":"1","penetration":0,"force":"9","competence":"Masse à 2 mains","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":false,"initpremierround":"baton"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"PkDJ36j7mS3Kfetp","name":"Bouteille de grès (1 litre)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bouteille_gres.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PkDJ36j7mS3Kfetp"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"RKr1ZhTvC6poiNa1","name":"Gros Clou","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gros_clou.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.RKr1ZhTvC6poiNa1"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.05,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"PrnJrG50u1UPdlJN","name":"Liqueur de Bagdol","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/liqueur_de_bagdol.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PrnJrG50u1UPdlJN"}},"system":{"description":"<p>Fluide. Liquide noir et odorant.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"RNxCQWMDy06uQ8uj","name":"Ecuelle de fer","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/ecuelle_fer.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.RNxCQWMDy06uQ8uj"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"PuuPn6WGfU8uBAyb","name":"Robe de soie","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_soie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.PuuPn6WGfU8uBAyb"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"RSni2r8jLccvkc9i","name":"Cristal alchimique","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cristal_alchimique.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.RSni2r8jLccvkc9i"}},"system":{"description":"","descriptionmj":"","encombrement":0.09,"quantite":1,"qualite":0,"cout":4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Qh4Tp7lZ6wLnX4w0","name":"Bâton","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/baton.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Qh4Tp7lZ6wLnX4w0"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"","dommages":"1","penetration":0,"force":"9","competence":"Masse à 2 mains","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":false,"initpremierround":"baton"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"RWYaq8tnpgrkh5ED","name":"Flacon de grès (40 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/flacon_gres1.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.RWYaq8tnpgrkh5ED"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"RKr1ZhTvC6poiNa1","name":"Gros Clou","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gros_clou.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.RKr1ZhTvC6poiNa1"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.05,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Reqo8GC9p7GI9k9N","name":"Chope de grès (20 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chope_gres.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Reqo8GC9p7GI9k9N"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"RNxCQWMDy06uQ8uj","name":"Ecuelle de fer","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/ecuelle_fer.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.RNxCQWMDy06uQ8uj"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Ri5QtS98FTfgHk2N","name":"Javeline","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/javeline.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Ri5QtS98FTfgHk2N"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":5,"categorie_parade":"lances","dommages":"1","penetration":0,"force":"7","competence":"Lance","lancer":"Javelot","tir":"","portee_courte":6,"portee_moyenne":12,"portee_extreme":20,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"RSni2r8jLccvkc9i","name":"Cristal alchimique","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cristal_alchimique.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.RSni2r8jLccvkc9i"}},"system":{"description":"","descriptionmj":"","encombrement":0.09,"quantite":1,"qualite":0,"cout":4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Ro5cOOtLLB0lMlzl","name":"Javelot","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/javelot.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Ro5cOOtLLB0lMlzl"}},"system":{"description":"<p>Chaque point de force au dessus de 10 augmente les portées de 1m.</p>\n<p>Chaque point de force en dessous de 9 diminue les portées de 1m.</p>","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":0,"categorie_parade":"lances","dommages":"1","penetration":0,"force":"0","competence":"Lance","lancer":"Javelot","tir":"","portee_courte":6,"portee_moyenne":12,"portee_extreme":20,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"RWYaq8tnpgrkh5ED","name":"Flacon de grès (40 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/flacon_gres1.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.RWYaq8tnpgrkh5ED"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"RyW0z9Y5UeZSYjFZ","name":"Savon 500g","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/savon.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.RyW0z9Y5UeZSYjFZ"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Herbe à pipe","type":"herbe","img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Endorlotte.webp","system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0.01,"cout":0.01,"milieu":"","environnement":[],"sust":0,"exotisme":0,"niveau":0,"base":0,"categorie":"Autre"},"effects":[],"flags":{"core":{"sourceId":"Item.wxmHkhTTzPNepN4d"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1676073283027,"modifiedTime":1676074487920,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"_id":"RcfER27g7gX4YGFd"}
|
||||||
{"_id":"S3bLtbXe6BzEFCjt","name":"Plaques de Fer","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/armure_plaques.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.S3bLtbXe6BzEFCjt"}},"system":{"description":"<p>L'armure classique du chevalier. Armure complète de plaques (heaume, cuirasse, épaulières, cubitières, ventrière, cuissards, jambières).</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":8,"quantite":1,"qualite":0,"cout":100,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"protection":"6","deterioration":0,"malus":-6},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002079,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Reqo8GC9p7GI9k9N","name":"Chope de grès (20 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chope_gres.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Reqo8GC9p7GI9k9N"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"SZyBQbInuUGASlGb","name":"Tambourin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tambourin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.SZyBQbInuUGASlGb"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002080,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Ri5QtS98FTfgHk2N","name":"Javeline","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/javeline.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Ri5QtS98FTfgHk2N"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":5,"categorie_parade":"lances","dommages":"1","penetration":0,"force":"7","competence":"Lance","lancer":"Javelot","tir":"","portee_courte":6,"portee_moyenne":12,"portee_extreme":20,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Sm28dG9isppoQzPQ","name":"Bas de lin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bas_lin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Sm28dG9isppoQzPQ"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002080,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Ro5cOOtLLB0lMlzl","name":"Javelot","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/javelot.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Ro5cOOtLLB0lMlzl"}},"system":{"description":"<p>Chaque point de force au dessus de 10 augmente les portées de 1m.</p>\n<p>Chaque point de force en dessous de 9 diminue les portées de 1m.</p>","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":0,"categorie_parade":"lances","dommages":"1","penetration":0,"force":"0","competence":"Lance","lancer":"Javelot","tir":"","portee_courte":6,"portee_moyenne":12,"portee_extreme":20,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"SrV0r5hnGdKeSIHR","name":"Cuillère de bois","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cuillere_bois.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.SrV0r5hnGdKeSIHR"}},"system":{"description":"","descriptionmj":"","encombrement":0.03,"quantite":1,"qualite":0,"cout":0.03,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002080,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"RyW0z9Y5UeZSYjFZ","name":"Savon 500g","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/savon.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.RyW0z9Y5UeZSYjFZ"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"SsnGNjTekvB50uWa","name":"Chapeau de cuir souple","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chapeau_cuir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.SsnGNjTekvB50uWa"}},"system":{"description":"","descriptionmj":"","encombrement":0.08,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002081,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"S3bLtbXe6BzEFCjt","name":"Plaques de Fer","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/armure_plaques.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.S3bLtbXe6BzEFCjt"}},"system":{"description":"<p>L'armure classique du chevalier. Armure complète de plaques (heaume, cuirasse, épaulières, cubitières, ventrière, cuissards, jambières).</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":8,"quantite":1,"qualite":0,"cout":100,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"protection":"6","deterioration":0,"malus":-6},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"TKsUXJq9w7ezcFGQ","name":"Hache de bataille","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/hache_bataille.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.TKsUXJq9w7ezcFGQ"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":8,"categorie_parade":"haches","dommages":"3/4","penetration":0,"force":"12/11","competence":"Hache à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"hachebataille"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002081,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Carreau d'arbalète","type":"munition","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fleche.webp","system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}]},"effects":[],"flags":{"core":{"sourceId":"Item.SHsq6zY7THX0pF0r"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1676067642744,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"SHsq6zY7THX0pF0r","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"_id":"TY6Ft8a6WfxD6pD9","name":"Bobineau de fil","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bobineau.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.TY6Ft8a6WfxD6pD9"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002081,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"SZyBQbInuUGASlGb","name":"Tambourin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tambourin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.SZyBQbInuUGASlGb"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"UDmq6CY3NsttcHe4","name":"Peigne en corne","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/peigne.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UDmq6CY3NsttcHe4"}},"system":{"description":"","descriptionmj":"","encombrement":0.04,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002081,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Sm28dG9isppoQzPQ","name":"Bas de lin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bas_lin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Sm28dG9isppoQzPQ"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"UE79xKWXTwYAn70K","name":"Arme d’hast","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/hast.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UE79xKWXTwYAn70K"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":4,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"hast","dommages":"4","penetration":0,"force":"12","competence":"Armes d'hast","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002081,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"SrV0r5hnGdKeSIHR","name":"Cuillère de bois","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cuillere_bois.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.SrV0r5hnGdKeSIHR"}},"system":{"description":"","descriptionmj":"","encombrement":0.03,"quantite":1,"qualite":0,"cout":0.03,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"UICiMF3wBeLsqm8L","name":"Pipe en bois","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pipe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UICiMF3wBeLsqm8L"}},"system":{"description":"","descriptionmj":"","encombrement":0.04,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002081,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"SsnGNjTekvB50uWa","name":"Chapeau de cuir souple","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chapeau_cuir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.SsnGNjTekvB50uWa"}},"system":{"description":"","descriptionmj":"","encombrement":0.08,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"UMfXFhVhdoVQVEKy","name":"Fronde","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fronde.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UMfXFhVhdoVQVEKy"}},"system":{"description":"<p>Peut tirer tous les rounds.</p>","descriptionmj":"","equipe":false,"encombrement":0.08,"quantite":1,"qualite":0,"cout":0.6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":0,"categorie_parade":"","dommages":"1","penetration":0,"force":"0","competence":"","lancer":"","tir":"Fronde","portee_courte":8,"portee_moyenne":15,"portee_extreme":25,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1674002002081,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"TKsUXJq9w7ezcFGQ","name":"Hache de bataille","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/hache_bataille.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.TKsUXJq9w7ezcFGQ"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":8,"categorie_parade":"haches","dommages":"3/4","penetration":0,"force":"12/11","competence":"Hache à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"hachebataille"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"UYXXggulNwnodaOt","name":"Chope de fer (20 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chope_fer.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UYXXggulNwnodaOt"}},"system":{"description":"","descriptionmj":"","encombrement":0.08,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206027,"modifiedTime":1674002002081,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"TY6Ft8a6WfxD6pD9","name":"Bobineau de fil","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bobineau.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.TY6Ft8a6WfxD6pD9"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"UczsYTAoP9koA2SL","name":"Bourse, sachet de tissu","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bourse_sachet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UczsYTAoP9koA2SL"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.05,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"contenu":[],"capacite":0.3,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"UDmq6CY3NsttcHe4","name":"Peigne en corne","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/peigne.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UDmq6CY3NsttcHe4"}},"system":{"description":"","descriptionmj":"","encombrement":0.04,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"UsyV9n0byCeYirNC","name":"Esparlongue","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/esparlongue.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UsyV9n0byCeYirNC"}},"system":{"description":"<p>C’est une épée semblable à la <em>rapière</em>, 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 <strong>demi-dragonne</strong>, é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.</p>","descriptionmj":"","equipe":false,"encombrement":1.5,"quantite":1,"qualite":0,"cout":20,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":9,"categorie_parade":"epees-longues","dommages":"2","penetration":0,"force":"10","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"esparlongue"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"UE79xKWXTwYAn70K","name":"Arme d’hast","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/hast.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UE79xKWXTwYAn70K"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":4,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"hast","dommages":"4","penetration":0,"force":"12","competence":"Armes d'hast","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Uxk2tvEqtrmYScjK","name":"Pot à braise","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pot_a_braise.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Uxk2tvEqtrmYScjK"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"UICiMF3wBeLsqm8L","name":"Pipe en bois","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pipe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UICiMF3wBeLsqm8L"}},"system":{"description":"","descriptionmj":"","encombrement":0.04,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"VsjRwh9Z9PMpFKdI","name":"Craie 1 bâton","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/craie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.VsjRwh9Z9PMpFKdI"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"UMfXFhVhdoVQVEKy","name":"Fronde","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fronde.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UMfXFhVhdoVQVEKy"}},"system":{"description":"<p>Peut tirer tous les rounds.</p>","descriptionmj":"","equipe":false,"encombrement":0.08,"quantite":1,"qualite":0,"cout":0.6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":0,"categorie_parade":"","dommages":"1","penetration":0,"force":"0","competence":"","lancer":"","tir":"Fronde","portee_courte":8,"portee_moyenne":15,"portee_extreme":25,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"WC1jMDKcxEJQWGOR","name":"Burette de fer blanc (40 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/burette.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.WC1jMDKcxEJQWGOR"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"UYXXggulNwnodaOt","name":"Chope de fer (20 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chope_fer.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UYXXggulNwnodaOt"}},"system":{"description":"","descriptionmj":"","encombrement":0.08,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206027,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"WTHZdtgf6lHUSKDx","name":"Fouet","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fouet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.WTHZdtgf6lHUSKDx"}},"system":{"description":"<p>Provoque des dégâts \"non mortels\".</p>\n<p>Les armures sont majorées de 2.</p>\n<p>Si la protection atteint une valeur de 5 ou plus, le fouet ne peut causer de dégât.</p>","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":0,"categorie_parade":"","dommages":"1","penetration":-1,"force":"0","competence":"","lancer":"Fouet","tir":"","portee_courte":2,"portee_moyenne":2,"portee_extreme":3,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"UczsYTAoP9koA2SL","name":"Bourse, sachet de tissu","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bourse_sachet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UczsYTAoP9koA2SL"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.05,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"contenu":[],"capacite":0.3,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"WTWXZeoK5HpCrGFy","name":"Hachette","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/hachette.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.WTWXZeoK5HpCrGFy"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":6,"categorie_parade":"haches","dommages":"2","penetration":0,"force":"8","competence":"Hache à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.4","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1674572410636,"lastModifiedBy":"F2zvQUIw6mQepDqs"}}
|
{"_id":"UsyV9n0byCeYirNC","name":"Esparlongue","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/esparlongue.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.UsyV9n0byCeYirNC"}},"system":{"description":"<p>C’est une épée semblable à la <em>rapière</em>, 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 <strong>demi-dragonne</strong>, é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.</p>","descriptionmj":"","equipe":false,"encombrement":1.5,"quantite":1,"qualite":0,"cout":20,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":9,"categorie_parade":"epees-longues","dommages":"2","penetration":0,"force":"10","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"esparlongue"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"XTZVrcMNofAviP63","name":"Cire d'abeille 500g","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cire.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.XTZVrcMNofAviP63"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Uxk2tvEqtrmYScjK","name":"Pot à braise","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pot_a_braise.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Uxk2tvEqtrmYScjK"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"XlKp5BvZX8A03fUg","name":"Sac à dos de cuir","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sac_a_dos.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.XlKp5BvZX8A03fUg"}},"system":{"description":"","descriptionmj":"","encombrement":0.4,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":25,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"VsjRwh9Z9PMpFKdI","name":"Craie 1 bâton","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/craie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.VsjRwh9Z9PMpFKdI"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"XoslLyWIJYY2RGzz","name":"Fiole de verre (20 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fiole_verre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.XoslLyWIJYY2RGzz"}},"system":{"description":"","descriptionmj":"","encombrement":0.06,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"WC1jMDKcxEJQWGOR","name":"Burette de fer blanc (40 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/burette.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.WC1jMDKcxEJQWGOR"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"XwuLVGasPJXzvC09","name":"Encre 20 cl","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/encre_20cl.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.XwuLVGasPJXzvC09"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"WTHZdtgf6lHUSKDx","name":"Fouet","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fouet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.WTHZdtgf6lHUSKDx"}},"system":{"description":"<p>Provoque des dégâts \"non mortels\".</p>\n<p>Les armures sont majorées de 2.</p>\n<p>Si la protection atteint une valeur de 5 ou plus, le fouet ne peut causer de dégât.</p>","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":0,"categorie_parade":"","dommages":"1","penetration":-1,"force":"0","competence":"","lancer":"Fouet","tir":"","portee_courte":2,"portee_moyenne":2,"portee_extreme":3,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"YHPrUuGGGTGZMNAg","name":"Bière","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_biere.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.u7lMLkVlFCXBj8Bc"}},"system":{"description":"<p>1 mesure (20cl) de bière.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":0,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":0.8,"alcoolise":true,"force":-1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1674002002082,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"WTWXZeoK5HpCrGFy","name":"Hachette","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/hachette.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.WTWXZeoK5HpCrGFy"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":6,"categorie_parade":"haches","dommages":"2","penetration":0,"force":"8","competence":"Hache à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"YNbbSGLnexiXNyXU","name":"Manteau de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/manteau_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.YNbbSGLnexiXNyXU"}},"system":{"description":"","descriptionmj":"","encombrement":0.8,"quantite":1,"qualite":0,"cout":0.6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1674002002083,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Ciseau à bois","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gouge.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.cVZbnh5cYxBx6P5b"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074352882,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"XEMiC8DxAZFjBj6g","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"_id":"Yh7VGX3BikmIjVQH","name":"Gourdin","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/gourdin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Yh7VGX3BikmIjVQH"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"","dommages":"1","penetration":0,"force":"7","competence":"Masse à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"gourdin"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1674002002083,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"XTZVrcMNofAviP63","name":"Cire d'abeille 500g","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cire.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.XTZVrcMNofAviP63"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Yyn39VDRnO6oA3Uq","name":"Echecs draconics en bois","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/echecs.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Yyn39VDRnO6oA3Uq"}},"system":{"description":"","descriptionmj":"","encombrement":0.5,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1674002002083,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"XlKp5BvZX8A03fUg","name":"Sac à dos de cuir","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sac_a_dos.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.XlKp5BvZX8A03fUg"}},"system":{"description":"","descriptionmj":"","encombrement":0.4,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":25,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Z0ij7qpoYeWMVocP","name":"Ceinturon de cuir","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/ceinturon.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Z0ij7qpoYeWMVocP"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":6,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1674002002083,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"XoslLyWIJYY2RGzz","name":"Fiole de verre (20 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fiole_verre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.XoslLyWIJYY2RGzz"}},"system":{"description":"","descriptionmj":"","encombrement":0.06,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"ZLda3pfrbiKucSea","name":"Cornebouffe","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cornebouffe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.NuwD0kiJyoqevKib"}},"system":{"description":"<p><span class=\"fontstyle0\">La cornebouffe est une préparation à base de gibier, élaborée dans les forêts proches de la mer par des chasseurs spécialisés : les </span><span class=\"fontstyle2\">cornebouffiers</span><span class=\"fontstyle0\">. Acheminée vers les ports, principaux consommateurs, elle constitue l’aliment de base de la plupart des marins.</span></p>\n<p><span class=\"fontstyle0\">Certains voyageurs qui l’ont expérimentée et en ont accepté l’exotisme, en transportent parfois en cas de disette. Pratiquement, il s’agit de gibier référentiellement cornu (bramart, cornicochon, mercureuil), que l’on cuit et recuit dans de l’eau de mer avec des herbes, jusqu’à obtenir une pâte, sorte de mastic, que l’on façonne en forme de galettes, puis que l’on laisse longuement sécher au soleil. On aboutit au final à des sortes de petites briques plates, de la taille d’une demi-main, de couleur vert-de-gris, et à peu près aussi dures que les briques véritables. La meilleure façon de consommer ces galettes est de les réhydrater avec de l’eau chaude, c’est la façon dite </span><span class=\"fontstyle2\">soupée </span><span class=\"fontstyle0\">: on obtient une sorte de soupe ou de bouillie gluante. L’autre façon, dite sèche, consiste à les grignoter telles quelles comme des biscuits, mais il est impératif de boire beaucoup par dessus, sous peine d’une soif torride accompagnée de maux d’estomac.</span></p>\n<p><span class=\"fontstyle0\">Légère, peu encombrante, et surtout nourrissante, une galette de cornebouffe suffit pour un repas. Quant au goût, eh bien... ceux qui disent que, tant qu’à y aller, autant manger directement des crottes de chien à la croque-au-sel, ne sont probablement que des enfants gâtés et difficiles.</span></p>\n<p><span class=\"fontstyle0\">Aliment de longue conservation (pratiquement inaltérable), la cornebouffe possède un des meilleurs rapports sustentation/encombrement.</span></p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.02,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"sust":3,"exotisme":-2,"cuisinier":"","boisson":false,"desaltere":0,"alcoolise":false,"force":0,"equipe":false,"resistance":0},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1674002002083,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"XwuLVGasPJXzvC09","name":"Encre 20 cl","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/encre_20cl.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.XwuLVGasPJXzvC09"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"ZaAKf4n8mtevbMM0","name":"Hydromel","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_biere.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.ZaAKf4n8mtevbMM0"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.04,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"sust":0,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":0.6,"alcoolise":true,"force":-4},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1674002002083,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"YHPrUuGGGTGZMNAg","name":"Bière","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_biere.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.u7lMLkVlFCXBj8Bc"}},"system":{"description":"<p>1 mesure (20cl) de bière.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":0,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":0.8,"alcoolise":true,"force":-1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1676074487968,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"a3Wj2WNKFrzqRGVG","name":"Chemise de soie","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chemise_soie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.a3Wj2WNKFrzqRGVG"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1674002002084,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"YNbbSGLnexiXNyXU","name":"Manteau de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/manteau_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.YNbbSGLnexiXNyXU"}},"system":{"description":"","descriptionmj":"","encombrement":0.8,"quantite":1,"qualite":0,"cout":0.6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"b0f08L5CDeFIMluC","name":"Cuir Souple","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.b0f08L5CDeFIMluC"}},"system":{"description":"<p>Même épaisseur que nos modernes blousons de cuir. Pourpoint ou cotte de cuir souple + culottes de cuir souple + bottes de cuir souple.</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":0,"quantite":1,"qualite":0,"cout":6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"protection":2,"deterioration":0,"malus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1674002002084,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Yh7VGX3BikmIjVQH","name":"Gourdin","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/gourdin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Yh7VGX3BikmIjVQH"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"","dommages":"1","penetration":0,"force":"7","competence":"Masse à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"gourdin"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"bA0JDA7awoWhu0vO","name":"Teinture d'Erozonne","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/teinture_erozonne.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.bA0JDA7awoWhu0vO"}},"system":{"description":"<p>Fluide. </p>\n<p>Liquide rosâtre.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1674255030635,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Yyn39VDRnO6oA3Uq","name":"Echecs draconics en bois","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/echecs.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Yyn39VDRnO6oA3Uq"}},"system":{"description":"","descriptionmj":"","encombrement":0.5,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"beQ9d4QQwZDQl5NA","name":"Flûte à bec","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/flute_bec.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.beQ9d4QQwZDQl5NA"}},"system":{"description":"","descriptionmj":"","encombrement":0.09,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1674002002084,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Z0ij7qpoYeWMVocP","name":"Ceinturon de cuir","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/ceinturon.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.Z0ij7qpoYeWMVocP"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":6,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"bgkEBYUEFLvAaeVf","name":"Luth, viole","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/luth.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.bgkEBYUEFLvAaeVf"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":7,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1674002002084,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"ZLda3pfrbiKucSea","name":"Cornebouffe","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cornebouffe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.NuwD0kiJyoqevKib"}},"system":{"description":"<p><span class=\"fontstyle0\">La cornebouffe est une préparation à base de gibier, élaborée dans les forêts proches de la mer par des chasseurs spécialisés : les </span><span class=\"fontstyle2\">cornebouffiers</span><span class=\"fontstyle0\">. Acheminée vers les ports, principaux consommateurs, elle constitue l’aliment de base de la plupart des marins.</span></p>\n<p><span class=\"fontstyle0\">Certains voyageurs qui l’ont expérimentée et en ont accepté l’exotisme, en transportent parfois en cas de disette. Pratiquement, il s’agit de gibier référentiellement cornu (bramart, cornicochon, mercureuil), que l’on cuit et recuit dans de l’eau de mer avec des herbes, jusqu’à obtenir une pâte, sorte de mastic, que l’on façonne en forme de galettes, puis que l’on laisse longuement sécher au soleil. On aboutit au final à des sortes de petites briques plates, de la taille d’une demi-main, de couleur vert-de-gris, et à peu près aussi dures que les briques véritables. La meilleure façon de consommer ces galettes est de les réhydrater avec de l’eau chaude, c’est la façon dite </span><span class=\"fontstyle2\">soupée </span><span class=\"fontstyle0\">: on obtient une sorte de soupe ou de bouillie gluante. L’autre façon, dite sèche, consiste à les grignoter telles quelles comme des biscuits, mais il est impératif de boire beaucoup par dessus, sous peine d’une soif torride accompagnée de maux d’estomac.</span></p>\n<p><span class=\"fontstyle0\">Légère, peu encombrante, et surtout nourrissante, une galette de cornebouffe suffit pour un repas. Quant au goût, eh bien... ceux qui disent que, tant qu’à y aller, autant manger directement des crottes de chien à la croque-au-sel, ne sont probablement que des enfants gâtés et difficiles.</span></p>\n<p><span class=\"fontstyle0\">Aliment de longue conservation (pratiquement inaltérable), la cornebouffe possède un des meilleurs rapports sustentation/encombrement.</span></p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.02,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"sust":3,"exotisme":-2,"cuisinier":"","boisson":false,"desaltere":0,"alcoolise":false,"force":0,"equipe":false,"resistance":0},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"cVZbnh5cYxBx6P5b","name":"Burin, gouge, ciseau","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gouge.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.cVZbnh5cYxBx6P5b"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1674002002085,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"ZaAKf4n8mtevbMM0","name":"Hydromel","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_biere.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.ZaAKf4n8mtevbMM0"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.04,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"sust":0,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":0.6,"alcoolise":true,"force":-4},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"ckKnviu9SHvWgya0","name":"Bougie de cire (2 heures)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bougie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.ckKnviu9SHvWgya0"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.05,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1674002002085,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"a3Wj2WNKFrzqRGVG","name":"Chemise de soie","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chemise_soie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.a3Wj2WNKFrzqRGVG"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"cobfvOmFpti5lJuK","name":"Chemise de lin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chemise_lin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.cobfvOmFpti5lJuK"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1674002002085,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"b0f08L5CDeFIMluC","name":"Cuir Souple","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.b0f08L5CDeFIMluC"}},"system":{"description":"<p>Même épaisseur que nos modernes blousons de cuir. Pourpoint ou cotte de cuir souple + culottes de cuir souple + bottes de cuir souple.</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":0,"quantite":1,"qualite":0,"cout":6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"protection":2,"deterioration":0,"malus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"dBR6KXvfmjjIcwsc","name":"Pilon en marbre","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pilon.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.dBR6KXvfmjjIcwsc"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1674002002085,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"bA0JDA7awoWhu0vO","name":"Teinture d'Erozonne","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/teinture_erozonne.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.bA0JDA7awoWhu0vO"}},"system":{"description":"<p>Fluide. </p>\n<p>Liquide rosâtre.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"dLiMJO6aUkh0EuIZ","name":"Épée dragonne","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_dragonne.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.dLiMJO6aUkh0EuIZ"}},"system":{"description":"<p>C’est une épée <em>longue</em>, plus robuste que l’esparlongue, pouvant également frapper de taille.</p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":20,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":12,"categorie_parade":"epees-longues","dommages":"3","penetration":0,"force":"11","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeedragonne"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1674002002086,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"beQ9d4QQwZDQl5NA","name":"Flûte à bec","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/flute_bec.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.beQ9d4QQwZDQl5NA"}},"system":{"description":"","descriptionmj":"","encombrement":0.09,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"eK28jEeQiJdd93L3","name":"Bouclier léger","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_petit.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.eK28jEeQiJdd93L3"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":13,"categorie_parade":"boucliers","dommages":"0","penetration":0,"force":"8","competence":"Bouclier","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1674002002086,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"cVZbnh5cYxBx6P5b","name":"Burin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gouge.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.cVZbnh5cYxBx6P5b"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074398967,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"_id":"fAzYb7kkW6QxG6i6","name":"Graisse à Bottes 500g","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/graisse_a_cuir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.fAzYb7kkW6QxG6i6"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1674002002086,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Viole","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/luth.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.bgkEBYUEFLvAaeVf"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":7,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074487920,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"_id":"cbwLXpLTEtywFT6b"}
|
||||||
{"_id":"fDwsTMuug0Z5BdaA","name":"Cuir / Metal","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_metal.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.fDwsTMuug0Z5BdaA"}},"system":{"description":"<p>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.</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":4,"quantite":1,"qualite":0,"cout":20,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"protection":"4","deterioration":0,"malus":-2},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1674002002086,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"ckKnviu9SHvWgya0","name":"Bougie de cire (2 heures)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bougie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.ckKnviu9SHvWgya0"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.05,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"fLKFTvLWoj7juxQE","name":"Flèche, carreau","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fleche.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.fLKFTvLWoj7juxQE"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1674002002086,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"cobfvOmFpti5lJuK","name":"Chemise de lin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chemise_lin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.cobfvOmFpti5lJuK"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"fOfVLKBacNEsDBn1","name":"Brandevin","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_sang.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.fOfVLKBacNEsDBn1"}},"system":{"description":"<p>Dose de 10cl de Brandevin</p>","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"sust":0,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":0.2,"alcoolise":true,"force":-5},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1674002002087,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"dBR6KXvfmjjIcwsc","name":"Pilon en marbre","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pilon.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.dBR6KXvfmjjIcwsc"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Etain (1 denier)","type":"monnaie","img":"systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.UFCII7LUClrCWElV"}},"_id":"fhP2azbUBfmpF441","system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":0,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}]},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1674002002087,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"dLiMJO6aUkh0EuIZ","name":"Épée dragonne","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_dragonne.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.dLiMJO6aUkh0EuIZ"}},"system":{"description":"<p>C’est une épée <em>longue</em>, plus robuste que l’esparlongue, pouvant également frapper de taille.</p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":20,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":12,"categorie_parade":"epees-longues","dommages":"3","penetration":0,"force":"11","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeedragonne"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"gfU7oZL1JYqF3lAW","name":"Robe de lin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_lin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.gfU7oZL1JYqF3lAW"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1674002002087,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"eK28jEeQiJdd93L3","name":"Bouclier léger","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/bouclier_petit.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.eK28jEeQiJdd93L3"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":13,"categorie_parade":"boucliers","dommages":"0","penetration":0,"force":"8","competence":"Bouclier","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"gmBC6SO3F5d64Vpl","name":"Miroir en cuivre poli 20 cm","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/miroir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.gmBC6SO3F5d64Vpl"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1674002002087,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"fAzYb7kkW6QxG6i6","name":"Graisse à Bottes 500g","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/graisse_a_cuir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.fAzYb7kkW6QxG6i6"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Or (10 sols)","type":"monnaie","img":"systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.CmqfrDQgL61XIAqt"}},"_id":"gmbvvEx7hPrAy3zh","system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":0,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}]},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1674002002087,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"fDwsTMuug0Z5BdaA","name":"Cuir / Metal","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_metal.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.fDwsTMuug0Z5BdaA"}},"system":{"description":"<p>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.</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":4,"quantite":1,"qualite":0,"cout":20,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"protection":"4","deterioration":0,"malus":-2},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1676074487969,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"godMVR796aSUVjLu","name":"Fléau léger","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/fleau_leger.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.godMVR796aSUVjLu"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":12,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":10,"categorie_parade":"","dommages":"3","penetration":0,"force":"12","competence":"Fléau","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":true,"initpremierround":"fleau"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1674002002088,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"fLKFTvLWoj7juxQE","name":"Flèche","type":"munition","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fleche.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.X4mih6UN2mWf7Ndr"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[]},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1676067642744,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"hEPimS3H8jihDuUS","name":"Crayon à mine de plomb","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/crayon_plomb.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.hEPimS3H8jihDuUS"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1674002002088,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"fOfVLKBacNEsDBn1","name":"Brandevin","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_sang.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.fOfVLKBacNEsDBn1"}},"system":{"description":"<p>Dose de 10cl de Brandevin</p>","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"sust":0,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":0.2,"alcoolise":true,"force":-5},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"hVgd4APvAW8sbXf0","name":"Grande hache","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/grande_hache.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.hVgd4APvAW8sbXf0"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":8,"categorie_parade":"haches","dommages":"4","penetration":0,"force":"13","competence":"Hache à 2 mains","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":true,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1674002002088,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Etain (1 denier)","type":"monnaie","img":"systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.UFCII7LUClrCWElV"}},"_id":"fhP2azbUBfmpF441","system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":0,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}]},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"hjsIxUmanyz5otLJ","name":"Marmite de fer (3 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/marmite.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.hjsIxUmanyz5otLJ"}},"system":{"description":"","descriptionmj":"","encombrement":0.6,"quantite":1,"qualite":0,"cout":0.6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":1.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1674002002088,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"gfU7oZL1JYqF3lAW","name":"Robe de lin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_lin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.gfU7oZL1JYqF3lAW"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"htaHjhHwVhlBnZjv","name":"Fléau lourd","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/fleau_lourd.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.htaHjhHwVhlBnZjv"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":10,"categorie_parade":"","dommages":"4","penetration":0,"force":"13","competence":"Fléau","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":true,"initpremierround":"fleau"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1674002002089,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"gmBC6SO3F5d64Vpl","name":"Miroir en cuivre poli 20 cm","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/miroir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.gmBC6SO3F5d64Vpl"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"huvZ4dMPpn9gk9km","name":"Sel","type":"objet","flags":{"core":{"sourceId":"Item.fLEyryhRi8Nw37SP"}},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/sel.webp","effects":[],"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":null,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1674002002089,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Or (10 sols)","type":"monnaie","img":"systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.CmqfrDQgL61XIAqt"}},"_id":"gmbvvEx7hPrAy3zh","system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":0,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}]},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"iCvphbPdxUcfqetd","name":"Aumônière","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/aumoniere.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.iCvphbPdxUcfqetd"}},"system":{"description":"<p>Comme une bourse, mais sous forme d'une coque en cuir rigide.</p>","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"contenu":[],"capacite":0.25,"equipe":false},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1674002002089,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"godMVR796aSUVjLu","name":"Fléau léger","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/fleau_leger.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.godMVR796aSUVjLu"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":12,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":10,"categorie_parade":"","dommages":"3","penetration":0,"force":"12","competence":"Fléau","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":true,"initpremierround":"fleau"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"iGHudg5kBOfYWgwV","name":"Arc","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/arc.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.iGHudg5kBOfYWgwV"}},"system":{"description":"<p>Nie jusqu'à 2 points d'armure.</p>\n<p>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).</p>","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":0,"categorie_parade":"","dommages":"2","penetration":2,"force":"0","competence":"","lancer":"","tir":"Arc","portee_courte":10,"portee_moyenne":20,"portee_extreme":50,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1674002002089,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"hEPimS3H8jihDuUS","name":"Crayon à mine de plomb","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/crayon_plomb.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.hEPimS3H8jihDuUS"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"iq8ZZgphxOUgC1bi","name":"Flûte traversière de roseau","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/flute_traversiere.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.iq8ZZgphxOUgC1bi"}},"system":{"description":"","descriptionmj":"","encombrement":0.08,"quantite":1,"qualite":0,"cout":0.12,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1674002002089,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"hVgd4APvAW8sbXf0","name":"Grande hache","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/grande_hache.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.hVgd4APvAW8sbXf0"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":8,"categorie_parade":"haches","dommages":"4","penetration":0,"force":"13","competence":"Hache à 2 mains","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":true,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"iss7ARW8oRoe1umi","name":"Eau","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_eau.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.DAFP7z5gzl1O3rCV"}},"system":{"description":"<p><span style=\"color: #191813; font-family: CaslonAntique; font-size: 16px; letter-spacing: 1px; text-align: justify; background-color: #f5f5f0;\">1 mesure (20cl) d'eau.</span></p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Cours d'eau","rarete":"Commune","frequence":54},{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":0,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":1,"alcoolise":false,"force":0,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1674002002090,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"hjsIxUmanyz5otLJ","name":"Marmite de fer (3 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/marmite.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.hjsIxUmanyz5otLJ"}},"system":{"description":"","descriptionmj":"","encombrement":0.6,"quantite":1,"qualite":0,"cout":0.6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":1.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"iuSOVPBsK8Zg6hoY","name":"1 m² de bâche","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bache.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.iuSOVPBsK8Zg6hoY"}},"system":{"description":null,"descriptionmj":"","encombrement":0.5,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1674002002090,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"htaHjhHwVhlBnZjv","name":"Fléau lourd","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/fleau_lourd.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.htaHjhHwVhlBnZjv"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":10,"categorie_parade":"","dommages":"4","penetration":0,"force":"13","competence":"Fléau","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":true,"initpremierround":"fleau"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"j9WpAl1SwHEovg3b","name":"Tresse de crin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tresse.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.j9WpAl1SwHEovg3b"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1674002002090,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"huvZ4dMPpn9gk9km","name":"Sel","type":"objet","flags":{"core":{"sourceId":"Item.fLEyryhRi8Nw37SP"}},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/sel.webp","effects":[],"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":null,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"jHxnzdBSVzr7Z7wH","name":"Robe de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.jHxnzdBSVzr7Z7wH"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1674002002090,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"iCvphbPdxUcfqetd","name":"Aumônière","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/aumoniere.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.iCvphbPdxUcfqetd"}},"system":{"description":"<p>Comme une bourse, mais sous forme d'une coque en cuir rigide.</p>","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"contenu":[],"capacite":0.25,"equipe":false},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1676074487970,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"jKWA5NjsjH0kIZzK","name":"Chaudron de fer (5 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chaudron.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.jKWA5NjsjH0kIZzK"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":2.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1674002002090,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"iGHudg5kBOfYWgwV","name":"Arc","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/arc.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.iGHudg5kBOfYWgwV"}},"system":{"description":"<p>Nie jusqu'à 2 points d'armure.</p>\n<p>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).</p>","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":0,"categorie_parade":"","dommages":"2","penetration":2,"force":"0","competence":"","lancer":"","tir":"Arc","portee_courte":10,"portee_moyenne":20,"portee_extreme":50,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"jZMfiBnBXwW91drM","name":"Sablier 15 minutes","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sablier.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.jZMfiBnBXwW91drM"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1674002002090,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"iq8ZZgphxOUgC1bi","name":"Flûte traversière de roseau","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/flute_traversiere.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.iq8ZZgphxOUgC1bi"}},"system":{"description":"","descriptionmj":"","encombrement":0.08,"quantite":1,"qualite":0,"cout":0.12,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"jchAu828fr8TLtwi","name":"Lait","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_lait.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.6i90SWaq5Me0us8X"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"sust":0.2,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":1,"alcoolise":false,"force":0,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1674002002091,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"iss7ARW8oRoe1umi","name":"Eau","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_eau.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.DAFP7z5gzl1O3rCV"}},"system":{"description":"<p><span style=\"color: #191813; font-family: CaslonAntique; font-size: 16px; letter-spacing: 1px; text-align: justify; background-color: #f5f5f0;\">1 mesure (20cl) d'eau.</span></p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Cours d'eau","rarete":"Commune","frequence":54},{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":0,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":1,"alcoolise":false,"force":0,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"jyBy6mDAGvJb9k0l","name":"1 m2 de lin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tissu_lin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.jyBy6mDAGvJb9k0l"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1674002002091,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"iuSOVPBsK8Zg6hoY","name":"1 m² de bâche","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bache.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.iuSOVPBsK8Zg6hoY"}},"system":{"description":null,"descriptionmj":"","encombrement":0.5,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"kFUh4027jnAdqbyK","name":"Gelée royale","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gelee_royale.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.kFUh4027jnAdqbyK"}},"system":{"description":"<p>Crème sirupeuse.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1674255055513,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"j9WpAl1SwHEovg3b","name":"Tresse de crin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tresse.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.j9WpAl1SwHEovg3b"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"keLCmhsbxHK39UIy","name":"Mirobolant","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/mirobolant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.keLCmhsbxHK39UIy"}},"system":{"description":"<p>Fluide.</p>\n<p>Liquide rougeâtre clair et sans dépot.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.3","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1674255040364,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"jHxnzdBSVzr7Z7wH","name":"Robe de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.jHxnzdBSVzr7Z7wH"}},"system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"lJMKVPB5zlG9UqMD","name":"Pourpoint de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pourpoint_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.lJMKVPB5zlG9UqMD"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":8,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1674002002091,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"jKWA5NjsjH0kIZzK","name":"Chaudron de fer (5 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chaudron.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.jKWA5NjsjH0kIZzK"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":2.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"lKkYFkzWVs2TZDZP","name":"Petit pot de fard","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fard.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.lKkYFkzWVs2TZDZP"}},"system":{"description":"","descriptionmj":"","encombrement":0.04,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1674002002091,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"jZMfiBnBXwW91drM","name":"Sablier 15 minutes","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sablier.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.jZMfiBnBXwW91drM"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"lOI2HVu3B6EDY4sE","name":"Arbalète","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/arbalete.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.lOI2HVu3B6EDY4sE"}},"system":{"description":"<p>Nie jusqu'à 2 points d'armure.</p>\n<p>Rechargement 1 round.</p>","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":30,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":0,"categorie_parade":"","dommages":"3","penetration":2,"force":"0","competence":"","lancer":"","tir":"Arbalète","portee_courte":15,"portee_moyenne":30,"portee_extreme":70,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1674002002091,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"jchAu828fr8TLtwi","name":"Lait","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_lait.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.6i90SWaq5Me0us8X"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"sust":0.2,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":1,"alcoolise":false,"force":0,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"lq7pjDQESNbZOQ3n","name":"1 m2 de soie ou de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tissu_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.lq7pjDQESNbZOQ3n"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1674002002091,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"jyBy6mDAGvJb9k0l","name":"1 m2 de lin","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tissu_lin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.jyBy6mDAGvJb9k0l"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"m9yuZjp9DK7pSqPK","name":"Lanterne à bougie","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lanterne_bougie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.m9yuZjp9DK7pSqPK"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1674002002091,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"kFUh4027jnAdqbyK","name":"Gelée royale","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gelee_royale.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.kFUh4027jnAdqbyK"}},"system":{"description":"<p>Crème sirupeuse.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"n2HMv0xv0MFpuiKp","name":"Parchemin 1 feuille","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/parchemin_1_feuille.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.n2HMv0xv0MFpuiKp"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1674002002091,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"keLCmhsbxHK39UIy","name":"Mirobolant","type":"potion","img":"systems/foundryvtt-reve-de-dragon/icons/objets/mirobolant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.keLCmhsbxHK39UIy"}},"system":{"description":"<p>Fluide.</p>\n<p>Liquide rougeâtre clair et sans dépot.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"temporel":{"debut":{"indexDate":-1,"indexMinute":0},"fin":{"indexDate":-1,"indexMinute":0}},"rarete":"","categorie":"Remede","herbe":"","herbebrins":0,"herbebonus":0,"reposalchimique":false,"pr":0,"prpermanent":false,"prdate":0,"soinherbe":"","soinherbebonus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"nBhYyPbRwcWswiyC","name":"Tonnelet (10 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tonnelet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.nBhYyPbRwcWswiyC"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":0.25,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1674002002091,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"lJMKVPB5zlG9UqMD","name":"Pourpoint de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/pourpoint_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.lJMKVPB5zlG9UqMD"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":8,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"nPczxZ7yylpmGSyO","name":"Crochet de serrurier","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/crochet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.nPczxZ7yylpmGSyO"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1674002002092,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"lKkYFkzWVs2TZDZP","name":"Petit pot de fard","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fard.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.lKkYFkzWVs2TZDZP"}},"system":{"description":"","descriptionmj":"","encombrement":0.04,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"nl9cICrauIOEXwFP","name":"Cordelette (10 m)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cordelette.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.nl9cICrauIOEXwFP"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1674002002092,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"lOI2HVu3B6EDY4sE","name":"Arbalète","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/arbalete.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.lOI2HVu3B6EDY4sE"}},"system":{"description":"<p>Nie jusqu'à 2 points d'armure.</p>\n<p>Rechargement 1 round.</p>","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":30,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":0,"categorie_parade":"","dommages":"3","penetration":2,"force":"0","competence":"","lancer":"","tir":"Arbalète","portee_courte":15,"portee_moyenne":30,"portee_extreme":70,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":false,"initpremierround":"hast"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"nqMyaOqBfTxdP9tg","name":"Cor en corne","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cor_corne.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.nqMyaOqBfTxdP9tg"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1674002002092,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"lq7pjDQESNbZOQ3n","name":"1 m2 de soie ou de velours","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tissu_velours.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.lq7pjDQESNbZOQ3n"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"oXpPZ9LS1nsU0nGT","name":"Épée sorde","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_sord.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.oXpPZ9LS1nsU0nGT"}},"system":{"description":"<p>C’est une épée plus courte que la dragonne, mais plus <em>large</em>. Elle peut s’utiliser à une ou deux mains. Sa grande solidité en fait l’épée de prédilection des gardes et des soldats.</p>\n<p>C’est probablement à elle que le <em>Guerrier Sorde</em> doit son nom (à moins que ce ne soit l’inverse).</p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":20,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":15,"categorie_parade":"epees-lourdes","dommages":"3/4","penetration":null,"force":"12/11","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"epeesorde"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1674002002092,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"m9yuZjp9DK7pSqPK","name":"Lanterne à bougie","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/lanterne_bougie.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.m9yuZjp9DK7pSqPK"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"of2LbmmB4EtlSwte","name":"Sac en jute (50 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sac_jute_50.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.of2LbmmB4EtlSwte"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.08,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":25,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1674002002092,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"n2HMv0xv0MFpuiKp","name":"Parchemin 1 feuille","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/parchemin_1_feuille.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.n2HMv0xv0MFpuiKp"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"orpj8CumQ39xMOHy","name":"Brosse à cheveux","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/Brosse.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.orpj8CumQ39xMOHy"}},"system":{"description":"","descriptionmj":"","encombrement":0.06,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1674002002092,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"nBhYyPbRwcWswiyC","name":"Tonnelet (10 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/tonnelet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.nBhYyPbRwcWswiyC"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":0.25,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"phfgVizT4ekUwqFq","name":"Selle et harnais","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/selle.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.phfgVizT4ekUwqFq"}},"system":{"description":"","descriptionmj":"","encombrement":4,"quantite":1,"qualite":0,"cout":5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":25,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"nPczxZ7yylpmGSyO","name":"Crochet de serrurier","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/crochet.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.nPczxZ7yylpmGSyO"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1676074487971,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"q5zaNnlmNZZChi31","name":"Miel","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gelee_royale.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.0UhqiYISVSiztBfv"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"sust":2,"exotisme":0,"cuisinier":"","boisson":false,"desaltere":0,"alcoolise":false,"force":0},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"nl9cICrauIOEXwFP","name":"Cordelette (10 m)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cordelette.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.nl9cICrauIOEXwFP"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"qCLTOjlIOvlj0uo7","name":"Chaperon de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chaperon_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.qCLTOjlIOvlj0uo7"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"nqMyaOqBfTxdP9tg","name":"Cor en corne","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cor_corne.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.nqMyaOqBfTxdP9tg"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.6,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"qWhl9EfdnJx4KFTZ","name":"Bas de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bas_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.qWhl9EfdnJx4KFTZ"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"oXpPZ9LS1nsU0nGT","name":"Épée sorde","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_sord.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.oXpPZ9LS1nsU0nGT"}},"system":{"description":"<p>C’est une épée plus courte que la dragonne, mais plus <em>large</em>. Elle peut s’utiliser à une ou deux mains. Sa grande solidité en fait l’épée de prédilection des gardes et des soldats.</p>\n<p>C’est probablement à elle que le <em>Guerrier Sorde</em> doit son nom (à moins que ce ne soit l’inverse).</p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":20,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":15,"categorie_parade":"epees-lourdes","dommages":"3/4","penetration":null,"force":"12/11","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":false,"deuxmains":true,"unemain":true,"initpremierround":"epeesorde"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"sSgPT3aKDOZ25svO","name":"Porte plume en bois","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/porte_plume2.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.sSgPT3aKDOZ25svO"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.05,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"of2LbmmB4EtlSwte","name":"Sac en jute (50 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/sac_jute_50.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.of2LbmmB4EtlSwte"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.08,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":25,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"sXoStuW19r9zVi1S","name":"Flacon de verre (40 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/flacon_verre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.sXoStuW19r9zVi1S"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"orpj8CumQ39xMOHy","name":"Brosse à cheveux","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/Brosse.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.orpj8CumQ39xMOHy"}},"system":{"description":"","descriptionmj":"","encombrement":0.06,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"sbgHtwEj4sK9cMh7","name":"Livre","type":"livre","flags":{"core":{"sourceId":"Item.1bn0Q8cO1qRWQvlf"}},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/livre.webp","effects":[],"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"competence":"Ecriture","auteur":"Inconnu","difficulte":0,"points_de_tache":0,"xp":0,"niveau_minimum":0,"niveau_maximum":0},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Gouge","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gouge.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.cVZbnh5cYxBx6P5b"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1676074352882,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"pY17ihKKHgfThcyK","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"_id":"skTWp8PUgIG2U2ne","name":"Cire à cacheter","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cire_a_cacheter.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.skTWp8PUgIG2U2ne"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"phfgVizT4ekUwqFq","name":"Selle et harnais","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/selle.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.phfgVizT4ekUwqFq"}},"system":{"description":"","descriptionmj":"","encombrement":4,"quantite":1,"qualite":0,"cout":5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":25,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"slusKo2nVCtFwDkN","name":"Sang","type":"munition","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_sang.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.slusKo2nVCtFwDkN"}},"system":{"description":"<p>1 mesure (20cl) de sang.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"q5zaNnlmNZZChi31","name":"Miel","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gelee_royale.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.0UhqiYISVSiztBfv"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"sust":2,"exotisme":0,"cuisinier":"","boisson":false,"desaltere":0,"alcoolise":false,"force":0},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"snupUovwaPAe46aD","name":"Fiole en grès (20 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fiole_gres.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.snupUovwaPAe46aD"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"qCLTOjlIOvlj0uo7","name":"Chaperon de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chaperon_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.qCLTOjlIOvlj0uo7"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"szOThadvQvFcS79R","name":"Cuir Epais","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_epais.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.szOThadvQvFcS79R"}},"system":{"description":"<p>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.</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"protection":"3","deterioration":0,"malus":-1},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"qWhl9EfdnJx4KFTZ","name":"Bas de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bas_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.qWhl9EfdnJx4KFTZ"}},"system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"tBFt4h3jqINsOxLI","name":"Outre (2 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/outre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.tBFt4h3jqINsOxLI"}},"system":{"description":"","descriptionmj":"","encombrement":0.08,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"sSgPT3aKDOZ25svO","name":"Porte plume en bois","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/porte_plume2.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.sSgPT3aKDOZ25svO"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.05,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"tMWzePiuMtiCQnAU","name":"Marteau","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/marteau.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.tMWzePiuMtiCQnAU"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.3,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"","dommages":"2","penetration":0,"force":"7","competence":"Masse à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":true,"initpremierround":"masse"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.4","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1674571037073,"lastModifiedBy":"F2zvQUIw6mQepDqs"}}
|
{"_id":"sXoStuW19r9zVi1S","name":"Flacon de verre (40 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/flacon_verre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.sXoStuW19r9zVi1S"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"tY3shj5FA8nwMgxX","name":"Vin","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_vin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.QNNWTG5yqQKmcpJ7"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":0,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":0.6,"alcoolise":true,"force":-2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"sbgHtwEj4sK9cMh7","name":"Livre","type":"livre","flags":{"core":{"sourceId":"Item.1bn0Q8cO1qRWQvlf"}},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/livre.webp","effects":[],"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":3,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"competence":"Ecriture","auteur":"Inconnu","difficulte":0,"points_de_tache":0,"xp":0,"niveau_minimum":0,"niveau_maximum":0},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"tZWQCuRr1ic3S0pL","name":"Souliers","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/souliers.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.tZWQCuRr1ic3S0pL"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.8,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"skTWp8PUgIG2U2ne","name":"Cire à cacheter","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/cire_a_cacheter.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.skTWp8PUgIG2U2ne"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Repas moyen à l'auberge","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/objets/provision_cuite.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.tn1kvxEVoLyYODyg"}},"_id":"tn1kvxEVoLyYODyg","system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":3,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":3,"exotisme":0,"cuisinier":"","boisson":false,"desaltere":0,"alcoolise":false,"force":0},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"slusKo2nVCtFwDkN","name":"Sang","type":"munition","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_sang.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.slusKo2nVCtFwDkN"}},"system":{"description":"<p>1 mesure (20cl) de sang.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"tswamwK2oKNARhjA","name":"Verre grossissant","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/verre_grossissant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.tswamwK2oKNARhjA"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1674002002093,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"snupUovwaPAe46aD","name":"Fiole en grès (20 cl)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/fiole_gres.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.snupUovwaPAe46aD"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"ueBk3MbdEaMbzyPS","name":"Ficelle (10 m)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/ficelle.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.ueBk3MbdEaMbzyPS"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"szOThadvQvFcS79R","name":"Cuir Epais","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_epais.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.szOThadvQvFcS79R"}},"system":{"description":"<p>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.</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":10,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"protection":"3","deterioration":0,"malus":-1},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"ueJnUMLK1vpL8xOB","name":"Stylet de bronze","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/stylet_de_bronze.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.ueJnUMLK1vpL8xOB"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.12,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"tBFt4h3jqINsOxLI","name":"Outre (2 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/outre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.tBFt4h3jqINsOxLI"}},"system":{"description":"","descriptionmj":"","encombrement":0.08,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"uwwunMSrJoUYTDkG","name":"Seau de bois ferré (10 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/seau_ferre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.uwwunMSrJoUYTDkG"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"tMWzePiuMtiCQnAU","name":"Marteau","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/objets/marteau.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.tMWzePiuMtiCQnAU"}},"system":{"description":"","descriptionmj":"","equipe":false,"encombrement":0.3,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":8,"categorie_parade":"","dommages":"2","penetration":0,"force":"7","competence":"Masse à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":0,"resistance_magique":0,"rapide":false,"deuxmains":false,"unemain":true,"initpremierround":"masse"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"vQ494sD9FgFI08kZ","name":"Drap Matelassé","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/drap_matelasse.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.vQ494sD9FgFI08kZ"}},"system":{"description":"<p>Deux épaisseurs de drap surpiquées, avec rembourrage de laine.</p>\n<p>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.</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":0,"quantite":1,"qualite":0,"cout":4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"protection":"1","deterioration":0,"malus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"tY3shj5FA8nwMgxX","name":"Vin","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/liquides/liquide_vin.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.QNNWTG5yqQKmcpJ7"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.01,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":0,"exotisme":0,"cuisinier":"","boisson":true,"desaltere":0.6,"alcoolise":true,"force":-2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1676074487972,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Épée demi-dragonne","type":"arme","flags":{"core":{"sourceId":"Item.ErwaSLcGryAbYjkm"}},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/demi_dragonne.webp","effects":[],"_id":"vnlRGjt7X6yQRObA","system":{"description":null,"descriptionmj":"","equipe":false,"encombrement":1.5,"quantite":1,"qualite":0,"cout":15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":10,"categorie_parade":"epees-longues","dommages":"2","penetration":0,"force":"10","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeedragonne"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"tZWQCuRr1ic3S0pL","name":"Souliers","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/souliers.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.tZWQCuRr1ic3S0pL"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.8,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"wPE64RRcuLlvuPrY","name":"Épée cyane","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_cyane.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.wPE64RRcuLlvuPrY"}},"system":{"description":"<p>Long <em>cimeterre </em>à l’acier bleuté, exclusivement fabriqué par les Cyans ou Hommes bleus.</p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":25,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":12,"categorie_parade":"epees-lourdes","dommages":"3","penetration":0,"force":"11","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeecyane"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Repas moyen à l'auberge","type":"nourritureboisson","img":"systems/foundryvtt-reve-de-dragon/icons/objets/provision_cuite.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.tn1kvxEVoLyYODyg"}},"_id":"tn1kvxEVoLyYODyg","system":{"description":"","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":3,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"sust":3,"exotisme":0,"cuisinier":"","boisson":false,"desaltere":0,"alcoolise":false,"force":0},"ownership":{"default":0,"wYnBx3HmLfGzsj7P":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"wcW5KcideGi8EY67","name":"Gants de cuir","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gants_de_cuir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.wcW5KcideGi8EY67"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"tswamwK2oKNARhjA","name":"Verre grossissant","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/verre_grossissant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.tswamwK2oKNARhjA"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"wpWaqe96x3cvqTXy","name":"Robe de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.wpWaqe96x3cvqTXy"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"ueBk3MbdEaMbzyPS","name":"Ficelle (10 m)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/ficelle.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.ueBk3MbdEaMbzyPS"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"x4g6bDu3eUllSSSJ","name":"Eponge de mer","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/eponge.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.x4g6bDu3eUllSSSJ"}},"system":{"description":"","descriptionmj":"","encombrement":0.04,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Maritimes","rarete":"Rare","frequence":6},{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"ueJnUMLK1vpL8xOB","name":"Stylet de bronze","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/stylet_de_bronze.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.ueJnUMLK1vpL8xOB"}},"system":{"description":"","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0.12,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"xfdeDEyMK8YtBpzC","name":"Huile 20 cl (4 heures)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/huile.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.xfdeDEyMK8YtBpzC"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.04,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206119,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"uwwunMSrJoUYTDkG","name":"Seau de bois ferré (10 litres)","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/seau_ferre.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.uwwunMSrJoUYTDkG"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"xuk60njqtrSZusSX","name":"Chemise de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chemise_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.xuk60njqtrSZusSX"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206119,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"vQ494sD9FgFI08kZ","name":"Drap Matelassé","type":"armure","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/drap_matelasse.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.vQ494sD9FgFI08kZ"}},"system":{"description":"<p>Deux épaisseurs de drap surpiquées, avec rembourrage de laine.</p>\n<p>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.</p>\n<p> </p>","descriptionmj":"","equipe":false,"encombrement":0,"quantite":1,"qualite":0,"cout":4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"protection":"1","deterioration":0,"malus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"yILNvELKbsz2OOln","name":"Ecritoire","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/ecritoire.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.yILNvELKbsz2OOln"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Épée demi-dragonne","type":"arme","flags":{"core":{"sourceId":"Item.ErwaSLcGryAbYjkm"}},"img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/demi_dragonne.webp","effects":[],"_id":"vnlRGjt7X6yQRObA","system":{"description":null,"descriptionmj":"","equipe":false,"encombrement":1.5,"quantite":1,"qualite":0,"cout":15,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"resistance":10,"categorie_parade":"epees-longues","dommages":"2","penetration":0,"force":"10","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeedragonne"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"yO9Vx7tqF8qbZoYw","name":"Besace de cuir","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/besace.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.yO9Vx7tqF8qbZoYw"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":10,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"wPE64RRcuLlvuPrY","name":"Épée cyane","type":"arme","img":"systems/foundryvtt-reve-de-dragon/icons/armes_armures/epee_cyane.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.wPE64RRcuLlvuPrY"}},"system":{"description":"<p>Long <em>cimeterre </em>à l’acier bleuté, exclusivement fabriqué par les Cyans ou Hommes bleus.</p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":25,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"resistance":12,"categorie_parade":"epees-lourdes","dommages":"3","penetration":0,"force":"11","competence":"Epée à 1 main","lancer":"","tir":"","portee_courte":0,"portee_moyenne":0,"portee_extreme":0,"magique":false,"ecaille_efficacite":null,"resistance_magique":null,"rapide":true,"deuxmains":false,"unemain":true,"initpremierround":"epeecyane"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"zQWlnUsd8bPySujd","name":"Aiguille à coudre","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/aiguille.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.zQWlnUsd8bPySujd"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"wcW5KcideGi8EY67","name":"Gants de cuir","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/gants_de_cuir.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.wcW5KcideGi8EY67"}},"system":{"description":"","descriptionmj":"","encombrement":0.05,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"zYI8mDiysWtmsSyy","name":"Carquois","type":"conteneur","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.zYI8mDiysWtmsSyy"}},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/carquois.webp","effects":[],"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":2,"equipe":false},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"wpWaqe96x3cvqTXy","name":"Robe de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/robe_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.wpWaqe96x3cvqTXy"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.4,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"zlDa1vwmls6Uf4pt","name":"Bourse de cuir","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bourse.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.zlDa1vwmls6Uf4pt"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.1","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1674002002094,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Herbe à pipe","type":"herbe","img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Endorlotte.webp","system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0.01,"cout":0.01,"milieu":"","environnement":[],"sust":0,"exotisme":0,"niveau":0,"base":0,"categorie":"Autre"},"effects":[],"flags":{"core":{"sourceId":"Item.wxmHkhTTzPNepN4d"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1676073283027,"modifiedTime":1676074352883,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"wxmHkhTTzPNepN4d","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
|
{"_id":"x4g6bDu3eUllSSSJ","name":"Eponge de mer","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/eponge.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.x4g6bDu3eUllSSSJ"}},"system":{"description":"","descriptionmj":"","encombrement":0.04,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Maritimes","rarete":"Rare","frequence":6},{"milieu":"Villages","rarete":"Rarissime","frequence":2},{"milieu":"Villes","rarete":"Rare","frequence":6}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
{"_id":"xfdeDEyMK8YtBpzC","name":"Huile 20 cl (4 heures)","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/huile.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.xfdeDEyMK8YtBpzC"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.04,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206119,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
{"_id":"xuk60njqtrSZusSX","name":"Chemise de laine","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/chemise_laine.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.xuk60njqtrSZusSX"}},"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Commune","frequence":54}],"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206119,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
{"_id":"yILNvELKbsz2OOln","name":"Ecritoire","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/ecritoire.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.yILNvELKbsz2OOln"}},"system":{"description":"","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Rare","frequence":6},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
{"_id":"yO9Vx7tqF8qbZoYw","name":"Besace de cuir","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/besace.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.yO9Vx7tqF8qbZoYw"}},"system":{"description":"","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Commune","frequence":54},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":10,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1676074487975,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
{"_id":"zQWlnUsd8bPySujd","name":"Aiguille à coudre","type":"objet","img":"systems/foundryvtt-reve-de-dragon/icons/objets/aiguille.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.zQWlnUsd8bPySujd"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1676074487976,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
{"_id":"zYI8mDiysWtmsSyy","name":"Carquois","type":"conteneur","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.zYI8mDiysWtmsSyy"}},"img":"systems/foundryvtt-reve-de-dragon/icons/objets/carquois.webp","effects":[],"system":{"description":"","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.5,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Frequente","frequence":18}],"contenu":[],"capacite":2,"equipe":false},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1676074487976,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
{"_id":"zlDa1vwmls6Uf4pt","name":"Bourse de cuir","type":"conteneur","img":"systems/foundryvtt-reve-de-dragon/icons/objets/bourse.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.zlDa1vwmls6Uf4pt"}},"system":{"description":"","descriptionmj":"","encombrement":0.01,"quantite":1,"qualite":0,"cout":0.1,"milieu":"","environnement":[{"milieu":"Villages","rarete":"Frequente","frequence":18},{"milieu":"Villes","rarete":"Commune","frequence":54}],"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1676074487976,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
|||||||
@@ -88,7 +88,7 @@
|
|||||||
{"name":"Noisemûre","type":"plante","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.eB5Nhus3Ao4H8ePT"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Noisem%C3%BBre.webp","effects":[],"_id":"eB5Nhus3Ao4H8ePT","system":{"description":"<p>Fruit du noisemûrier, petit arbuste très ramifié vivant en sous-bois à l’ombre des plus grands arbres. La noisemûre a extérieurement l’apparence d’une grosse noisette à la coquille rougeâtre et granulée. Intérieurement, sa chair est tendre, juteuse et sucrée.</p>\n<p>Fréquente.</p>","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0,"milieu":"Forêts","environnement":[{"milieu":"Forêts","rarete":"Frequente","frequence":18}],"sust":0.2,"exotisme":0,"niveau":0,"base":0,"categorie":"Cuisine","rarete":"Frequente"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708525,"modifiedTime":1673792081023,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Noisemûre","type":"plante","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.eB5Nhus3Ao4H8ePT"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Noisem%C3%BBre.webp","effects":[],"_id":"eB5Nhus3Ao4H8ePT","system":{"description":"<p>Fruit du noisemûrier, petit arbuste très ramifié vivant en sous-bois à l’ombre des plus grands arbres. La noisemûre a extérieurement l’apparence d’une grosse noisette à la coquille rougeâtre et granulée. Intérieurement, sa chair est tendre, juteuse et sucrée.</p>\n<p>Fréquente.</p>","descriptionmj":"","encombrement":0.02,"quantite":1,"qualite":0,"cout":0,"milieu":"Forêts","environnement":[{"milieu":"Forêts","rarete":"Frequente","frequence":18}],"sust":0.2,"exotisme":0,"niveau":0,"base":0,"categorie":"Cuisine","rarete":"Frequente"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708525,"modifiedTime":1673792081023,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Soldièze","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/soldieze.webp","system":{"description":"<p><span class=\"fontstyle0\">Gros poisson plat, telle une grande limande ou une sole d’eau douce.</span></p>","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.06,"milieu":"","environnement":[{"milieu":"Cours d'eau","rarete":"Frequente","frequence":18}],"sust":3,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.5.4","coreVersion":"10.291","createdTime":1673656080829,"modifiedTime":1673656874815,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"eEkKZKqoF0Pk0EUW","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Soldièze","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/soldieze.webp","system":{"description":"<p><span class=\"fontstyle0\">Gros poisson plat, telle une grande limande ou une sole d’eau douce.</span></p>","descriptionmj":"","encombrement":0.3,"quantite":1,"qualite":0,"cout":0.06,"milieu":"","environnement":[{"milieu":"Cours d'eau","rarete":"Frequente","frequence":18}],"sust":3,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.5.4","coreVersion":"10.291","createdTime":1673656080829,"modifiedTime":1673656874815,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"eEkKZKqoF0Pk0EUW","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Fricotille","type":"plante","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.eKrtkHj3EbYCZu8Y"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Fricotille.webp","effects":[],"_id":"eKrtkHj3EbYCZu8Y","system":{"description":"<p>Bolet à pied mince et blanc, et large chapeau pointu blanc à pois bleus.</p>\n<p>Fréquente.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0,"milieu":"Lieux sombres et humides","environnement":[{"milieu":"Forêts","rarete":"Frequente","frequence":18},{"milieu":"Sous-sols","rarete":"Frequente","frequence":18}],"sust":0,"exotisme":0,"niveau":3,"base":0,"categorie":"Cuisine","rarete":"Frequente"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708525,"modifiedTime":1673791979385,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Fricotille","type":"plante","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.eKrtkHj3EbYCZu8Y"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Fricotille.webp","effects":[],"_id":"eKrtkHj3EbYCZu8Y","system":{"description":"<p>Bolet à pied mince et blanc, et large chapeau pointu blanc à pois bleus.</p>\n<p>Fréquente.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0,"milieu":"Lieux sombres et humides","environnement":[{"milieu":"Forêts","rarete":"Frequente","frequence":18},{"milieu":"Sous-sols","rarete":"Frequente","frequence":18}],"sust":0,"exotisme":0,"niveau":3,"base":0,"categorie":"Cuisine","rarete":"Frequente"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708525,"modifiedTime":1673791979385,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Solimonce","type":"herbe","flags":{"core":{"sheetClass":"foundryvtt-reve-de-dragon.RdDItemSheet","sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.eqdFj8nT7JkibPvi"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Solimonce.webp","effects":[],"_id":"eqdFj8nT7JkibPvi","system":{"description":"<p>Variété d’ortie non urticante, poussant dans les lieux humides à l’abri de la lumière. Ses décoctions sont réputées souveraines contre les maladies des yeux.</p>\n<p>Rare.</p>\n<p> </p>\n<p><em>Voir Fièvre brune, p350.</em></p>","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":null,"milieu":"Lieux humides","environnement":[{"milieu":"Cours d'eau","rarete":"Rare","frequence":4},{"milieu":"Forêts","rarete":"Rare","frequence":8},{"milieu":"Marais","rarete":"Rare","frequence":4},{"milieu":"Sous-sols","rarete":"Rare","frequence":8}],"sust":0,"exotisme":0,"niveau":null,"base":0,"categorie":"Soin","rarete":"Rare"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708525,"modifiedTime":1673657676885,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Solimonce","type":"herbe","flags":{"core":{"sheetClass":"foundryvtt-reve-de-dragon.RdDItemSheet","sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.eqdFj8nT7JkibPvi"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Solimonce.webp","effects":[],"_id":"eqdFj8nT7JkibPvi","system":{"description":"<p>Variété d’ortie non urticante, poussant dans les lieux humides à l’abri de la lumière. Ses décoctions sont réputées souveraines contre les maladies des yeux.</p>\n<p>Rare.</p>\n<p> </p>\n<p><em>Voir Fièvre brune, p350.</em></p>","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0.3,"milieu":"Lieux humides","environnement":[{"milieu":"Cours d'eau","rarete":"Rare","frequence":4},{"milieu":"Forêts","rarete":"Rare","frequence":8},{"milieu":"Marais","rarete":"Rare","frequence":4},{"milieu":"Sous-sols","rarete":"Rare","frequence":8}],"sust":0,"exotisme":0,"niveau":null,"base":0,"categorie":"Soin","rarete":"Rare"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1669734708525,"modifiedTime":1676073818889,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Obbadion","type":"ingredient","img":"systems/foundryvtt-reve-de-dragon/icons/objets/l_obbadion.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.69vN8bRlnCrRHQCm"}},"system":{"description":"<p>Poudre bleuâtre obtenue par disruption alchimique du minerai appelé <em>obbadine</em>, sorte de tourbe.</p>\n<p>VUE/Alchimie à -2</p>","descriptionmj":"","encombrement":0.001,"quantite":1,"qualite":0,"cout":0.2,"milieu":"Lieux humides, obtenu à partir d'Obbadine (tourbe)","environnement":[{"milieu":"Cours d'eau","rarete":"Frequente","frequence":18},{"milieu":"Plaines","rarete":"Frequente","frequence":18},{"milieu":"Sous-sols","rarete":"Frequente","frequence":18}],"sust":0,"exotisme":0,"niveau":0,"base":0,"categorie":"Alchimie","rarete":""},"ownership":{"default":0,"rYShh2P1DNavdoBD":3,"Hp9ImM4o9YRTSdfu":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1673657676880,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"f4TPpX03pJuyBkuX"}
|
{"name":"Obbadion","type":"ingredient","img":"systems/foundryvtt-reve-de-dragon/icons/objets/l_obbadion.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.equipement.69vN8bRlnCrRHQCm"}},"system":{"description":"<p>Poudre bleuâtre obtenue par disruption alchimique du minerai appelé <em>obbadine</em>, sorte de tourbe.</p>\n<p>VUE/Alchimie à -2</p>","descriptionmj":"","encombrement":0.001,"quantite":1,"qualite":0,"cout":0.2,"milieu":"Lieux humides, obtenu à partir d'Obbadine (tourbe)","environnement":[{"milieu":"Cours d'eau","rarete":"Frequente","frequence":18},{"milieu":"Plaines","rarete":"Frequente","frequence":18},{"milieu":"Sous-sols","rarete":"Frequente","frequence":18}],"sust":0,"exotisme":0,"niveau":0,"base":0,"categorie":"Alchimie","rarete":""},"ownership":{"default":0,"rYShh2P1DNavdoBD":3,"Hp9ImM4o9YRTSdfu":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1673657676880,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"f4TPpX03pJuyBkuX"}
|
||||||
{"name":"Frimart","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/oiseau.webp","system":{"description":"<p>Frimart. Plaine, forêt, rivage, 3 kg, 7 sust. Nom parfois donné au noisot mâle quand il est particulièrement énervé (voir ci-dessous).</p>","descriptionmj":"","encombrement":1.5,"quantite":1,"qualite":0,"cout":0,"milieu":"Forêt, Plaine, Rivage","environnement":[{"milieu":"Cours d'eau","rarete":"Frequente","frequence":18},{"milieu":"Forêts","rarete":"Frequente","frequence":18},{"milieu":"Plaines","rarete":"Frequente","frequence":18}],"sust":7,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.hajrJoywOF9iodSL"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676878,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"hajrJoywOF9iodSL","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}}
|
{"name":"Frimart","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/oiseau.webp","system":{"description":"<p>Frimart. Plaine, forêt, rivage, 3 kg, 7 sust. Nom parfois donné au noisot mâle quand il est particulièrement énervé (voir ci-dessous).</p>","descriptionmj":"","encombrement":1.5,"quantite":1,"qualite":0,"cout":0,"milieu":"Forêt, Plaine, Rivage","environnement":[{"milieu":"Cours d'eau","rarete":"Frequente","frequence":18},{"milieu":"Forêts","rarete":"Frequente","frequence":18},{"milieu":"Plaines","rarete":"Frequente","frequence":18}],"sust":7,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.hajrJoywOF9iodSL"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676878,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"hajrJoywOF9iodSL","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}}
|
||||||
{"name":"Crampe","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/oie.webp","system":{"description":"<p>Crampe. Forêt, plaine, 10 kg, 25 sust. Lacrampe est une grosse dinde sauvage vi-vant en lisière de forêt ou en sous-bois peu épais. La crampe passe sa vie à essayer deprendre son envol, ce qu’elle ne réussit querarement et pour quelques mètres. À forcede battre inutilement des ailes, les cram-pes s’écroulent périodiquement, en proie à de terribles douleurs musculaires. C’est évidemment à ce moment qu’elles sont les plus vulnérables – ce que n’ignorent pas les prédateurs patients.</p>","descriptionmj":"","encombrement":5,"quantite":1,"qualite":0,"cout":0,"milieu":"Foret, Plaine","environnement":[{"milieu":"Forêts","rarete":"Commune","frequence":54},{"milieu":"Plaines","rarete":"Commune","frequence":46}],"sust":25,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.i2tLFSbg4nXtcD6q"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676877,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"i2tLFSbg4nXtcD6q","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}}
|
{"name":"Crampe","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/oie.webp","system":{"description":"<p>Crampe. Forêt, plaine, 10 kg, 25 sust. Lacrampe est une grosse dinde sauvage vi-vant en lisière de forêt ou en sous-bois peu épais. La crampe passe sa vie à essayer deprendre son envol, ce qu’elle ne réussit querarement et pour quelques mètres. À forcede battre inutilement des ailes, les cram-pes s’écroulent périodiquement, en proie à de terribles douleurs musculaires. C’est évidemment à ce moment qu’elles sont les plus vulnérables – ce que n’ignorent pas les prédateurs patients.</p>","descriptionmj":"","encombrement":5,"quantite":1,"qualite":0,"cout":0,"milieu":"Foret, Plaine","environnement":[{"milieu":"Forêts","rarete":"Commune","frequence":54},{"milieu":"Plaines","rarete":"Commune","frequence":46}],"sust":25,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.i2tLFSbg4nXtcD6q"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676877,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"i2tLFSbg4nXtcD6q","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}}
|
||||||
@@ -123,5 +123,5 @@
|
|||||||
{"name":"Blèmissure","type":"plante","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.wNBWvJSd9i1zHspR"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Bl%C3%A8missure.webp","effects":[],"_id":"wNBWvJSd9i1zHspR","system":{"description":"<p>Champignon affectant la forme d’une éponge, de couleur gris blême, apparaissant sur les troncs des arbres.</p><p>Pour l'empoisonnement, voir: @UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.JYMeJz8mxyI2oYIj]{Blèmissure}</p><p>Fréquente.</p>","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0,"milieu":"Forêts sombres et humides","environnement":[{"milieu":"Forêts","rarete":"Frequente","frequence":18}],"sust":0,"exotisme":0,"niveau":0,"base":0,"categorie":"Poison","rarete":"Frequente"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708528,"modifiedTime":1673791316842,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Blèmissure","type":"plante","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.wNBWvJSd9i1zHspR"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Bl%C3%A8missure.webp","effects":[],"_id":"wNBWvJSd9i1zHspR","system":{"description":"<p>Champignon affectant la forme d’une éponge, de couleur gris blême, apparaissant sur les troncs des arbres.</p><p>Pour l'empoisonnement, voir: @UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.JYMeJz8mxyI2oYIj]{Blèmissure}</p><p>Fréquente.</p>","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0,"milieu":"Forêts sombres et humides","environnement":[{"milieu":"Forêts","rarete":"Frequente","frequence":18}],"sust":0,"exotisme":0,"niveau":0,"base":0,"categorie":"Poison","rarete":"Frequente"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708528,"modifiedTime":1673791316842,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Bécasse","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/oie.webp","system":{"description":"<p>Bécasse. Plaine, 400 g, 1 sust.</p>","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0,"milieu":"Plaine","environnement":[{"milieu":"Plaines","rarete":"Frequente","frequence":15}],"sust":1,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.wWdH55gh9ErhJGgt"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676875,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"wWdH55gh9ErhJGgt","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}}
|
{"name":"Bécasse","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/oie.webp","system":{"description":"<p>Bécasse. Plaine, 400 g, 1 sust.</p>","descriptionmj":"","encombrement":0.2,"quantite":1,"qualite":0,"cout":0,"milieu":"Plaine","environnement":[{"milieu":"Plaines","rarete":"Frequente","frequence":15}],"sust":1,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.wWdH55gh9ErhJGgt"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676875,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"wWdH55gh9ErhJGgt","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}}
|
||||||
{"name":"Ortigal glauque","type":"herbe","img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Ortigal%20noir.webp","system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0,"milieu":"Plante aquatique","environnement":[{"milieu":"Cours d'eau","rarete":"Frequente","frequence":27},{"milieu":"Marais","rarete":"Commune","frequence":54}],"sust":0,"exotisme":0,"niveau":0,"base":0,"categorie":"Alchimie"},"effects":[],"flags":{"core":{"sourceId":"Item.wjvaEK4Bq2TwKCFH"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670017184070,"modifiedTime":1673657676882,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"wjvaEK4Bq2TwKCFH","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
{"name":"Ortigal glauque","type":"herbe","img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Ortigal%20noir.webp","system":{"description":"","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":0,"milieu":"Plante aquatique","environnement":[{"milieu":"Cours d'eau","rarete":"Frequente","frequence":27},{"milieu":"Marais","rarete":"Commune","frequence":54}],"sust":0,"exotisme":0,"niveau":0,"base":0,"categorie":"Alchimie"},"effects":[],"flags":{"core":{"sourceId":"Item.wjvaEK4Bq2TwKCFH"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670017184070,"modifiedTime":1673657676882,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"wjvaEK4Bq2TwKCFH","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
|
||||||
{"name":"Herbe de lune","type":"herbe","flags":{"core":{"sheetClass":"foundryvtt-reve-de-dragon.RdDItemSheet","sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.x4wGXTdmrzaOn8Sh"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Herbe%20de%20lune.webp","effects":[],"_id":"x4wGXTdmrzaOn8Sh","system":{"description":"<p>Petite herbacée aux feuilles en forme de polygone à 7 côtés, d’un bleu très pâle, presque translucide, ne poussant qu’en haute montagne, à partir de 2000 mètres, et uniquement dans les recoins pouvant être éclairés par la lune. <br /><br />L’herbe de lune possède un fort pouvoir onirique sur celui qui la consomme\"; en termes de jeu, elle permet de gagner des points de rêve. Elle doit être cueillie de nuit et lorsque la lune l’éclaire, faute de quoi son pouvoir est nul. Sa force dépend de la phase lunaire durant laquelle elle est cueillie. <br /><br />Une fois séchée, l’herbe de lune peut être fumée dans une pipe ou préparée en décoction. Dans les deux cas, une dose doit être composée de 7 brins. Dès la dose absorbée (bue ou fumée), le consommateur doit jouer un JR r-force, c’est-à-dire un jet de points de rêve ajusté négativement à la force de l’herbe. Si le JR réussit, aucun effet ne se produit\"; s’il échoue, le consommateur gagne immédiatement un nombre de points de rêve égal à la force de l’herbe, puis en échange, marque un nombre identique de points de fatigue. On peut ainsi gagner des points de rêve même si le seuil de rêve est dépassé, mais se souvenir que dépasser le triple de son seuil provoque l’éclatement. <br /><br />L’herbe de lune est parfois trouvable chez les herboristes, mais n’est pas bon marché. Une dose (7 brins) vaut usuellement un nombre de sols égal à sa force. Une dose de force 6 vaut ainsi 6 sols. <br />Rare.</p>","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":null,"milieu":"Hautes montagnes","environnement":[{"milieu":"Montagnes","rarete":"Rare","frequence":6}],"sust":0,"exotisme":0,"niveau":null,"base":0,"categorie":"","rarete":"Rare"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708528,"modifiedTime":1673657676879,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"name":"Herbe de lune","type":"herbe","flags":{"core":{"sheetClass":"foundryvtt-reve-de-dragon.RdDItemSheet","sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.x4wGXTdmrzaOn8Sh"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Herbe%20de%20lune.webp","effects":[],"_id":"x4wGXTdmrzaOn8Sh","system":{"description":"<p>Petite herbacée aux feuilles en forme de polygone à 7 côtés, d’un bleu très pâle, presque translucide, ne poussant qu’en haute montagne, à partir de 2000 mètres, et uniquement dans les recoins pouvant être éclairés par la lune. <br /><br />L’herbe de lune possède un fort pouvoir onirique sur celui qui la consomme\"; en termes de jeu, elle permet de gagner des points de rêve. Elle doit être cueillie de nuit et lorsque la lune l’éclaire, faute de quoi son pouvoir est nul. Sa force dépend de la phase lunaire durant laquelle elle est cueillie. <br /><br />Une fois séchée, l’herbe de lune peut être fumée dans une pipe ou préparée en décoction. Dans les deux cas, une dose doit être composée de 7 brins. Dès la dose absorbée (bue ou fumée), le consommateur doit jouer un JR r-force, c’est-à-dire un jet de points de rêve ajusté négativement à la force de l’herbe. Si le JR réussit, aucun effet ne se produit\"; s’il échoue, le consommateur gagne immédiatement un nombre de points de rêve égal à la force de l’herbe, puis en échange, marque un nombre identique de points de fatigue. On peut ainsi gagner des points de rêve même si le seuil de rêve est dépassé, mais se souvenir que dépasser le triple de son seuil provoque l’éclatement. <br /><br />L’herbe de lune est parfois trouvable chez les herboristes, mais n’est pas bon marché. Une dose (7 brins) vaut usuellement un nombre de sols égal à sa force. Une dose de force 6 vaut ainsi 6 sols. <br />Rare.</p>","descriptionmj":"","encombrement":0,"quantite":7,"qualite":0,"cout":3,"milieu":"Hautes montagnes","environnement":[{"milieu":"Montagnes","rarete":"Rare","frequence":6}],"sust":0,"exotisme":0,"niveau":3,"base":0,"categorie":"Autre","rarete":"Rare"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.15","coreVersion":"10.291","createdTime":1669734708528,"modifiedTime":1676073898671,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"name":"Corbeau","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/oiseau.webp","system":{"description":"<p>Corbeau. Plaine, 4 kg, 8 sust.</p>","descriptionmj":"","encombrement":2,"quantite":1,"qualite":0,"cout":0,"milieu":"Plaine","environnement":[{"milieu":"Plaines","rarete":"Commune","frequence":71}],"sust":8,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.ySY57JWhYS7PWBXv"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676876,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"ySY57JWhYS7PWBXv","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}}
|
{"name":"Corbeau","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/oiseau.webp","system":{"description":"<p>Corbeau. Plaine, 4 kg, 8 sust.</p>","descriptionmj":"","encombrement":2,"quantite":1,"qualite":0,"cout":0,"milieu":"Plaine","environnement":[{"milieu":"Plaines","rarete":"Commune","frequence":71}],"sust":8,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.ySY57JWhYS7PWBXv"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676876,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"ySY57JWhYS7PWBXv","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -8,5 +8,6 @@
|
|||||||
{"name":"Encaissement","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/svg/bones.svg","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.encaisser();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671234017623,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"WD6T8AdRbX2Ylxqe"}
|
{"name":"Encaissement","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/svg/bones.svg","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.encaisser();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671234017623,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"WD6T8AdRbX2Ylxqe"}
|
||||||
{"name":"Jet quelconque","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/sundries/gaming/dice-runed-tan.webp","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.roll();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671233500655,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"bnJnbKDHpbqY8Pr9"}
|
{"name":"Jet quelconque","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/sundries/gaming/dice-runed-tan.webp","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.roll();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671233500655,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"bnJnbKDHpbqY8Pr9"}
|
||||||
{"name":"Recherche et tirage","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/tools/scribal/magnifying-glass.webp","command":"game.system.rdd.commands.tirage()","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.ZFWPNdQBjQs9z0YW"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.5.4","coreVersion":"10.291","createdTime":1673472449426,"modifiedTime":1673655461651,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"iVZnxOxhCMpkvYh3"}
|
{"name":"Recherche et tirage","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/tools/scribal/magnifying-glass.webp","command":"game.system.rdd.commands.tirage()","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.ZFWPNdQBjQs9z0YW"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.5.4","coreVersion":"10.291","createdTime":1673472449426,"modifiedTime":1673655461651,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"iVZnxOxhCMpkvYh3"}
|
||||||
|
{"name":"Thème astral","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/magic/nature/symbol-moon-stars-white.webp","command":"game.system.rdd.AppAstrologie.create()","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.oA0HPFeFK6YMspAX"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.19","coreVersion":"10.291","createdTime":1678127868791,"modifiedTime":1678237392810,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"koqhiDJSGP4gQ4vf"}
|
||||||
{"name":"Jet d'éthylisme","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/consumables/drinks/alcohol-beer-stein-wooden-metal-brown.webp","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.jetEthylisme();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671233646086,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"mvub1dRHNFmWjRr7"}
|
{"name":"Jet d'éthylisme","type":"script","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"icons/consumables/drinks/alcohol-beer-stein-wooden-metal-brown.webp","command":"const selected = game.system.rdd.RdDUtility.getSelectedActor();\nif (selected) {\n selected.jetEthylisme();\n}\nelse {\n ui.notifications.info('Pas de personnage sélectionné');\n}","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.XHNbjnGKXaCiCadq"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1671220038331,"modifiedTime":1671233646086,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"mvub1dRHNFmWjRr7"}
|
||||||
{"name":"Tirer le tarot","type":"chat","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp","command":"/tirer tarot","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.HBZSKR9OHCQbLcTC"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1669469547231,"modifiedTime":1671237401618,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"vTfJTFYYiRu8X5LM"}
|
{"name":"Tirer le tarot","type":"chat","scope":"global","author":"Hp9ImM4o9YRTSdfu","img":"systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp","command":"/tirer tarot","ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3},"flags":{"core":{"sourceId":"Macro.HBZSKR9OHCQbLcTC"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.15","coreVersion":"10.291","createdTime":1669469547231,"modifiedTime":1671237401618,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"folder":null,"sort":0,"_id":"vTfJTFYYiRu8X5LM"}
|
||||||
|
|||||||
@@ -1,25 +1,25 @@
|
|||||||
{"_id":"2KM1yiEOE0ZdT2oL","name":"Désir d'escalade difficile","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.2KM1yiEOE0ZdT2oL"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. Hauteur à grimper : 4d6 m, difficulté de l’escalade : 1d4-4.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017067,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"2KM1yiEOE0ZdT2oL","name":"Désir d'escalade difficile","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.2KM1yiEOE0ZdT2oL"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. Hauteur à grimper : 4d6 m, difficulté de l’escalade : 1d4-4.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017067,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"2KbzOC2aj98CiQbW","name":"Désir de blesser un enfant","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.2KbzOC2aj98CiQbW"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. Causer au minimum une blessure légère.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017067,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"2KbzOC2aj98CiQbW","name":"Désir de blesser un enfant","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.2KbzOC2aj98CiQbW"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. Causer au minimum une blessure légère.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017067,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"3dnmi4Fyh5eUQcyP","name":"Urgence draconique","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.3dnmi4Fyh5eUQcyP"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Le haut-rêvant est pris du besoin irrésistible de déclencher immédiatement son plus proche sort en réserve. À équidistance, prendre dans le sens des aiguilles d’une montre en commençant par le haut. En cas de rencontre dans les TMR, se dérober équivaut à refouler la queue de Dragon. Si aucun sort n’est en réserve, ou si il y a impossibilité de pratiquer la magie à cause d’une autre queue ou d’un souffle, tirer à la place une idée fixe.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"false","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017067,"modifiedTime":1673118685215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"3dnmi4Fyh5eUQcyP","name":"Urgence draconique","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.3dnmi4Fyh5eUQcyP"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Le haut-rêvant est pris du besoin irrésistible de déclencher immédiatement son plus proche sort en réserve. À équidistance, prendre dans le sens des aiguilles d’une montre en commençant par le haut. En cas de rencontre dans les TMR, se dérober équivaut à refouler la queue de Dragon. Si aucun sort n’est en réserve, ou si il y a impossibilité de pratiquer la magie à cause d’une autre queue ou d’un souffle, tirer à la place une idée fixe.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478017067,"modifiedTime":1679614524362,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"6MUcjYfxfi45STvo","name":"Insomnie","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.6MUcjYfxfi45STvo"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Impossibilité totale de dormir, et donc de rêver, pendant un jour.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017067,"modifiedTime":1673118685215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"6MUcjYfxfi45STvo","name":"Insomnie","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.6MUcjYfxfi45STvo"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Impossibilité totale de dormir, et donc de rêver, pendant un jour.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017067,"modifiedTime":1673118685215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"DnhuuGUEbOF95JlN","name":"Désir de boire du sang chaud","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.DnhuuGUEbOF95JlN"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. Il s’agit de sang encore chaud de la chaleur naturelle de la victime.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"DnhuuGUEbOF95JlN","name":"Désir de boire du sang chaud","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.DnhuuGUEbOF95JlN"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. Il s’agit de sang encore chaud de la chaleur naturelle de la victime.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"N9j8K6x89BdS7ZKN","name":"Conquête","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.N9j8K6x89BdS7ZKN"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement et la <em>maîtriser</em>, difficulté -7. Ce peut être n’importe quelle case, sauf une case humide. En cas d’échec, la concentration est rompue ; il n’y a pas de souffle de Dragon en cas d’échec total.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"false","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1673118685213,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"N9j8K6x89BdS7ZKN","name":"Conquête","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.N9j8K6x89BdS7ZKN"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement et la <em>maîtriser</em>, difficulté -7. Ce peut être n’importe quelle case, sauf une case humide. En cas d’échec, la concentration est rompue ; il n’y a pas de souffle de Dragon en cas d’échec total.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1679614460613,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PMz7SaB6sRxhwrWw","name":"Coup de barre","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.PMz7SaB6sRxhwrWw"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Prise immédiate de 3d6 points de fatigue.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"PMz7SaB6sRxhwrWw","name":"Coup de barre","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.PMz7SaB6sRxhwrWw"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Prise immédiate de 3d6 points de fatigue.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"PmEjVox3Q6SPF730","name":"Inertie draconique","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.PmEjVox3Q6SPF730"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, la fatigue en TMR est doublée. Chaque case ou round coûte 2 points au lieu d’un.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"PmEjVox3Q6SPF730","name":"Inertie draconique","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.PmEjVox3Q6SPF730"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, la fatigue en TMR est doublée. Chaque case ou round coûte 2 points au lieu d’un.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"RrPMV2HW2Rg8POK1","name":"Souvenir morbide de l'archétype","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.RrPMV2HW2Rg8POK1"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Les prochains points d’expérience dus au stress doivent être mis en Thanatos.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":5,"hautrevant":true,"categorie":"false","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1673118685215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"RrPMV2HW2Rg8POK1","name":"Souvenir morbide de l'archétype","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.RrPMV2HW2Rg8POK1"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Les prochains points d’expérience dus au stress doivent être mis en Thanatos.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":5,"hautrevant":true,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1679614525067,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"S7se7qPnL6WDg5U5","name":"Mauvaise rencontre en perspective","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.S7se7qPnL6WDg5U5"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Tirer la prochaine rencontre dans les TMR sur la @Compendium[foundryvtt-reve-de-dragon.tables-diverses.66ye0OOxBO9LEjdd]{Table spéciale de rencontres}</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"false","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1673118685215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"S7se7qPnL6WDg5U5","name":"Mauvaise rencontre en perspective","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.S7se7qPnL6WDg5U5"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Tirer la prochaine rencontre dans les TMR sur la @Compendium[foundryvtt-reve-de-dragon.tables-diverses.66ye0OOxBO9LEjdd]{Table spéciale de rencontres}</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478017068,"modifiedTime":1679614525873,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"UmvGxA4cFSoRE82Z","name":"Dépouillement","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.UmvGxA4cFSoRE82Z"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Faire don de toute la monnaie actuellement possédée à la première personne inconnue rencontrée. En attendant, se garder d’aucune dépense.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"false","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"UmvGxA4cFSoRE82Z","name":"Dépouillement","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.UmvGxA4cFSoRE82Z"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Faire don de toute la monnaie actuellement possédée à la première personne inconnue rencontrée. En attendant, se garder d’aucune dépense.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1679614470999,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"aZWuRmi8lplZQcdM","name":"Amnésie sélective","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.aZWuRmi8lplZQcdM"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, perte totale d’une compétence, à l’exclusion du Draconic. Déterminer aléatoirement la compétence visée qui, pratiquement, retourne au niveau de base. Si elle est déjà au niveau de base, en choisir une autre.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1673118685213,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"aZWuRmi8lplZQcdM","name":"Amnésie sélective","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.aZWuRmi8lplZQcdM"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, perte totale d’une compétence, à l’exclusion du Draconic. Déterminer aléatoirement la compétence visée qui, pratiquement, retourne au niveau de base. Si elle est déjà au niveau de base, en choisir une autre.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1673118685213,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"cUkRSRz5DJYb3WM8","name":"Couardise irraisonnée","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.cUkRSRz5DJYb3WM8"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>la prochaine occasion de combat, obligation de fuir, de se cacher ou de se rendre. Impossibilité d’utiliser aucune magie, ni sur l’ennemi, ni sur soi-même.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"false","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1673118685213,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"cUkRSRz5DJYb3WM8","name":"Couardise irraisonnée","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.cUkRSRz5DJYb3WM8"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>la prochaine occasion de combat, obligation de fuir, de se cacher ou de se rendre. Impossibilité d’utiliser aucune magie, ni sur l’ennemi, ni sur soi-même.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1679614463556,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"dFf8jaC0RvidC1ZC","name":"Haine fatale","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.dFf8jaC0RvidC1ZC"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>On devient immédiatement haineux et jaloux envers la première personne inconnue de même sexe et de même espèce rencontrée. Traiter comme le Coup de foudre fatal. La satisfaction s’obtient en blessant gravement ou en infligeant une cuisante humiliation publique.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":10,"hautrevant":false,"categorie":"lancinant","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"dFf8jaC0RvidC1ZC","name":"Haine fatale","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.dFf8jaC0RvidC1ZC"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>On devient immédiatement haineux et jaloux envers la première personne inconnue de même sexe et de même espèce rencontrée. Traiter comme le Coup de foudre fatal. La satisfaction s’obtient en blessant gravement ou en infligeant une cuisante humiliation publique.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":10,"hautrevant":false,"categorie":"lancinant","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"e67rXcuO236ioYAr","name":"Infarctus","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.e67rXcuO236ioYAr"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Perte immédiate de 4 points de vie (et 8 points d’endurance). Ces points pourront commencer à être regagnés au bout d’un jour complet.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":5,"hautrevant":false,"categorie":"false","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"e67rXcuO236ioYAr","name":"Infarctus","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.e67rXcuO236ioYAr"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Perte immédiate de 4 points de vie (et 8 points d’endurance). Ces points pourront commencer à être regagnés au bout d’un jour complet.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":5,"hautrevant":false,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1679614525870,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"fO1jjVlOb6faLv3T","name":"Désir de dormir dans un cercueil","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.fO1jjVlOb6faLv3T"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"fO1jjVlOb6faLv3T","name":"Désir de dormir dans un cercueil","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.fO1jjVlOb6faLv3T"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017069,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"fUKNZ0uEG2y2PkOk","name":"Injurier le premier inconnu rencontré","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.fUKNZ0uEG2y2PkOk"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir d'injurier la première personne inconnue rencontrée</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"false","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"fUKNZ0uEG2y2PkOk","name":"Injurier le premier inconnu rencontré","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.fUKNZ0uEG2y2PkOk"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir d'injurier la première personne inconnue rencontrée</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1679614525871,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"gT0PQAxlYrtITyut","name":"Désir de blesser une femme","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.gT0PQAxlYrtITyut"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. Causer au minimum une blessure légère.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"gT0PQAxlYrtITyut","name":"Désir de blesser une femme","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.gT0PQAxlYrtITyut"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. Causer au minimum une blessure légère.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"lz3ghhJzkPRWJ2jz","name":"Désir de parler à un crâne (humain)","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.lz3ghhJzkPRWJ2jz"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. La \"conversation\" doit durer un minimum de 15 minutes.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"lz3ghhJzkPRWJ2jz","name":"Désir de parler à un crâne (humain)","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.lz3ghhJzkPRWJ2jz"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. La \"conversation\" doit durer un minimum de 15 minutes.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"spYuiInqbCoDsKvd","name":"Héroïsme forcené","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.spYuiInqbCoDsKvd"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>À la prochaine occasion de combat, obligation de foncer en tête en corps à corps ou avec une arme de mêlée. Impossibilité d’utiliser aucune magie, ni sur l’ennemi, ni sur soi-même.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":9,"hautrevant":false,"categorie":"false","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"spYuiInqbCoDsKvd","name":"Héroïsme forcené","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.spYuiInqbCoDsKvd"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>À la prochaine occasion de combat, obligation de foncer en tête en corps à corps ou avec une arme de mêlée. Impossibilité d’utiliser aucune magie, ni sur l’ennemi, ni sur soi-même.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":9,"hautrevant":false,"categorie":"false","refoulement":4,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"twUoR8ALYiabkfoE","name":"Désir d'entendre hurler de terreur","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.twUoR8ALYiabkfoE"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. Il doit s’agir d’un hurlement humain.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"twUoR8ALYiabkfoE","name":"Désir d'entendre hurler de terreur","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.twUoR8ALYiabkfoE"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire. Il doit s’agir d’un hurlement humain.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"uQ4PwcwplvZarfn1","name":"Montée laborieuse","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.uQ4PwcwplvZarfn1"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, monter en TMR coûte 2 points de rêve au lieu d’un, et 3 points en déplacement accéléré.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"uQ4PwcwplvZarfn1","name":"Montée laborieuse","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.uQ4PwcwplvZarfn1"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, monter en TMR coûte 2 points de rêve au lieu d’un, et 3 points en déplacement accéléré.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"wqWkQQsAPVlFw4ft","name":"Désir d'assister à une pendaison","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.wqWkQQsAPVlFw4ft"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"wqWkQQsAPVlFw4ft","name":"Désir d'assister à une pendaison","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.wqWkQQsAPVlFw4ft"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Désir thanataire.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":4,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"yEHdCabJYx0qvoL5","name":"Réinsertion aléatoire","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.yEHdCabJYx0qvoL5"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Comme après une sortie de la carte, le gardien des rêves réintroduit secrètement le demi-rêve du haut-rêvant dans les TMR.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"false","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"yEHdCabJYx0qvoL5","name":"Réinsertion aléatoire","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.yEHdCabJYx0qvoL5"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Comme après une sortie de la carte, le gardien des rêves réintroduit secrètement le demi-rêve du haut-rêvant dans les TMR.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1679614525586,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"zIXgRwfB83DMaNX8","name":"Pèlerinage","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.zIXgRwfB83DMaNX8"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement. Un Passeur peut l’y téléporter, mais un Messager ne peut s’y rendre à sa place. Dès que la case est atteinte, le pèlerinage est accompli.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"false","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1673118685215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"zIXgRwfB83DMaNX8","name":"Pèlerinage","type":"ombre","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.ombres-de-thanatos.zIXgRwfB83DMaNX8"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement. Un Passeur peut l’y téléporter, mais un Messager ne peut s’y rendre à sa place. Dès que la case est atteinte, le pèlerinage est accompli.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":true,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478017070,"modifiedTime":1679614525874,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{"_id":"0jrEZ62Q2Jz4kBGf","name":"Mauvaise rencontre en perspective","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.0jrEZ62Q2Jz4kBGf"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>La prochaine rencontre dans les TMR sera tirée de la @Compendium[foundryvtt-reve-de-dragon.tables-diverses.66ye0OOxBO9LEjdd]{Table spéciale de rencontres}</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025459,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"0jrEZ62Q2Jz4kBGf","name":"Mauvaise rencontre en perspective","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.0jrEZ62Q2Jz4kBGf"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>La prochaine rencontre dans les TMR sera tirée de la @Compendium[foundryvtt-reve-de-dragon.tables-diverses.66ye0OOxBO9LEjdd]{Table spéciale de rencontres}</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025459,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"0uc2pMIGL03Hq2Hn","name":"Anorexie. Ne rien avaler, ni solide, ni liquide, pas même une potion","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.0uc2pMIGL03Hq2Hn"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025459,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"0uc2pMIGL03Hq2Hn","name":"Anorexie. Ne rien avaler, ni solide, ni liquide, pas même une potion","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.0uc2pMIGL03Hq2Hn"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025459,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"1gGVlZM0UyifL6RK","name":"Souvenir obsessionnel de l'archétype","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.1gGVlZM0UyifL6RK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Les prochains points d’expérience dus au stress doivent être mis dans une compétence déterminée aléatoirement par la table de @Compendium[foundryvtt-reve-de-dragon.tables-diverses.E0WLgjn6LA9WsvKJ]{Détermination aléatoire de compétence}.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":48,"hautrevant":false,"categorie":"","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025459,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"1gGVlZM0UyifL6RK","name":"Souvenir obsessionnel de l'archétype","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.1gGVlZM0UyifL6RK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Les prochains points d’expérience dus au stress doivent être mis dans une compétence déterminée aléatoirement par la table de @Compendium[foundryvtt-reve-de-dragon.tables-diverses.E0WLgjn6LA9WsvKJ]{Détermination aléatoire de compétence}.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":48,"hautrevant":false,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478025459,"modifiedTime":1679614413217,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"1l59lWbtvYp74OTb","name":"Briser un objet de verre","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.1l59lWbtvYp74OTb"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"1l59lWbtvYp74OTb","name":"Briser un objet de verre","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.1l59lWbtvYp74OTb"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"22EQLBJfHVYs96iC","name":"Cracher dans toute nourriture ou boisson aperçue","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.22EQLBJfHVYs96iC"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"22EQLBJfHVYs96iC","name":"Cracher dans toute nourriture ou boisson aperçue","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.22EQLBJfHVYs96iC"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"2Rtm78bMKPy8eG4q","name":"Éteindre tout feu rencontré (feu de camp, torche, lanterne, etc.)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.2Rtm78bMKPy8eG4q"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"2Rtm78bMKPy8eG4q","name":"Éteindre tout feu rencontré (feu de camp, torche, lanterne, etc.)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.2Rtm78bMKPy8eG4q"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
@@ -9,12 +9,12 @@
|
|||||||
{"_id":"32LbwxxokC9Tn370","name":"Coup de foudre fatal","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.32LbwxxokC9Tn370"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>On devient immédiatement amoureux fou de la première personne inconnue de sexe opposé et de même espèce rencontrée. Tant que satisfaction n’est pas obtenue, traiter comme un désir lancinant. </p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"32LbwxxokC9Tn370","name":"Coup de foudre fatal","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.32LbwxxokC9Tn370"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>On devient immédiatement amoureux fou de la première personne inconnue de sexe opposé et de même espèce rencontrée. Tant que satisfaction n’est pas obtenue, traiter comme un désir lancinant. </p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"lancinant","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"3BcC8lSsP5WIyva7","name":"Gagner de l’argent (minimum 10 deniers)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.3BcC8lSsP5WIyva7"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"3BcC8lSsP5WIyva7","name":"Gagner de l’argent (minimum 10 deniers)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.3BcC8lSsP5WIyva7"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"3ZjwYyQRatCMnBCi","name":"Mégalomanie. Être acclamé par un minimum de 10 personnes","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.3ZjwYyQRatCMnBCi"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"3ZjwYyQRatCMnBCi","name":"Mégalomanie. Être acclamé par un minimum de 10 personnes","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.3ZjwYyQRatCMnBCi"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"5knw1NcnBsLIjHpr","name":"Montée laborieuse","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.5knw1NcnBsLIjHpr"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, monter en TMR coûte 2 points de rêve au lieu d’un, et 3 points en déplacement accéléré.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"5knw1NcnBsLIjHpr","name":"Montée laborieuse","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.5knw1NcnBsLIjHpr"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, monter en TMR coûte 2 points de rêve au lieu d’un, et 3 points en déplacement accéléré.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1679614361208,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"6G0lF06jSryTduAt","name":"Avoir le visage noirci à la cendre","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.6G0lF06jSryTduAt"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"6G0lF06jSryTduAt","name":"Avoir le visage noirci à la cendre","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.6G0lF06jSryTduAt"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025460,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"7TKsit2Mv9mWGq3C","name":"Ne marcher qu’à quatre pattes","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.7TKsit2Mv9mWGq3C"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"7TKsit2Mv9mWGq3C","name":"Ne marcher qu’à quatre pattes","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.7TKsit2Mv9mWGq3C"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"8sLXQBqo8XwjAFG0","name":"Acquérir une chèvre","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.8sLXQBqo8XwjAFG0"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700209,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"8sLXQBqo8XwjAFG0","name":"Acquérir une chèvre","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.8sLXQBqo8XwjAFG0"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700209,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"E902EEYZHg3zFKq6","name":"Garder les yeux bandés","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.E902EEYZHg3zFKq6"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"E902EEYZHg3zFKq6","name":"Garder les yeux bandés","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.E902EEYZHg3zFKq6"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"EUrxQGd7FuW628NS","name":"Inertie draconique","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.EUrxQGd7FuW628NS"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, la fatigue en TMR est doublée. Chaque case ou round coûte 2 points au lieu d’un.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700213,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"EUrxQGd7FuW628NS","name":"Inertie draconique","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.EUrxQGd7FuW628NS"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, la fatigue en TMR est doublée. Chaque case ou round coûte 2 points au lieu d’un.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1679614313037,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"F6qL4d4g3qjh045R","name":"Danser nu sous la pluie","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.F6qL4d4g3qjh045R"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"F6qL4d4g3qjh045R","name":"Danser nu sous la pluie","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.F6qL4d4g3qjh045R"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"F8G3rdU1nfJzYwYR","name":"Garder sur soi 3d6 kilos de cailloux","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.F8G3rdU1nfJzYwYR"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"F8G3rdU1nfJzYwYR","name":"Garder sur soi 3d6 kilos de cailloux","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.F8G3rdU1nfJzYwYR"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"HSNOvBR890dsEDw2","name":"Se faire raser la tête","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.HSNOvBR890dsEDw2"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"HSNOvBR890dsEDw2","name":"Se faire raser la tête","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.HSNOvBR890dsEDw2"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025461,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
@@ -28,11 +28,11 @@
|
|||||||
{"_id":"OSV2b7bVWv2SCfUY","name":"Urgence draconique","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.OSV2b7bVWv2SCfUY"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Le haut-rêvant est pris du besoin irrésistible de déclencher immédiatement son plus proche sort en réserve. À équidistance, prendre dans le sens des aiguilles d’une montre en commençant par le haut. En cas de rencontre dans les TMR, se dérober équivaut à refouler la queue de Dragon. Si aucun sort n’est en réserve, ou si il y a impossibilité de pratiquer la magie à cause d’une autre queue ou d’un souffle, tirer à la place une idée fixe.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"OSV2b7bVWv2SCfUY","name":"Urgence draconique","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.OSV2b7bVWv2SCfUY"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Le haut-rêvant est pris du besoin irrésistible de déclencher immédiatement son plus proche sort en réserve. À équidistance, prendre dans le sens des aiguilles d’une montre en commençant par le haut. En cas de rencontre dans les TMR, se dérober équivaut à refouler la queue de Dragon. Si aucun sort n’est en réserve, ou si il y a impossibilité de pratiquer la magie à cause d’une autre queue ou d’un souffle, tirer à la place une idée fixe.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"OjG8XRbeYtq2jcgB","name":"Casser 3d6 oeufs en les jetant à terre","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.OjG8XRbeYtq2jcgB"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"OjG8XRbeYtq2jcgB","name":"Casser 3d6 oeufs en les jetant à terre","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.OjG8XRbeYtq2jcgB"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"QHUOwjMR6AvepGPm","name":"Traire une vache","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.QHUOwjMR6AvepGPm"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"QHUOwjMR6AvepGPm","name":"Traire une vache","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.QHUOwjMR6AvepGPm"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"Qgj5eSMpQ0IDHwZX","name":"Coup de barre","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.Qgj5eSMpQ0IDHwZX"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Prise immédiate de 3d6 points de fatigue.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"Qgj5eSMpQ0IDHwZX","name":"Coup de barre","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.Qgj5eSMpQ0IDHwZX"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Prise immédiate de 3d6 points de fatigue.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1679614376913,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"RVslW735GbPbXCpP","name":"Pèlerinage","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.RVslW735GbPbXCpP"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement. Un Passeur peut l’y téléporter, mais un Messager ne peut s’y rendre à sa place. Dès que la case est atteinte, le pèlerinage est accompli.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"RVslW735GbPbXCpP","name":"Pèlerinage","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.RVslW735GbPbXCpP"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement. Un Passeur peut l’y téléporter, mais un Messager ne peut s’y rendre à sa place. Dès que la case est atteinte, le pèlerinage est accompli.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1679614238011,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"S8PVNgxb7TcFXq9g","name":"Pisser dans un violon (luth, mandoline, etc.)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.S8PVNgxb7TcFXq9g"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"S8PVNgxb7TcFXq9g","name":"Pisser dans un violon (luth, mandoline, etc.)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.S8PVNgxb7TcFXq9g"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025463,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"SY0SsWtZdxSodMcl","name":"Manger du poisson","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.SY0SsWtZdxSodMcl"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025464,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"SY0SsWtZdxSodMcl","name":"Manger du poisson","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.SY0SsWtZdxSodMcl"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025464,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"TmEeikWOQt6NZGVY","name":"Masque de Narcos","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.TmEeikWOQt6NZGVY"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant 1d7 jours à compter du lendemain, la caractéristique APPARENCE baisse de 1d6 points, de même que la Beauté.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"","refoulement":1,"duree":"1d7jours","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025464,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"TmEeikWOQt6NZGVY","name":"Masque de Narcos","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.TmEeikWOQt6NZGVY"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant 1d7 jours à compter du lendemain, la caractéristique APPARENCE baisse de 1d6 points, de même que la Beauté.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"","refoulement":0,"duree":"1d7jours","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478025464,"modifiedTime":1679614425790,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"UUTbsktTcxsIe5L5","name":"Ne pas franchir de porte. (On peut franchir une fenêtre)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.UUTbsktTcxsIe5L5"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025464,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"UUTbsktTcxsIe5L5","name":"Ne pas franchir de porte. (On peut franchir une fenêtre)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.UUTbsktTcxsIe5L5"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025464,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"VChJbtGFtWoiFNky","name":"Refuser de se délester du moindre objet, ni donner ni prêter","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.VChJbtGFtWoiFNky"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025464,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"VChJbtGFtWoiFNky","name":"Refuser de se délester du moindre objet, ni donner ni prêter","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.VChJbtGFtWoiFNky"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025464,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"YCHBbRLiMzTH7IBj","name":"Ne s’exprimer que par des cris d’animaux (meuh ! coin-coin ! etc.)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.YCHBbRLiMzTH7IBj"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025464,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"YCHBbRLiMzTH7IBj","name":"Ne s’exprimer que par des cris d’animaux (meuh ! coin-coin ! etc.)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.YCHBbRLiMzTH7IBj"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025464,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
@@ -43,13 +43,13 @@
|
|||||||
{"_id":"gMmqdJ9I7Mt8Tg3f","name":"Ne dire que «non» ou négation analogue","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.gMmqdJ9I7Mt8Tg3f"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"gMmqdJ9I7Mt8Tg3f","name":"Ne dire que «non» ou négation analogue","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.gMmqdJ9I7Mt8Tg3f"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700214,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"gadh6aI5iCM82qpP","name":"Manger des champignons","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.gadh6aI5iCM82qpP"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700213,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"gadh6aI5iCM82qpP","name":"Manger des champignons","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.gadh6aI5iCM82qpP"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700213,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"hghw6Cldrad1CIiJ","name":"Refuser de se déplacer autrement que porté","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.hghw6Cldrad1CIiJ"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"hghw6Cldrad1CIiJ","name":"Refuser de se déplacer autrement que porté","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.hghw6Cldrad1CIiJ"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"iHuLw0I1Gc5mIucG","name":"Réinsertion aléatoire","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.iHuLw0I1Gc5mIucG"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Comme après une sortie de la carte, le gardien des rêves réintroduit secrètement le demi-rêve du haut-rêvant dans les TMR.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"iHuLw0I1Gc5mIucG","name":"Réinsertion aléatoire","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.iHuLw0I1Gc5mIucG"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Comme après une sortie de la carte, le gardien des rêves réintroduit secrètement le demi-rêve du haut-rêvant dans les TMR.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1679614348966,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"iJw6j7kuP1eAHIck","name":"Amnésie sélective","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.iJw6j7kuP1eAHIck"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, perte totale d’une compétence, à l’exclusion du Draconic. Déterminer aléatoirement la compétence visée qui, pratiquement, retourne au niveau de base. Si elle est déjà au niveau de base, en choisir une autre.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700209,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"iJw6j7kuP1eAHIck","name":"Amnésie sélective","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.iJw6j7kuP1eAHIck"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Pendant un jour, perte totale d’une compétence, à l’exclusion du Draconic. Déterminer aléatoirement la compétence visée qui, pratiquement, retourne au niveau de base. Si elle est déjà au niveau de base, en choisir une autre.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1679614403347,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"iPYPgxL2uUnphStc","name":"Garder une main sur la tête","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.iPYPgxL2uUnphStc"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700212,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"iPYPgxL2uUnphStc","name":"Garder une main sur la tête","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.iPYPgxL2uUnphStc"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700212,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"j2xIrFWYqhDM4TcN","name":"Appeler les hommes «madame» et les femmes «messire»","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.j2xIrFWYqhDM4TcN"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"j2xIrFWYqhDM4TcN","name":"Appeler les hommes «madame» et les femmes «messire»","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.j2xIrFWYqhDM4TcN"}},"system":{"description":"<p>Prend effet immédiatement et dure jusqu'à la <strong>fin de l'heure du Château Dormant </strong>du <strong>lendemain.<br /></strong>Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"ideefixe","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"jShpKV8mVcqWmYvp","name":"Se soûler (minimum pas frais)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.jShpKV8mVcqWmYvp"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"jShpKV8mVcqWmYvp","name":"Se soûler (minimum pas frais)","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.jShpKV8mVcqWmYvp"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025465,"modifiedTime":1673118700215,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"kHWwwxA0alcpDYpf","name":"Insomnie","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.kHWwwxA0alcpDYpf"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Impossibilité totale de dormir, et donc de rêver, pendant un jour.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"","refoulement":1,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025466,"modifiedTime":1673118700213,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"kHWwwxA0alcpDYpf","name":"Insomnie","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.kHWwwxA0alcpDYpf"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Impossibilité totale de dormir, et donc de rêver, pendant un jour.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"","refoulement":0,"duree":"jour","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478025466,"modifiedTime":1679614392997,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"lBkO8FvFqXoKNhvk","name":"Conquête","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.lBkO8FvFqXoKNhvk"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement et la <em>maîtriser</em>, difficulté -7. Ce peut être n’importe quelle case, sauf une case humide. En cas d’échec, la concentration est rompue ; il n’y a pas de souffle de Dragon en cas d’échec total.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025466,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"lBkO8FvFqXoKNhvk","name":"Conquête","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.lBkO8FvFqXoKNhvk"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement et la <em>maîtriser</em>, difficulté -7. Ce peut être n’importe quelle case, sauf une case humide. En cas d’échec, la concentration est rompue ; il n’y a pas de souffle de Dragon en cas d’échec total.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":16,"hautrevant":true,"categorie":"","refoulement":0,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.7.3","coreVersion":"10.291","createdTime":1669478025466,"modifiedTime":1679614282249,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"mN0yghXkFfj2YctJ","name":"Construire une cabane","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.mN0yghXkFfj2YctJ"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025466,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"mN0yghXkFfj2YctJ","name":"Construire une cabane","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.mN0yghXkFfj2YctJ"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025466,"modifiedTime":1673118700210,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"sjXBBr85OBk4Yg4t","name":"Embrasser un cochon sur le groin","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.sjXBBr85OBk4Yg4t"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025466,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"sjXBBr85OBk4Yg4t","name":"Embrasser un cochon sur le groin","type":"queue","img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.sjXBBr85OBk4Yg4t"}},"system":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.<br />Les points d'expérience dus au stress ne sont pas affectés.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":3,"hautrevant":false,"categorie":"lancinant","refoulement":1,"duree":"","restant":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025466,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
{"_id":"vft88ioHpGxMzdML","name":"Dépouillement","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.vft88ioHpGxMzdML"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Faire don de toute la monnaie actuellement possédée à la première personne inconnue rencontrée. En attendant, se garder d’aucune dépense.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025466,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
{"_id":"vft88ioHpGxMzdML","name":"Dépouillement","type":"queue","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.queues-de-dragon.vft88ioHpGxMzdML"}},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"system":{"description":"<p>Faire don de toute la monnaie actuellement possédée à la première personne inconnue rencontrée. En attendant, se garder d’aucune dépense.</p>","descriptionmj":"","temporel":{"debut":{"indexDate":0,"indexMinute":0},"fin":{"indexDate":0,"indexMinute":0}},"frequence":20,"hautrevant":false,"categorie":"","refoulement":2,"duree":"","restant":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.4.9","coreVersion":"10.291","createdTime":1669478025466,"modifiedTime":1673118700211,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user