Compare commits

..

No commits in common. "v10" and "foundryvtt-reve-de-dragon-10.6.1" have entirely different histories.

216 changed files with 4339 additions and 6714 deletions

1
.gitignore vendored
View File

@ -1,6 +1,5 @@
.vscode/settings.json .vscode/settings.json
.idea .idea
.history
todo.md todo.md
/.vscode /.vscode
/ignored/ /ignored/

View File

@ -1,298 +1,10 @@
# v10.7 - L'os de Sémolosse ==================================================================
v0.9.2 - 05/09/2020
## v10.7.20 - la poigne de Sémolosse Erreur de calcul sur points de vie
- correction de méthodes qui filtrent les items Gestion différente des compétences "troncs"
- recherche de cases TMR
- recherche de tâches de lecture
- recherche d'armure (pour le malus armure)
- recherche de potions
## v10.7.20 - la poigne de Sémolosse ==================================================================
- correction de l'empoignade v0.9.1 - 03/09/2020
- 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
## v10.7.19 - les fantômes de Sémolosse Initial official release
- 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é
## v10.7.18 - le repos de Sémolosse
- correction des dates de blessures qui ne marchaient plus
## v10.7.17 - le doigt du destin de Sémolosse
- correction de la validation d'encaissement par le MJ
## v10.7.16 - la morsure de Sémolosse
- correction de l'affichage des objets suite à confusion
- correction de liens dans la liste des équipements
## v10.7.14 - l'expérience de Sémolosse
- Affichage des personnages accordés sur les fiches des entités
- Refonte du journal d'expérience
- disponible pour les personnages des joueurs
- explication "comptable" des changements (dépense ou ajout, changements de niveaux, ...)
- tri alphabétique des différentes listes (sorts, recettes, oeuvres, ...)
## v10.7.13 - l'armure de Sémolosse
- Fix: en cas d'armure variable, la détérioration diminue le dé d'armure
## v10.7.12
- Fix: si le MJ gère les changements de jours, l'option "sieste" de la fenêtre de repos est prise par défaut si chateau dormant n'est pas passé
## v10.7.11 - Le Pugilat de Sémolosse
- Fix sur la projection au sol.
## v10.7.10 - Le Pugilat de Sémolosse
- Gestion de l'empoignade
- Corrections sur l'initiative
- Correction sur l'equipement des vêtements et bijoux
## v10.7.9 - Le Pugilat de Sémolosse
- Gestion assistée de l'empoignade
1. On selectionne sa cible (ie le token qui va être empoigné)
2. On lance une attaque avec l'"arme" _Empoignade_
3. A ce stade, si la victime a une arme, on rappelle le point de règle d'engagement
(page 134), et un bouton permet de confirmer l'empoignade
4. L'empoigneur fait son jet
5. Si réussite, l'empoigné peut se défendre, avec gestion du premier round d'engagement
(ie Esquive autorisée ou pas)
- 4 bis. et 5 bis. L'empoigné, à son tour, peut tenter de se libérer, toujours en cliquant sur l'action "Empoignade"
6. Selon le résultat, incrément/décrément des points d'emp
7. Retour en 4., ou si 2 points d'Emp, alors 8.
8. Affichage des options disponibles pour l'empoigneur : perte d'endurance, projection au
sol ou entrainer au sol. Ces 3 options sont gérées automatiquement ensuite, selon le
bouton cliqué par l'empoigneur.
Les empoignades sont des "items" supprimées à la fin d'un combat, qui peuvent aussi être
gérés par le MJ au cas ou. Hors combat, penser à les supprimer (ou commencer et
arrêter un combat).
## v10.7.7 - Les bobos de Sémolosse
- Mise à jour du texte de l'heure pour les joueurs
- L'horloge n'empêche plus de sélectionner les tokens dessous
- _Lecture & Détection d'Aura_ sous Hypnos sont des rituels
- _Lire les étoiles_ pour les joueurs de nouveau fonctionnel
- Ajout de logs pour comprendre un cas d'échec des achatVente
## v10.7.6 - L'origine des maux de Sémolosse
- Calendrier
- fix du ré-affichage de l'horloge qui ne marchait pas pour les joueurs
- l'horloge ne se ferme plus sur Escape
- amélioration d'affichage
- couleurs jour/nuit plus marquées
- Divers
- correction de l'affichage de quantités diminuées d'herbes dans les contenants ouvert
- ajout d'un bouton pour diminuer les quantités dans l'équipement (si quantité > 1)
- ajout de la signature de l'acteur sur les blessures qu'il a causées
- Magie
- correction des bonus de cases pour les sorts en Fleuve
## v10.7.5 - La montre-gousset de Sémolosse
- Amélioration de la fenêtre calendrier
* plus compacte
* horloge analogique (optionnelle)
* minimizable (juste la barre de titre)
* normalement compatible pop-out
## v10.7.4 - Les ligatures de Sémolosse
- Corrections diverses
- Correction des boutons pour déclencher un sort en réserve avec réserve en sécurité ou réserve extensible
- le lien pour les jets de vie suite à une blessure critique est remplacé par un bouton
- déplacement des tâches et boutons de chirurgie dans l'onglet savoirs et tâches
- correction de l'affichage des bonus de cases des sorts
- corrections des queues non-refoulables dans le compendium
## v10.7.3 - Les tisanes de Sémolosse
- Soins
- on peut de nouveau boire une potion de soins enchantée
- les potions non enchantées donnent de nouveau un bonus au prochain jet de récupération
- Une fois les soins complets faits, le bonus aux soins complets fournis par les premiers soins est masqué
- Horloge
- A l'heure de Couronne pile, les aiguilles des heures et des minutes pointent sur couronne (comme une montre) au lieu d'avoir l'aiguille des heures 15° à gauche
## v10.7.2 - les maux de dents de Sémolosse
- correction des récupérations de blessures
- la fin de château dormant se passe normalement
## v10.7.1 - L'os de Sémolosse
- Fix rapide sur les jets de carac qui n'étaient plus possibles
## v10.7.0 - L'os de Sémolosse
- gestion des blessures en items
- soins du token ciblé par menu contextuel (comme le combat)
- automatisation des soins et de l'affichage de l'avancement des soins
- support des changements d'opérants
---
# v10.6 - Les recherches de Pralinor le Goûteux
## v10.6.25 - Fix sur l'astrologie
## v10.6.22 - le nuage de lait dans le thé de Pralinor
- Amélioration de l'affichage de l'horloge
- Fix: affichage des points de guérison dans les potions
## v10.6.21 - La théière de Pralinor
- Astrologie
- le thème astral est directement dans la fenêtre d'astrologie
- la roue des heures sert d'horloge
- sélectionner un personnage ajuste le thème astral pour son heure de naissance
- sélectionner le nombre astral d'un jour ajuste le thème astral
- Fix: les PNJs peuvent de nouveau dormir
## v10.6.20 - Les Oracles de Pralinor: vous mangerez à Couronne
- Ajout de la fenêtre pour effectuer un thème astral
## v10.6.19 - La cerise de Pralinor
- les joueurs peuvent chercher dans les commerces avec un droit limité/observateur
- simplifications des fins de tours et nombre d'utilisations
- ajout du _Haubert d'Oniros_ dans le compendium de sorts
## v10.6.17 - Les désordres de Pralinor
- le contenu des casseroles et autres contenants est maintenant trié dans l'ordre alphabétique
- les objets dupliqués du compendium d'équipement sont de nouveaux uniques
## v0.6.16 - Le pardon de Pralinor
- Ajout d'un commerce _Liste d'équipement_ dans les archétypes de PNJs
- Séparations d'équipements groupés et corrections de quelques objets & herbes
- On peut éditer les armes stockées dans un commerce
## v10.6.15 - les digestifs de Pralinor
- amélioration des messages de sommeil (nombre d'heure dormies, uniquement les
récupérations de rêve en dessous du seuil, affichage de la récupération d'endurance
qui avait disparu, meilleur message sur le jet de moral)
- les insomnies ne durent bien que 12h draconique à partir du prochain
Chateau Dormant (elles pouvaient durer 3 nuits suite à une erreur).
- la recherche dans l'équipement affiche correctement les conteneurs dans lesquels les
objets trouvés sont rangés
## v10.6.14 - la digestion de Pralinor
- Chateau dormant
- la situation du jet de moral peut être choisie lorsque l'on dort
- les queues de dragon "insomnie" empêchent de dormir, et de rêver
- ajout d'une option pour meilleure gestion de Chateau Dormant par le MJ
- avec cette option, à la fin Chateau Dormant, une fenêtre permet au gardien de
positionner pour chaque joueur:
- le stress de la journée
- les heures de sommeil
- la situation du jet de moral (neutre/heureux/malheureux)
- l'affichage des heures Chateau Dormant et Poisson Acrobate est correct
- le jet de moral en situation neutre fait maintenant retourner le moral vers 0, et
n'affecte plus un moral à 0.
## v10.6.13 - la cave de Pralinor
- on peut maintenant chercher dans l'inventaire des commerces
- l'inventaire est correctement affiché en entier après suppression de la recherche
- le message de chateau dormant reflète correctement un jet de moral neutre qui passe le moral de 0 à +1
## v10.6.12 - l'index de Pralinor
- On peut désormais chercher dans l'inventaire comme dans les compétences
## v10.6.11 - l'empoisonnement de Pralinor
- La récupération est bloquée par les maladies. Pas de récupération de vie ou de blessures possibles sous l'effet d'un poison ou d'une maladie
- ajout d'un "poison" pour bloquer la récupération sous Griffe Morbide de Thanatos.
Ajout du lien vers l'objet du compendium dans la description MJ,, qui pourra donc
ajouter ce "poison" à la victime pour empêcher ses guérisons de vie ou blessure.
## v10.6.10
- Correction de l'édition des description
- Amélioration des descriptions d'alchimie:
- difficulté calculée automatiquement
- Température pour les couleurs
- La sustentation n'est plus concaténée dans certains cas (ce qui donnait 2+2=22)
## v10.6.8 : les bon mots de Pralinor
- Dans la fenêtre de _recherche et tirages_, possibilité de chercher sur le nom des objets en plus des autres critères
## v10.6.7 : les grumelés de Pralinor
- les objets peuvent être utilisés depuis la fenêtre d'un conteneur
- dans les fenêtres de contenants, le contenu est correctement indenté
- la présentation du contenu d'un sac est améliorée
- le bouton Nouvel Objet n'est affiché que si on est propriétaire de l'acteur
- la fenêtre de vente permet de nouveau de choisir les quantités à vendre
## v10.6.6
- Corrections d'armes rudimentaires
- Inversion: Taille puis poids
- Suppression d'une ligne de caractéristique vide (causée par la beauté)
- Les messages liés aux compétences troncs deviennent des notifications
## v10.6.5
- Le +dom est de nouveau affiché
- L'édition de caractéristiques des créatures fonctionne de nouveau
## v10.6.4 - La sénilité de Pralinor
- Fenêtre _Recherches et tirages_
- les résultats de recherches sur plusieurs compendiums sont triés
- lors de recherches avec un ou des milieux sélectionnés:
- le filtre sur la rareté utilise la rareté dans ces milieux
- les tirages se basent sur la fréquence la plus élevées dans ces milieux
- les filtres par utilisation prennent les potions en compte
- les remèdes ont une catégorie de potion 'Remède' (et correspondent à une utilisation médicale)
- ajout d'un filtre d'utilisation 'cuisine'
# Divers
- fix du cas où la transformation de 0 points de stress était concaténé, (passage de 29 à 290 avec 0 points transformés)
- suppression du compendium de taches courantes, désormais inutile
## v10.6.3 - le baba-brandevin de Pralinor
- les tâches de Soins sont maintenant déplacées à côté des blessures
- on peut créer les tâches de soins directement avec un bouton par gravité.
- le round n'est plus bloqué si un acteur est sonné
- un rare cas d'initiative négative pouvait empêcher de faire une initiative (à cause de l'état général)
- dans une circonstance inconnue, une rencontre pouvait disparaître lors de la maîtrise. Ajout d'un message pour essayer d'obtenir des détails sur ce cas, et ajout d'une sécurité pour retrouver la rencontre (qui est conservée par la fenêtre de choix d'action).
- les objets temporels (queues, souffles, poisons, maladies...) créés avant la gestion temporelle ne pouvaient pas être édités.
- les particulières sur les jets de résistance de rêve actuel ne rapportent qu'un point d'expérience (p191)
- pour lutter contre l'alcoolisme, les jets d'éthylisme sont considérés comme des jets de résistance, et n'apportent qu'un point d'expérience.
## v10.6.2 - Le méli-mélo de Pralinor
- Fenêtre _Recherches et tirages_
- support de la recherche dans les compendiums choisis
- suppression des commandes `/table milieu` et `/tirer milieu` (remplacées par la fenêtre de recherche)
- ajout de fréquences à tous les équipements
## v10.6.1 - Les recherches de Pralinor
- Fenêtre _Recherches et tirages_
- Amélioration des filtres de cuisine/utilisation
- Ajout de catégories pour les poisons, urtiquants, ...
- Bouton "Effacer les filtres" plus clair
- Drag&drop depuis la recherche
- Reprise du compendium
- pour les plantes vénéneuses
- pour les plantes venimeuses
- ajout de sust pour les champignons et autres plantes comestibles
- Affichage de l'image du token pour les commerces non liés
- Les pièces d'or sont appelées 'Dragon'
## v10.6.0 - Les recherches de Pralinor le Goûteux
- Fenêtre _Recherches et tirages_
- ajout de la fenêtre _Recherches et tirages_ avec filtres paramétrables
- ouverture de la fenêtre: commande `/tirage` ou macro disponible dans les macros du système
- support des équipements, faune & flore (depuis les compendiums configurés par défaut)
- nombreux choix à activer
- possibilité de montrer les objets correspondant à la sélection
- possibilité de faire un tirage parmi ces objets (en prenant en compte la fréquence)
- Plantes & pèche
- séparation des ingrédients et plantes comestibles
- retour des poissons dans les compendiums
- ajout d'un lien depuis les plantes toxiques/dangereuses vers la maladie/poison correspondante
- On peut de nouveau ouvrir les conteneurs dans une fenêtre séparée
- Les jets de volontés d'éthylisme calculent correctement la difficulté liée au moral (ie: 0 au lieu de -22)
- si le journal de chronologie est supprimée, on peut en choisir un autre
- la taille du calendrier est ajustée pour éviter une présentation bancale quand le nom du mois est court

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -7,48 +7,47 @@
"TypeVehicule": "Véhicule" "TypeVehicule": "Véhicule"
}, },
"ITEM": { "ITEM": {
"TypeArme": "Arme", "TypeObjet": "Objet",
"TypeArmure": "Armure", "TypeGemme": "Gemme",
"TypeBlessure": "Blessure",
"TypeCasetmr": "TMR spéciale",
"TypeChant": "Chant",
"TypeCompetence": "Compétence", "TypeCompetence": "Compétence",
"TypeCompetencecreature": "Compétence de créature", "TypeCompetencecreature": "Compétence de créature",
"TypeConteneur": "Conteneur",
"TypeDanse": "Danse",
"TypeExtraitpoetique": "Extrait poetique",
"TypeFaune": "Faune",
"TypeGemme": "Gemme",
"TypeHerbe": "Herbe",
"TypeIngredient": "Ingrédient",
"TypeJeu": "Jeu",
"TypeLivre": "Livre",
"TypeMaladie": "Maladie", "TypeMaladie": "Maladie",
"TypeMeditation": "Méditation",
"TypeMonnaie": "Monnaie",
"TypeMunition": "Munition",
"TypeMusique": "Musique",
"TypeNombreastral": "Nombre astral",
"TypeNourritureboisson": "Nourriture & boisson",
"TypeObjet": "Objet",
"TypeOeuvre": "Oeuvre",
"TypeOmbre": "Ombre de Thanatos",
"TypePlante": "Plante",
"TypePoison": "Poison", "TypePoison": "Poison",
"TypePossession": "Possession", "TypeNombreastral": "Nombre astral",
"TypeTarot": "Carte de tarot",
"TypeCasetmr": "TMR spéciale",
"TypeRencontre": "Rencontre TMR",
"TypeMunition": "Munition",
"TypeMonnaie": "Monnaie",
"TypeHerbe": "Herbe",
"TypePlante": "Plante",
"TypeIngredient": "Ingrédient",
"TypeFaune": "Faune",
"TypeLivre": "Livre",
"TypePotion": "Potion", "TypePotion": "Potion",
"TypeQueue": "Queue de Dragon", "TypeArme": "Arme",
"TypeArmure": "Armure",
"TypeConteneur": "Conteneur",
"TypeNourritureboisson": "Nourriture & boisson",
"TypeService": "Service",
"TypeChant": "Chant",
"TypeDanse": "Danse",
"TypeMusique": "Musique",
"TypeOeuvre": "Oeuvre",
"TypeTache": "Tâche",
"TypeJeu": "Jeu",
"TypeRecettealchimique": "Recette alchimique", "TypeRecettealchimique": "Recette alchimique",
"TypeRecettecuisine": "Recette de cuisine", "TypeRecettecuisine": "Recette de cuisine",
"TypeRencontre": "Rencontre TMR",
"TypeService": "Service",
"TypeSignedraconique": "Signe draconique",
"TypeSort": "Sort", "TypeSort": "Sort",
"TypeSortreserve": "Sort en réserve", "TypeMeditation": "Méditation",
"TypeSignedraconique": "Signe draconique",
"TypeQueue": "Queue de Dragon",
"TypeOmbre": "Ombre de Thanatos",
"TypeSouffle": "Souffle de Dragon", "TypeSouffle": "Souffle de Dragon",
"TypeTache": "Tâche", "TypeTete": "Tête de Dragon",
"TypeTarot": "Carte de tarot", "TypePossession": "Possession",
"TypeTete": "Tête de Dragon" "TypeSortreserve": "Sort en réserve",
"TypeExtraitpoetique": "Extrait poetique"
}, },
"EFFECT": { "EFFECT": {
"StatusStunned": "Sonné", "StatusStunned": "Sonné",

View File

@ -1,6 +1,4 @@
import { RdDActorSheet } from "./actor-sheet.js"; import { RdDActorSheet } from "./actor-sheet.js";
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
import { RdDUtility } from "./rdd-utility.js";
export class RdDActorEntiteSheet extends RdDActorSheet { export class RdDActorEntiteSheet extends RdDActorSheet {
@ -15,12 +13,6 @@ export class RdDActorEntiteSheet extends RdDActorSheet {
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }] dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }]
}); });
} }
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 */ /** @override */
@ -43,23 +35,6 @@ export class RdDActorEntiteSheet extends RdDActorSheet {
let compName = event.currentTarget.attributes.compname.value; let compName = event.currentTarget.attributes.compname.value;
this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.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 });
} }
} }

View File

@ -13,8 +13,6 @@ 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 { RdDBaseActorSheet } from "./actor/base-actor-sheet.js";
import { RdDItem } from "./item.js"; import { RdDItem } from "./item.js";
import { RdDItemBlessure } from "./item/blessure.js";
import { RdDEmpoignade } from "./rdd-empoignade.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
/** /**
@ -68,9 +66,9 @@ export class RdDActorSheet extends RdDBaseActorSheet {
formData.calc.fatigue = RdDUtility.calculFatigueHtml(formData.system.sante.fatigue.value, formData.system.sante.endurance.max); formData.calc.fatigue = RdDUtility.calculFatigueHtml(formData.system.sante.fatigue.value, formData.system.sante.endurance.max);
formData.competences.forEach(item => { formData.competences.forEach(item => {
item.system.isHidden = this.options.recherche item.system.isVisible = this.options.recherche
? !item.isNomLike(this.options.recherche.text) ? RdDItemCompetence.nomContientTexte(item, this.options.recherche.text)
: (this.options.showCompNiveauBase && RdDItemCompetence.isNiveauBase(item)); : (!this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(item));
RdDItemCompetence.levelUp(item, formData.system.compteurs.experience.value); RdDItemCompetence.levelUp(item, formData.system.compteurs.experience.value);
}); });
@ -84,7 +82,6 @@ export class RdDActorSheet extends RdDBaseActorSheet {
RdDItemArme.ajoutCorpsACorps(formData.combat, formData.competences, formData.system.carac); RdDItemArme.ajoutCorpsACorps(formData.combat, formData.competences, formData.system.carac);
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;
@ -119,21 +116,14 @@ export class RdDActorSheet extends RdDBaseActorSheet {
// 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 => { this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor));
const item = RdDSheetUtility.getItem(event, this.actor);
item?.actionPrincipale(this.actor, async () => this.render())
});
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 => {
@ -146,13 +136,6 @@ 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("input.derivee-value[name='system.compteurs.stress.value']").change(async event => {
this.actor.updateCompteurValue("stress", parseInt(event.target.value));
});
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('.encaisser-direct').click(async event => { this.html.find('.encaisser-direct').click(async event => {
this.actor.encaisser(); this.actor.encaisser();
}) })
@ -168,31 +151,33 @@ export class RdDActorSheet extends RdDBaseActorSheet {
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 => RdDItemBlessure.createTacheSoinBlessure(this.actor, 2));
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-blessure-legere').click(async event => RdDItemBlessure.createBlessure(this.actor, 2));
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-une-oeuvre').click(async event => { this.html.find('.creer-une-oeuvre').click(async event => {
this.selectTypeOeuvreToCreate(); this.selectTypeOeuvreToCreate();
}); });
this.html.find('.blessure-premierssoins-done').change(async event => { // Blessure control
const blessure = this.getBlessure(event); this.html.find('.blessure-control').click(async event => {
await blessure?.setSoinsBlessure({ premierssoins: { done: event.currentTarget.checked } }); const tr = this.html.find(event.currentTarget).parents(".item");
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 => {
const blessure = this.getBlessure(event); // Blessure data
await blessure?.setSoinsBlessure({ soinscomplets: { done: event.currentTarget.checked } }) this.html.find('.blessure-soins').change(async event => {
}); const tr = this.html.find(event.currentTarget).parents(".item");
this.html.find('.blessure-premierssoins-bonus').change(async event => { let btype = tr.data('blessure-type');
const blessure = this.getBlessure(event); let index = tr.data('blessure-index');
await blessure?.setSoinsBlessure({ premierssoins: { bonus: Number(event.currentTarget.value) } }) let psoins = tr.find('.blessure-premiers_soins').val();
}); let pcomplets = tr.find('.blessure-soins_complets').val();
this.html.find('.blessure-soinscomplets-bonus').change(async event => { let jours = tr.find('.blessure-jours').val();
const blessure = this.getBlessure(event); let loc = tr.find('.blessure-localisation').val();
await blessure?.setSoinsBlessure({ soinscomplets: { bonus: Number(event.currentTarget.value) } }) let psdone = tr.find('.blessure-psdone:checked').val();
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
@ -264,14 +249,9 @@ export class RdDActorSheet extends RdDBaseActorSheet {
// Points de reve actuel // Points de reve actuel
this.html.find('.ptreve-actuel a').click(async event => { this.html.find('.ptreve-actuel a').click(async event => {
this.actor.rollCarac('reve-actuel', true); this.actor.rollCarac('reve-actuel');
}); });
// 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);
@ -365,6 +345,29 @@ export class RdDActorSheet extends RdDBaseActorSheet {
this.render(true); this.render(true);
}); });
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)
);
this.html.find('.vue-detaillee').click(async event => { this.html.find('.vue-detaillee').click(async event => {
this.options.vueDetaillee = !this.options.vueDetaillee; this.options.vueDetaillee = !this.options.vueDetaillee;
this.render(true); this.render(true);
@ -437,12 +440,6 @@ export class RdDActorSheet extends RdDBaseActorSheet {
}); });
} }
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);
} }
@ -456,9 +453,9 @@ export class RdDActorSheet extends RdDBaseActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async selectTypeOeuvreToCreate() { async selectTypeOeuvreToCreate() {
let types = RdDItem.getTypesOeuvres(); let typeObjets = 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 types) { for (let typeName of typeObjets) {
content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>` content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
} }
content += '</select>'; content += '</select>';
@ -481,6 +478,17 @@ export class RdDActorSheet extends RdDBaseActorSheet {
await this.actor.createItem('tache', 'Nouvelle tache'); await this.actor.createItem('tache', 'Nouvelle tache');
} }
_optionRecherche(target) {
if (!target.value?.length) {
return undefined;
}
return {
text: target.value,
start: target.selectionStart,
end: target.selectionEnd,
};
}
_getEventArmeCombat(event) { _getEventArmeCombat(event) {
const li = this.html.find(event.currentTarget)?.parents(".item"); const li = this.html.find(event.currentTarget)?.parents(".item");
let armeName = li.data("arme-name"); let armeName = li.data("arme-name");

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,7 @@ 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, TYPES } from "../item.js"; import { RdDItem } from "../item.js";
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
/** /**
@ -32,56 +31,52 @@ export class RdDBaseActorSheet extends ActorSheet {
Monnaie.validerMonnaies(this.actor.itemTypes['monnaie']); Monnaie.validerMonnaies(this.actor.itemTypes['monnaie']);
this.actor.recompute(); this.actor.recompute();
const userRightLevel = game.user.isGM ? CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER : this.actor.getUserLevel(game.user)
const options = duplicate(this.options);
mergeObject(options, {
isGM: game.user.isGM,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
isLimited: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED,
isObserver: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER,
isOwner: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER,
owner: this.actor.isOwner,
});
let formData = { let formData = {
title: this.title, title: this.title,
id: this.actor.id, id: this.actor.id,
type: this.actor.type, type: this.actor.type,
img: this.actor.img, img: this.actor.img,
name: this.actor.name, name: this.actor.name,
system: this.actor.system, system: foundry.utils.deepClone(this.actor.system),
description: await TextEditor.enrichHTML(this.actor.system.description, { async: true }), description: await TextEditor.enrichHTML(this.actor.system.description, { async: true }),
notesmj: await TextEditor.enrichHTML(this.actor.system.notesmj, { async: true }), notesmj: await TextEditor.enrichHTML(this.actor.system.notesmj, { async: true }),
options: RdDSheetUtility.mergeDocumentRights(this.options, this.actor, this.isEditable) options: options,
} }
RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes); RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
formData.calc = { formData.calc = {
fortune: Monnaie.toSolsDeniers(this.actor.getFortune()), fortune: this.toSolsDeniers(this.actor.getFortune()),
prixTotalEquipement: this.actor.computePrixTotalEquipement(), prixTotalEquipement: this.actor.computePrixTotalEquipement(),
encTotal: await this.actor.computeEncTotal(), encTotal: await this.actor.computeEncTotal(),
} }
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.inventaires); this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
this._appliquerRechercheObjets(formData.conteneurs, formData.inventaires);
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs); formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
formData.competences.filter(it => it.type == TYPES.competencecreature)
.forEach(it => it.isdommages = RdDItemCompetenceCreature.isDommages(it))
return formData; return formData;
} }
_appliquerRechercheObjets(conteneurs, inventaires) { toSolsDeniers(fortune) {
if (this.options.recherche?.text) { return {
const recherche = this.options.recherche; sols: Math.floor(fortune),
const allVisible = inventaires.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id); deniers: Math.round(100 * (fortune - Math.floor(fortune)))
let addVisible = conteneurs.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id) };
do {
allVisible.push(...addVisible)
const parentsIds = conteneurs.filter(it => it.system.contenu.find(id => allVisible.includes(id))).map(it => it.id)
addVisible = parentsIds.filter(id => !allVisible.includes(id))
}
while (addVisible.length > 0)
inventaires.forEach(it => it.system.isHidden = !allVisible.includes(it.id))
conteneurs.forEach(it => it.system.isHidden = !allVisible.includes(it.id))
}
else {
inventaires.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']);
@ -121,10 +116,9 @@ 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.monnaies = Misc.arrayOrEmpty(itemTypes['monnaie']).sort(Monnaie.triValeurEntiere()); formData.monnaie = Misc.arrayOrEmpty(itemTypes['monnaie']).sort(Monnaie.triValeurEntiere());
formData.objets = Misc.arrayOrEmpty(itemTypes['objet'])
formData.inventaires = RdDItem.getItemTypesInventaire('all') formData.objets = 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));
@ -142,13 +136,7 @@ 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;
@ -156,8 +144,6 @@ 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)));
@ -167,28 +153,12 @@ 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);
_rechercherKeyup(event) { });
const currentTarget = event.currentTarget; this.html.find('.monnaie-moins').click(async event => {
const nouvelleRecherche = this._optionRecherche(currentTarget); this.actor.monnaieIncDec(this.getItemId(event), -1);
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);
}
}
_rechercheSelectArea(field) {
if (this.options.recherche) {
field.focus();
field.setSelectionRange(this.options.recherche.start, this.options.recherche.end);
}
} }
getItemId(event) { getItemId(event) {
@ -199,16 +169,6 @@ export class RdDBaseActorSheet extends ActorSheet {
return RdDSheetUtility.getItem(event, this.actor); return RdDSheetUtility.getItem(event, this.actor);
} }
_optionRecherche(target) {
if (!target.value?.length) {
return undefined;
}
return {
text: target.value,
start: target.selectionStart,
end: target.selectionEnd,
};
}
/* -------------------------------------------- */ /* -------------------------------------------- */
_getHeaderButtons() { _getHeaderButtons() {
let buttons = super._getHeaderButtons(); let buttons = super._getHeaderButtons();
@ -234,9 +194,9 @@ export class RdDBaseActorSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async selectObjetTypeToCreate() { async selectObjetTypeToCreate() {
let types = this.getTypesInventaire().sort(Misc.ascending(type => Misc.typeName('Item', type))); let typeObjets = 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 types) { for (let typeName of typeObjets) {
content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>` content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
} }
content += '</select>'; content += '</select>';

View File

@ -3,10 +3,8 @@ import { SYSTEM_SOCKET_ID } from "../constants.js";
import { Monnaie } from "../item-monnaie.js"; import { Monnaie } from "../item-monnaie.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 {
@ -22,16 +20,14 @@ 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":
game.user.character.resetNombresAstraux(); console.log("RESET ASTRAL", game.user.character);
game.system.rdd.calendrier.notifyChangeNombresAstraux(); game.user.character.resetNombreAstral();
return;
case "msg_refresh_nombre_astral":
Hooks.callAll(APP_ASTROLOGIE_REFRESH);
return; return;
} }
} }
@ -110,6 +106,7 @@ export class RdDBaseActor extends Actor {
isEntite() { return this.type == 'entite'; } isEntite() { return this.type == 'entite'; }
isPersonnage() { return this.type == 'personnage'; } isPersonnage() { return this.type == 'personnage'; }
isVehicule() { return this.type == 'vehicule'; } isVehicule() { return this.type == 'vehicule'; }
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)) {
@ -119,7 +116,7 @@ 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 (type ? this.itemTypes[type] : this.items)?.filter(filter); } filterItems(filter, type = undefined) { return this.listItems(type)?.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) });
@ -144,29 +141,17 @@ 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({
actorId: this.id,
method: 'creerObjetParMJ',
args: [object]
});
return;
}
await this.createEmbeddedDocuments('Item', [object])
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getFortune() { getFortune() {
return Monnaie.getFortune(this.itemTypes['monnaie']); return Monnaie.getFortune(this.itemTypes['monnaie']);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async itemQuantiteIncDec(id, value) { async monnaieIncDec(id, value) {
let item = this.getItem(id); let monnaie = this.getMonnaie(id);
if (item && item.isInventaire()) { if (monnaie) {
const quantite = Math.max(0, item.system.quantite + value); const quantite = Math.max(0, monnaie.system.quantite + value);
await this.updateEmbeddedDocuments('Item', [{ _id: item.id, 'system.quantite': quantite }]); await this.updateEmbeddedDocuments('Item', [{ _id: monnaie.id, 'system.quantite': quantite }]);
} }
} }
@ -256,16 +241,14 @@ 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 quantite = (achat.choix.nombreLots ?? 1) * (achat.vente.tailleLot); const vente = achat.vente;
const itemVendu = vendeur?.getItem(achat.vente.item._id) ?? game.items.get(achat.vente.item._id); const quantite = (achat.choix.nombreLots ?? 1) * (vente.tailleLot);
if (!itemVendu) { const itemVendu = vendeur?.getItem(vente.item._id);
ChatUtility.notifyUser(achat.userId, 'warn', vendeur ? `Le vendeur n'a pas plus de ${achat.vente.item.name} !`: `Impossible de retrouver: ${achat.vente.item.name} !`); if (!this.verifierQuantite(vendeur, itemVendu, quantite)) {
return;
}
if (vendeur && !this.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
} }
@ -276,13 +259,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(itemVendu, quantite); const createdItemId = await acheteur.creerQuantiteItem(vente.item, quantite);
await acheteur.consommerNourritureAchetee(achat, achat.vente, createdItemId); await acheteur.consommerNourritureAchetee(achat, vente, createdItemId);
} }
if (cout > 0) { if (cout > 0) {
RdDAudio.PlayContextAudio("argent"); RdDAudio.PlayContextAudio("argent");
} }
const chatAchatItem = duplicate(achat.vente); const chatAchatItem = duplicate(vente);
chatAchatItem.quantiteTotal = quantite; chatAchatItem.quantiteTotal = quantite;
ChatMessage.create({ ChatMessage.create({
user: achat.userId, user: achat.userId,
@ -291,16 +274,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 (!achat.vente.quantiteIllimite) { if (!vente.quantiteIllimite) {
if (achat.vente.quantiteNbLots <= achat.choix.nombreLots) { if (vente.quantiteNbLots <= achat.choix.nombreLots) {
ChatUtility.removeChatMessageId(achat.chatMessageIdVente); ChatUtility.removeChatMessageId(achat.chatMessageIdVente);
} }
else if (achat.chatMessageIdVente) { else if (achat.chatMessageIdVente) {
achat.vente.properties = itemVendu.getProprietes(); vente["properties"] = itemVendu.getProprietes();
achat.vente.quantiteNbLots -= achat.choix.nombreLots; vente.quantiteNbLots -= achat.choix.nombreLots;
achat.vente.jsondata = JSON.stringify(achat.vente.item); vente.jsondata = JSON.stringify(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', achat.vente) }); messageVente.update({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente) });
messageVente.render(true); messageVente.render(true);
} }
} }
@ -317,9 +300,9 @@ export class RdDBaseActor extends Actor {
return this.getFortune() >= cout; return this.getFortune() >= cout;
} }
verifierQuantite(item, quantiteDemande) { verifierQuantite(vendeur, item, quantiteTotal) {
const disponible = item?.getQuantite(); const disponible = vendeur?.getQuantiteDisponible(item);
return disponible == undefined || disponible >= quantiteDemande; return disponible == undefined || disponible >= quantiteTotal;
} }
async consommerNourritureAchetee(achat, vente, createdItemId) { async consommerNourritureAchetee(achat, vente, createdItemId) {

View File

@ -22,7 +22,7 @@ export class RdDCommerce extends RdDBaseActor {
} }
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) {

View File

@ -1,39 +0,0 @@
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;
}
}

View File

@ -78,7 +78,11 @@ export class ChatUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async createChatWithRollMode(name, chatOptions) { static async createChatWithRollMode(name, chatOptions) {
let rollMode = game.settings.get("core", "rollMode") return await ChatUtility.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions);
}
/* -------------------------------------------- */
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) {

View File

@ -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 "./time/rdd-timestamp.js"; import { RdDTimestamp } from "./rdd-timestamp.js";
const LATEST_USED_JOURNAL_ID = "chronologie-dernier-journal"; const LATEST_USED_JOURNAL_ID = "chronologie-dernier-journal";
@ -25,13 +25,23 @@ 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: game.system.rdd.calendrier.dateReel() dateReel: DialogChronologie.getCurrentDateTime()
}; };
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"],
@ -114,7 +124,7 @@ export class DialogChronologie extends Dialog {
heure: RdDTimestamp.definition(this.html.find("form.rdddialogchrono :input[name='chronologie.heure']").val()), heure: RdDTimestamp.definition(this.html.find("form.rdddialogchrono :input[name='chronologie.heure']").val()),
minute: this.html.find("form.rdddialogchrono :input[name='chronologie.minute']").val(), minute: this.html.find("form.rdddialogchrono :input[name='chronologie.minute']").val(),
}, },
dateReel: this.html.find("form.rdddialogchrono :input[name='dateReel']").val() dateReel: this.html.find("form.rdddialogchrono :input[name='dateReel']").val().replace('T', ' ')
} }
} }

View File

@ -1,6 +1,6 @@
import { ChatUtility } from "./chat-utility.js"; import { ChatUtility } from "./chat-utility.js";
import { HtmlUtility } from "./html-utility.js"; import { HtmlUtility } from "./html-utility.js";
import { RdDItemSigneDraconique } from "./item/signedraconique.js"; import { RdDItemSigneDraconique } from "./item/item-signedraconique.js";
import { TMRUtility } from "./tmr-utility.js"; import { TMRUtility } from "./tmr-utility.js";
export class DialogCreateSigneDraconique extends Dialog { export class DialogCreateSigneDraconique extends Dialog {

View File

@ -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, onActionItem) { static async create(actor, item, dialogConfig) {
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,10 +13,12 @@ export class DialogFabriquerPotion extends Dialog {
} }
let potionData = DialogFabriquerPotion.prepareData(actor, item); let potionData = DialogFabriquerPotion.prepareData(actor, item);
const html = await renderTemplate( 'systems/foundryvtt-reve-de-dragon/templates/dialog-fabriquer-potion-base.html', potionData); const html = await renderTemplate(dialogConfig.html, potionData);
let options = { classes: ["dialogfabriquerpotion"], width: 600, height: 160, 'z-index': 99999 }; let options = { classes: ["dialogfabriquerpotion"], width: 600, height: 160, 'z-index': 99999 };
new DialogFabriquerPotion(actor, potionData, onActionItem, html, options).render(true); mergeObject(options, dialogConfig.options ?? {}, { overwrite: true })
new DialogFabriquerPotion(actor, potionData, html, options).render(true);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -32,14 +34,14 @@ export class DialogFabriquerPotion extends Dialog {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
constructor(actor, potionData, onActionItem, html, options) { constructor(actor, potionData, 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() label: potionData.buttonName, callback: it => this.onFabriquer(html)
} }
} }
}; };
@ -48,7 +50,6 @@ export class DialogFabriquerPotion extends Dialog {
this.actor = actor; this.actor = actor;
this.potionData = potionData; this.potionData = potionData;
this.onActionItem = onActionItem;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -63,11 +64,10 @@ export class DialogFabriquerPotion extends Dialog {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async onFabriquer() { async onFabriquer(html) {
await this.html.find("[name='nbBrins']").change(); await this.html.find("[name='nbBrins']").change();
await this.actor.fabriquerPotion(this.potionData); this.actor.fabriquerPotion(this.potionData);
this.close(); this.close();
await this.onActionItem()
} }
static nombreBrinsMinimum(herbeData) { static nombreBrinsMinimum(herbeData) {

View File

@ -18,7 +18,7 @@ export class DialogItemAchat extends Dialog {
} }
return { return {
item: JSON.parse(json), item: (json ? JSON.parse(json) : undefined),
vendeur, vendeur,
acheteur, acheteur,
nbLots: parseInt(chatButton.attributes['data-quantiteNbLots']?.value), nbLots: parseInt(chatButton.attributes['data-quantiteNbLots']?.value),
@ -34,6 +34,7 @@ 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,

View File

@ -8,7 +8,7 @@ export class DialogItemVente extends Dialog {
const venteData = { const venteData = {
item: item, item: item,
alias: item.actor?.name ?? game.user.name, alias: item.actor?.name ?? game.user.name,
vendeurId: item.actor?.id, vendeurId: item.actor?.id ,
prixOrigine: item.calculerPrixCommercant(), prixOrigine: item.calculerPrixCommercant(),
prixUnitaire: item.calculerPrixCommercant(), prixUnitaire: item.calculerPrixCommercant(),
prixLot: item.calculerPrixCommercant(), prixLot: item.calculerPrixCommercant(),
@ -40,62 +40,51 @@ export class DialogItemVente extends Dialog {
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
this.html = html; this.html = html;
this.setQuantiteIllimite(this.venteData.quantiteIllimite);
this.html.find(".tailleLot").change(event => this.setTailleLot(Number(event.currentTarget.value))); this.html.find(".tailleLot").change(event => this.setTailleLot(Number(event.currentTarget.value)));
this.html.find(".quantiteNbLots").change(event => this.setNbLots(Number(event.currentTarget.value))); this.html.find(".quantiteNbLots").change(event => this.setNbLots(Number(event.currentTarget.value)));
this.html.find(".quantiteIllimite").change(event => this.setQuantiteIllimite(event.currentTarget.checked)); this.html.find(".quantiteIllimite").change(event => this.setQuantiteIllimite(event.currentTarget.checked));
this.html.find(".prixLot").change(event => this.setPrixLot(Number(event.currentTarget.value))); this.html.find(".prixLot").change(event => this.setPrixLot(Number(event.currentTarget.value)));
this.setQuantiteIllimite(this.venteData.quantiteIllimite);
} }
async onProposer(it) { async onProposer(it) {
this.updateVente(this.getChoixVente()); await this.html.find(".tailleLot").change();
await this.html.find(".quantiteNbLots").change();
await this.html.find(".quantiteIllimite").change();
await this.html.find(".prixLot").change();
this.callback(this.venteData); this.callback(this.venteData);
} }
updateVente(update) {
mergeObject(this.venteData, update);
}
getChoixVente() {
return {
quantiteNbLots: Number(this.html.find(".quantiteNbLots").val()),
tailleLot: Number(this.html.find(".tailleLot").val()),
quantiteIllimite: this.html.find(".quantiteIllimite").is(':checked'),
prixLot: Number(this.html.find(".prixLot").val())
};
}
/* -------------------------------------------- */ /* -------------------------------------------- */
setPrixLot(prixLot) { setPrixLot(prixLot) {
this.venteData.prixLot = prixLot; this.venteData.prixLot = prixLot;
} }
setTailleLot(tailleLot) { setTailleLot(tailleLot) {
const maxLots = Math.floor(this.venteData.quantiteMax / tailleLot); // recalculer le prix du lot
this.updateVente({ if (tailleLot != this.venteData.tailleLot) {
tailleLot, this.venteData.prixLot = (tailleLot * this.venteData.prixOrigine).toFixed(2);
quantiteNbLots: Math.min(maxLots, this.venteData.quantiteNbLots),
quantiteMaxLots: maxLots,
prixLot: (tailleLot * this.venteData.prixOrigine).toFixed(2)
});
this.html.find(".prixLot").val(this.venteData.prixLot); this.html.find(".prixLot").val(this.venteData.prixLot);
}
this.venteData.tailleLot = tailleLot;
// recalculer le nombre de lots max
this.venteData.quantiteMaxLots = Math.floor(this.venteData.quantiteMax / tailleLot);
this.venteData.quantiteNbLots = Math.min(this.venteData.quantiteMaxLots, this.venteData.quantiteNbLots);
this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots); this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots);
this.html.find(".quantiteNbLots").attr("max", this.venteData.quantiteMaxLots) this.html.find(".quantiteNbLots").attr("max", this.venteData.quantiteMaxLots)
} }
setNbLots(nbLots) { setNbLots(nbLots) {
this.updateVente({ if (this.venteData.isOwned) {
quantiteNbLots: this.venteData.isOwned ? Math.max(0, Math.min(nbLots, this.venteData.quantiteMaxLots)) : nbLots nbLots = Math.max(0, Math.min(nbLots, this.venteData.quantiteMaxLots));
}) }
this.venteData.quantiteNbLots = nbLots;
this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots); this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots);
} }
setQuantiteIllimite(checked) { setQuantiteIllimite(checked) {
this.updateVente({ quantiteIllimite: checked }) this.venteData.quantiteIllimite = checked;
this.html.find(".label-quantiteIllimite").text(this.venteData.quantiteIllimite ? "Illimités" : "disponibles"); this.html.find(".label-quantiteIllimite").text(this.venteData.quantiteIllimite ? "Illimités" : "disponibles");
HtmlUtility.showControlWhen(this.html.find(".quantiteNbLots"), !this.venteData.quantiteIllimite) HtmlUtility.showControlWhen(this.html.find(".quantiteNbLots"), !this.venteData.quantiteIllimite)
} }

57
module/dialog-repos.js Normal file
View File

@ -0,0 +1,57 @@
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;
}
}
}
}

View File

@ -15,7 +15,7 @@ export class DialogStress extends Dialog {
) )
}; };
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/sommeil/dialog-stress.html", dialogData); const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/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(async actor => await actor.distribuerStress(compteur, stress, motif)); .forEach(actor => actor.distribuerStress(compteur, stress, motif));
} }
async onSelectActor(event) { async onSelectActor(event) {

View File

@ -7,7 +7,7 @@ import { RdDUtility } from "./rdd-utility.js";
*/ */
export class DialogValidationEncaissement extends Dialog { export class DialogValidationEncaissement extends Dialog {
static async validerEncaissement(actor, rollData, armure, show, attackerId, onEncaisser) { static async validerEncaissement(actor, rollData, armure, show, 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,
@ -15,15 +15,15 @@ export class DialogValidationEncaissement extends Dialog {
encaissement: encaissement, encaissement: encaissement,
show: show show: show
}); });
const dialog = new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, show, attackerId, onEncaisser); const dialog = new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, show, onEncaisser);
dialog.render(true); dialog.render(true);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
constructor(html, actor, rollData, armure, encaissement, show, attackerId, onEncaisser) { constructor(html, actor, rollData, armure, encaissement, show, onEncaisser) {
// Common conf // Common conf
let buttons = { let buttons = {
"valider": { label: "Valider", callback: html => this.onValider() }, "valider": { label: "Valider", callback: html => this.validerEncaissement() },
"annuler": { label: "Annuler", callback: html => { } }, "annuler": { label: "Annuler", callback: html => { } },
}; };
@ -48,7 +48,6 @@ export class DialogValidationEncaissement extends Dialog {
this.armure = armure; this.armure = armure;
this.encaissement = encaissement; this.encaissement = encaissement;
this.show = show; this.show = show;
this.attackerId = attackerId;
this.onEncaisser = onEncaisser; this.onEncaisser = onEncaisser;
this.forceDiceResult = {total: encaissement.roll.result }; this.forceDiceResult = {total: encaissement.roll.result };
} }
@ -65,8 +64,8 @@ export class DialogValidationEncaissement extends Dialog {
}); });
} }
async onValider() { async validerEncaissement() {
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.attackerId) this.onEncaisser(this.encaissement, this.show)
} }
} }

View File

@ -1,8 +1,7 @@
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 { TMRUtility } from "./tmr-utility.js";
import { TMRUtility } from "../tmr-utility.js";
export class EffetsRencontre { export class EffetsRencontre {
@ -54,10 +53,9 @@ export class EffetsRencontre {
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 fromXpSort = Number(competence.system.xp_sort); const xpSort = Misc.toInt(competence.system.xp_sort) + context.rencontre.system.force;
const toXpSort = fromXpSort + context.rencontre.system.force; await this.updateEmbeddedDocuments("Item", [{ _id: compData._id, 'system.xp_sort': xpSort }]);
await this.updateEmbeddedDocuments("Item", [{ _id: compData._id, 'system.xp_sort': toXpSort }]); await this.updateExperienceLog("XP Sort", xpSort, `Rencontre d'un ${context.rencontre.name} en TMR`);
await ExperienceLog.add(this, XP_TOPIC.XPSORT, fromXpSort, toXpSort, `${competence.name} - ${context.rencontre.name} en TMR`);
} }
} }

View File

@ -1,78 +1,203 @@
import { SYSTEM_RDD } from "./constants.js"; import { 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 { CompendiumTableHelpers, CompendiumTable, SystemCompendiums } from "./settings/system-compendiums.js"; import { CompendiumTableHelpers, CompendiumTable } from "./settings/system-compendiums.js";
import { RdDRaretes } from "./tirage/raretes.js";
const SETTINGS_LISTE_MILIEUX = "liste-milieux";
const COMPENDIUMS_RECHERCHE = 'compendiums-recherche'; const MILIEUX = [
"Collines",
"Cours d'eau",
"Déserts",
"Forêts",
"Marais",
"Maritimes",
"Montagnes",
"Plaines",
"Sous-sols"
]
const ITEM_ENVIRONNEMENT_TYPES = [
'herbe', 'plante', 'ingredient', 'faune'
]
export class Environnement { export class Environnement {
static init() {
game.settings.register(SYSTEM_RDD, COMPENDIUMS_RECHERCHE, {
name: COMPENDIUMS_RECHERCHE,
default: [
SystemCompendiums.getCompendium('faune-flore-mineraux'),
SystemCompendiums.getCompendium('meditations-et-ecrits'),
SystemCompendiums.getCompendium('equipement')
],
scope: "world",
config: false,
type: Object
});
static typesEnvironnement() {
return ITEM_ENVIRONNEMENT_TYPES
}
static init() {
game.settings.register(SYSTEM_RDD, SETTINGS_LISTE_MILIEUX, {
name: "Liste des milieux proposés",
hint: "Liste des milieux proposés pour la faune&flore, séparés par des virgules",
scope: "world",
config: true,
default: MILIEUX.reduce(Misc.joining(',')),
type: String
});
game.system.rdd.environnement = new Environnement(); game.system.rdd.environnement = new Environnement();
Hooks.once('ready', () => game.system.rdd.environnement.onReady());
} }
constructor() { constructor() {
this.compendiums = []; this.table = new CompendiumTable('faune-flore-mineraux', 'Item', ITEM_ENVIRONNEMENT_TYPES)
this.compendiumTables = [];
this.mapMilieux = {}
}
async onReady() {
await this.$prepareCompendiums()
} }
async milieux() { async milieux() {
return Object.values(this.mapMilieux); return Object.values(await this.mapMilieux());
} }
async saveCompendiums(compendiumIds) { async mapMilieux() {
game.settings.set(SYSTEM_RDD, COMPENDIUMS_RECHERCHE, compendiumIds); const compendiumItems = await this.getElements(it => 1, it => ITEM_ENVIRONNEMENT_TYPES.includes(it.type));
await this.$prepareCompendiums(); return Misc.indexLowercase(this.getMilieuxSettings().concat(Environnement.listMilieux(compendiumItems)));
} }
async $prepareCompendiums() { static listMilieux(items) {
this.compendiums = game.settings.get(SYSTEM_RDD, COMPENDIUMS_RECHERCHE).filter(c => SystemCompendiums.getPack(c)); return Misc.concat(items.map(it => Environnement.$itemToMilieux(it).filter(m => m)));
this.compendiumTables = this.compendiums.map(it => new CompendiumTable(it, 'Item'));
const compendiumItems = await this.getElements(it => 1, it => it.isInventaire());
const fromCompendiums = Misc.concat(compendiumItems.map(it => it.getMilieux().filter(m => m)));
this.mapMilieux = Misc.indexLowercase(fromCompendiums);
} }
async autresMilieux(item) { async autresMilieux(item) {
const milieuxExistants = item.getMilieux().map(it => Grammar.toLowerCaseNoAccent(it)); const mapMilieux = await this.mapMilieux();
return Object.keys(this.mapMilieux) const milieuxExistants = Environnement.$itemToMilieux(item).map(it => Grammar.toLowerCaseNoAccent(it));
return Object.keys(mapMilieux)
.filter(it => !milieuxExistants.includes(it)) .filter(it => !milieuxExistants.includes(it))
.map(it => this.mapMilieux[it]); .map(it => mapMilieux[it]);
}
static $itemToMilieux(item) {
return item.system.environnement.map(env => env.milieu);
}
getMilieuxSettings() {
return game.settings.get(SYSTEM_RDD, SETTINGS_LISTE_MILIEUX).split(',').map(it => it.trim()).filter(it => it != '');
}
async findEnvironnementsLike(search) {
const milieux = await this.mapMilieux();
const searchLower = Grammar.toLowerCaseNoAccent(search);
const keys = Object.keys(milieux).filter(it => it.includes(searchLower));
if (keys.length > 1) {
const milieuExact = milieux[searchLower];
if (milieuExact) {
return [milieuExact];
}
}
return keys.map(k => milieux[k]);
}
async searchToChatMessage(milieux, typeName) {
const table = await this.buildEnvironnementTable(milieux);
await CompendiumTableHelpers.tableToChatMessage(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, typeName);
return true
}
async getRandom(milieux, typeName) {
const table = await this.buildEnvironnementTable(milieux);
return await CompendiumTableHelpers.getRandom(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, undefined, typeName);
}
async buildEnvironnementTable(milieux, filter) {
if (!milieux){
milieux = await this.milieux()
}
const frequence = item => item.getRarete(milieux)?.frequence ?? 0;
return await this.table.buildTable(frequence, it => frequence(it) > 0 && filter(it));
} }
async getElements(itemFrequence, filter) { async getElements(itemFrequence, filter) {
const compendiumsElement = await Promise.all( return await this.table.getContent(itemFrequence, filter);
this.compendiumTables.map(async compTable => await compTable.getContent(itemFrequence, filter))
);
const elements = compendiumsElement.reduce((a, b) => a.concat(b));
elements.sort(Misc.ascending(it => it.name))
return elements;
}
async buildTable(itemFrequence, filter = it => true) {
if (!itemFrequence) {
itemFrequence = it => it.getFrequence()
}
const elements = await this.getElements(itemFrequence, filter);;
return CompendiumTableHelpers.buildTable(elements, itemFrequence);
} }
} }
export class EnvironmentSheetHelper {
static defaultOptions(defaultOptions) {
return mergeObject(defaultOptions, {
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "informations" }]
});
}
static setPosition(sheet, superPosition) {
const position = superPosition;
const sheetHeader = sheet.element.find(".sheet-header");
const sheetBody = sheet.element.find(".sheet-body");
sheetBody.css("height", position.height - sheetHeader[0].clientHeight)
return position;
}
/* -------------------------------------------- */
static async getData(sheet, formData) {
return mergeObject(formData, {
milieux: await game.system.rdd.environnement.autresMilieux(sheet.item)
});
}
static activateListeners(sheet) {
if (!sheet.options.editable) return;
sheet.html.find("input.input-selection-milieu").keypress(event => {
if (event.keyCode == '13') {
EnvironmentSheetHelper.onAddMilieu(sheet, event);
}
event.stopPropagation();
})
sheet.html.find("a.milieu-add").click(event => EnvironmentSheetHelper.onAddMilieu(sheet, event));
sheet.html.find("div.environnement-milieu a.milieu-delete").click(event => EnvironmentSheetHelper.onDeleteMilieu(sheet, event));
sheet.html.find("div.environnement-milieu select.environnement-rarete").change(event => EnvironmentSheetHelper.onChange(sheet, event,
updated => EnvironmentSheetHelper.$changeRarete(sheet, event, updated)));
sheet.html.find("div.environnement-milieu input[name='environnement-frequence']").change(event => EnvironmentSheetHelper.onChange(sheet, event,
updated => EnvironmentSheetHelper.$changeFrequence(sheet, event, updated)));
}
static $changeFrequence(sheet, event, updated) {
updated.frequence = Number(sheet.html.find(event.currentTarget).val());
}
static $changeRarete(sheet, event, updated) {
const name = sheet.html.find(event.currentTarget).val();
const rarete = RdDRaretes.getRarete(name);
updated.rarete = rarete.code;
updated.frequence = rarete.frequence;
}
static async onAddMilieu(sheet, event) {
const milieu = sheet.html.find('input.input-selection-milieu').val();
if (!milieu) {
ui.notifications.warn(`Choisissez le milieu dans lequel se trouve le/la ${sheet.item.name}`);
return
}
const list = sheet.item.system.environnement;
const exists = list.find(it => it.milieu == milieu);
if (exists) {
ui.notifications.warn(`${sheet.item.name} a déjà une rareté ${exists.rarete} en ${milieu} (fréquence: ${exists.frequence})`);
return
}
const rarete = RdDRaretes.getRarete();
const newList = [...list, { milieu, rarete: rarete.code, frequence: rarete.frequence }].sort(Misc.ascending(it => it.milieu))
await sheet.item.update({ 'system.environnement': newList })
}
static async onDeleteMilieu(sheet, event) {
const milieu = EnvironmentSheetHelper.$getEventMilieu(sheet, event);
if (milieu != undefined) {
const newList = sheet.item.system.environnement.filter(it => it.milieu != milieu)
.sort(Misc.ascending(it => it.milieu));
await sheet.item.update({ 'system.environnement': newList });
}
}
static async onChange(sheet, event, doMutation) {
const list = sheet.item.system.environnement;
const milieu = EnvironmentSheetHelper.$getEventMilieu(sheet, event);
const updated = list.find(it => it.milieu == milieu);
if (updated) {
doMutation(updated);
const newList = [...list.filter(it => it.milieu != milieu), updated]
.sort(Misc.ascending(it => it.milieu));
await sheet.item.update({ 'system.environnement': newList });
}
}
static $getEventMilieu(sheet, event) {
return sheet.html.find(event.currentTarget)?.parents("div.environnement-milieu").data("milieu");
}
}

View File

@ -1,5 +1,5 @@
import { RdDItemCompetenceCreature } from "./item-competencecreature.js" import { RdDItemCompetenceCreature } from "./item-competencecreature.js"
import { TYPES } from "./item.js"; import { Misc } from "./misc.js";
import { RdDCombatManager } from "./rdd-combat.js"; import { RdDCombatManager } from "./rdd-combat.js";
const nomCategorieParade = { const nomCategorieParade = {
@ -20,7 +20,7 @@ const nomCategorieParade = {
export class RdDItemArme extends Item { export class RdDItemArme extends Item {
static isArme(item) { static isArme(item) {
return RdDItemCompetenceCreature.getCategorieAttaque(item) || item.type == 'arme'; return (item.type == 'competencecreature' && item.system.iscombat) || item.type == 'arme';
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -28,7 +28,7 @@ export class RdDItemArme extends Item {
switch (arme ? arme.type : '') { switch (arme ? arme.type : '') {
case 'arme': return arme; case 'arme': return arme;
case 'competencecreature': case 'competencecreature':
return RdDItemCompetenceCreature.armeCreature(arme); return RdDItemCompetenceCreature.armeNaturelle(arme);
} }
return RdDItemArme.mainsNues(); return RdDItemArme.mainsNues();
} }
@ -166,7 +166,7 @@ export class RdDItemArme extends Item {
let corpsACorps = competences.find(it => it.name == 'Corps à corps') ?? { system: { niveau: -6 } }; let corpsACorps = competences.find(it => it.name == 'Corps à corps') ?? { system: { niveau: -6 } };
let init = RdDCombatManager.calculInitiative(corpsACorps.system.niveau, carac['melee'].value); let init = RdDCombatManager.calculInitiative(corpsACorps.system.niveau, carac['melee'].value);
armes.push(RdDItemArme.mainsNues({ niveau: corpsACorps.system.niveau, initiative: init })); armes.push(RdDItemArme.mainsNues({ niveau: corpsACorps.system.niveau, initiative: init }));
armes.push(RdDItemArme.empoignade({ niveau: corpsACorps.system.niveau, initiative: init })); //armes.push(RdDItemArme.empoignade({ niveau: corpsACorps.system.niveau, initiative: init }));
} }
static corpsACorps(mainsNuesActor) { static corpsACorps(mainsNuesActor) {

View File

@ -23,7 +23,7 @@ const limitesArchetypes = [
]; ];
/* -------------------------------------------- */ /* -------------------------------------------- */
const categoriesCompetences = { const categorieCompetences = {
"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 getCategories() { static getCategorieCompetences() {
return categoriesCompetences; return categorieCompetences;
}
/* -------------------------------------------- */
static getNiveauBase(category) {
return categorieCompetences[category].base;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getLabelCategorie(category) { static getLabelCategorie(category) {
return categoriesCompetences[category].label; return categorieCompetences[category].label;
}
/* -------------------------------------------- */
static getNiveauBase(category, categories = categoriesCompetences) {
return categories[category]?.base ?? 0;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -190,9 +190,18 @@ export class RdDItemCompetence extends Item {
} }
} }
/* -------------------------------------------- */
static isVisible(item) {
return Number(item.system.niveau) != RdDItemCompetence.getNiveauBase(item.system.categorie);
}
static nomContientTexte(item, texte) {
return Grammar.toLowerCaseNoAccent(item.name).includes(Grammar.toLowerCaseNoAccent(texte))
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static isNiveauBase(item) { static isNiveauBase(item) {
return Number(item.system.niveau) == RdDItemCompetence.getNiveauBase(item.system.categorie, item.getCategories()); return Number(item.system.niveau) == RdDItemCompetence.getNiveauBase(item.system.categorie);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -270,7 +279,7 @@ export class RdDItemCompetence extends Item {
/* -------------------------------------------- */ /* -------------------------------------------- */
static triVisible(competences) { static triVisible(competences) {
return competences.filter(it => !it.system.isHidden) return competences.filter(it => it.system.isVisible)
.sort((a, b) => RdDItemCompetence.compare(a, b)) .sort((a, b) => RdDItemCompetence.compare(a, b))
} }

View File

@ -1,95 +1,49 @@
import { RdDItem, 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() {
return categories;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static setRollDataCreature(rollData) { static setRollDataCreature(rollData) {
rollData.competence = rollData.competence
rollData.carac = { "carac_creature": { label: rollData.competence.name, value: rollData.competence.system.carac_value } } rollData.carac = { "carac_creature": { label: rollData.competence.name, value: rollData.competence.system.carac_value } }
rollData.competence.system.defaut_carac = "carac_creature" rollData.competence.system.defaut_carac = "carac_creature"
rollData.competence.system.categorie = "creature"
rollData.selectedCarac = rollData.carac.carac_creature rollData.selectedCarac = rollData.carac.carac_creature
rollData.arme = RdDItemCompetenceCreature.armeCreature(rollData.competence); if (rollData.competence.system.iscombat) {
rollData.arme = RdDItemCompetenceCreature.armeNaturelle(rollData.competence);
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static armeCreature(item) { static armeNaturelle(competencecreature) {
const categorieAttaque = RdDItemCompetenceCreature.getCategorieAttaque(item) if (RdDItemCompetenceCreature.isCompetenceAttaque(competencecreature)) {
if (categorieAttaque != undefined) { // si c'est un Item compétence: cloner pour ne pas modifier lma compétence
// si c'est un Item compétence: cloner pour ne pas modifier la compétence let arme = (competencecreature instanceof Item) ? competencecreature.clone(): competencecreature;
let arme = item.clone(); mergeObject(arme.system,
mergeObject(arme,
{ {
action: item.isCompetencePossession() ? 'possession' : 'attaque',
system: {
competence: arme.name, competence: arme.name,
cac: categorieAttaque == "naturelle" ? "naturelle" : "", initiative: RdDCombatManager.calculInitiative(competencecreature.system.niveau, competencecreature.system.carac_value),
niveau: item.system.niveau, niveau: competencecreature.system.niveau,
initiative: RdDCombatManager.calculInitiative(item.system.niveau, item.system.carac_value),
equipe: true, equipe: true,
resistance: 100, resistance: 100,
dommagesReels: arme.system.dommages, dommagesReels: arme.system.dommages,
penetration: 0, penetration: 0,
force: 0, force: 0,
rapide: true, rapide: true,
} cac: competencecreature.system.isnaturelle ? "naturelle" : "",
action: 'attaque'
}); });
return arme; return arme;
} }
console.error("RdDItemCompetenceCreature.toActionArme(", competencecreature, ") : impossible de transformer l'Item en arme");
return undefined; return undefined;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getCategorieAttaque(item) { static isCompetenceAttaque(item) {
if (item.type == TYPES.competencecreature) { return item.type == 'competencecreature' && item.system.iscombat;
switch (item.system.categorie) {
case "melee":
case "tir":
case "lancer":
case "naturelle":
case "possession":
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
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -1,9 +1,9 @@
import { RdDBaseActorSheet } from "../actor/base-actor-sheet.js"; import { RdDBaseActorSheet } from "./actor/base-actor-sheet.js";
import { RdDSheetUtility } from "../rdd-sheet-utility.js"; import { RdDItemSheet } from "./item-sheet.js";
import { RdDUtility } from "../rdd-utility.js"; import { RdDSheetUtility } from "./rdd-sheet-utility.js";
import { RdDItemInventaireSheet } from "./sheet-base-inventaire.js"; import { RdDUtility } from "./rdd-utility.js";
export class RdDConteneurItemSheet extends RdDItemInventaireSheet { export class RdDConteneurItemSheet extends RdDItemSheet {
static get ITEM_TYPE() { return "conteneur" }; static get ITEM_TYPE() { return "conteneur" };
@ -29,7 +29,8 @@ 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.inventaires);
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems; formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems;
} }
@ -43,8 +44,7 @@ export class RdDConteneurItemSheet extends RdDItemInventaireSheet {
const dragData = { const dragData = {
actorId: this.actor.id, actorId: this.actor.id,
type: "Item", type: "Item",
data: item.system, data: item.system
uuid: item.uuid
}; };
event.dataTransfer.setData("text/plain", JSON.stringify(dragData)); event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
@ -52,8 +52,7 @@ export class RdDConteneurItemSheet extends RdDItemInventaireSheet {
async _onDropItem(event, dragData) { async _onDropItem(event, dragData) {
if (this.actor) { if (this.actor) {
const destItemId = this.html.find(event.target)?.closest('.item').attr('data-item-id') ?? this.item.id const dropParams = await RdDSheetUtility.prepareItemDropParameters(this.item.id, this.actor, dragData, this.objetVersConteneur);
const dropParams = await RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor, dragData, this.objetVersConteneur);
await this.actor.processDropItem(dropParams); await this.actor.processDropItem(dropParams);
await this.render(true); await this.render(true);
} }

View File

@ -0,0 +1,67 @@
import { EnvironmentSheetHelper } from "./environnement.js";
import { RdDItemSheet } from "./item-sheet.js";
import { RdDUtility } from "./rdd-utility.js";
export class RdDFauneItemSheet extends RdDItemSheet {
static get ITEM_TYPE() { return "faune" };
static get defaultOptions() {
return EnvironmentSheetHelper.defaultOptions(super.defaultOptions);
}
setPosition(options = {}) {
return EnvironmentSheetHelper.setPosition(this, super.setPosition(options));
}
async getData() {
const formData = await super.getData();
return await EnvironmentSheetHelper.getData(this, formData);
}
activateListeners(html) {
super.activateListeners(html);
if (!this.options.editable) return;
EnvironmentSheetHelper.activateListeners(this);
html.find("a.linked-actor-delete").click(event => this.onDeleteLinkedActor());
html.find("a.preparer-nourriture").click(event => this.preparerNourriture(event));
html.find("a.manger-nourriture").click(event => this.mangerNourriture(event));
}
async _onDropActor(event, dragData) {
console.log('faune:dropActor', event, dragData)
const linkedActor = fromUuidSync(dragData.uuid);
if (linkedActor?.pack) {
this.item.update({
'system.actor.pack': linkedActor.pack,
'system.actor.id': linkedActor._id,
'system.actor.name': linkedActor.name
});
}
else {
ui.notifications.warn(`${linkedActor.name} ne provient pas d'un compendium.
<br>Choisissez une créature du compendium pour représenter un élément de faune générique`)
}
}
async onDeleteLinkedActor() {
this.item.update({
'system.actor.pack': '',
'system.actor.id': '',
'system.actor.name': ''
});
}
async preparerNourriture(event) {
if (this.actor) {
await this.actor.preparerNourriture(this.item);
}
}
async mangerNourriture(event) {
if (this.actor) {
await this.actor.mangerNourriture(this.item);
}
}
}

View File

@ -0,0 +1,25 @@
import { EnvironmentSheetHelper } from "./environnement.js";
import { RdDItemSheet } from "./item-sheet.js";
export class RdDHerbeItemSheet extends RdDItemSheet {
static get ITEM_TYPE() { return "herbe" };
static get defaultOptions() {
return EnvironmentSheetHelper.defaultOptions(super.defaultOptions);
}
setPosition(options = {}) {
return EnvironmentSheetHelper.setPosition(this, super.setPosition(options));
}
async getData() {
const formData = await super.getData();
return await EnvironmentSheetHelper.getData(this, formData);
}
activateListeners(html) {
super.activateListeners(html);
EnvironmentSheetHelper.activateListeners(this);
}
}

View File

@ -0,0 +1,25 @@
import { EnvironmentSheetHelper } from "./environnement.js";
import { RdDItemSheet } from "./item-sheet.js";
export class RdDIngredientItemSheet extends RdDItemSheet {
static get ITEM_TYPE() { return "ingredient" };
static get defaultOptions() {
return EnvironmentSheetHelper.defaultOptions(super.defaultOptions);
}
setPosition(options = {}) {
return EnvironmentSheetHelper.setPosition(this, super.setPosition(options));
}
async getData() {
const formData = await super.getData();
return await EnvironmentSheetHelper.getData(this, formData);
}
activateListeners(html) {
super.activateListeners(html);
EnvironmentSheetHelper.activateListeners(this);
}
}

View File

@ -62,13 +62,6 @@ export class Monnaie {
return deniers; return deniers;
} }
static toSolsDeniers(fortune) {
return {
sols: Math.floor(fortune),
deniers: Math.round(100 * (fortune - Math.floor(fortune)))
};
}
static getFortune(monnaies) { static getFortune(monnaies) {
return (monnaies??[]) return (monnaies??[])
.map(m => Number(m.system.cout) * Number(m.system.quantite)) .map(m => Number(m.system.cout) * Number(m.system.quantite))

View File

@ -0,0 +1,25 @@
import { EnvironmentSheetHelper } from "./environnement.js";
import { RdDItemSheet } from "./item-sheet.js";
export class RdDPlanteItemSheet extends RdDItemSheet {
static get ITEM_TYPE() { return "plante" };
static get defaultOptions() {
return EnvironmentSheetHelper.defaultOptions(super.defaultOptions);
}
setPosition(options = {}) {
return EnvironmentSheetHelper.setPosition(this, super.setPosition(options));
}
async getData() {
const formData = await super.getData();
return await EnvironmentSheetHelper.getData(this, formData);
}
activateListeners(html) {
super.activateListeners(html);
EnvironmentSheetHelper.activateListeners(this);
}
}

View File

@ -1,5 +1,5 @@
import { RdDRencontre } from "./rencontre.js"; import { RdDRencontre } from "./item/item-rencontre.js";
import { RdDItemSheet } from "../item-sheet.js"; import { RdDItemSheet } from "./item-sheet.js";
export class RdDRencontreItemSheet extends RdDItemSheet { export class RdDRencontreItemSheet extends RdDItemSheet {

View File

@ -1,4 +1,4 @@
import { RdDItemSheet } from "../item-sheet.js"; import { RdDItemSheet } from "./item-sheet.js";
export class RdDServiceItemSheet extends RdDItemSheet { export class RdDServiceItemSheet extends RdDItemSheet {
@ -6,7 +6,7 @@ export class RdDServiceItemSheet extends RdDItemSheet {
async getData() { async getData() {
const formData = await super.getData(); const formData = await super.getData();
formData.disabled = formData.options.isGM || formData.options.isOwned ? '' : 'disabled'; formData.disabled = formData.isGM || formData.isOwned ? '' : 'disabled';
return formData; return formData;
} }

View File

@ -10,9 +10,7 @@ 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 "./time/rdd-timestamp.js"; import { RdDTimestamp } from "./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
@ -88,32 +86,33 @@ export class RdDItemSheet extends ItemSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
let formData = { let formData = {
title: this.item.name,
id: this.item.id, id: this.item.id,
title: this.item.name,
type: this.item.type, type: this.item.type,
img: this.item.img, img: this.item.img,
name: this.item.name, name: this.item.name,
system: this.item.system, system: this.item.system,
isGM: game.user.isGM,
actorId: this.actor?.id, actorId: this.actor?.id,
isOwned: this.actor ? true : false,
owner: this.item.isOwner,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
isSoins: false,
description: await TextEditor.enrichHTML(this.item.system.description, { async: true }), description: await TextEditor.enrichHTML(this.item.system.description, { async: true }),
descriptionmj: await TextEditor.enrichHTML(this.item.system.descriptionmj, { async: true }), descriptionmj: await TextEditor.enrichHTML(this.item.system.descriptionmj, { async: true }),
isComestible: this.item.getUtilisationCuisine(), isComestible: this.item.getUtilisationCuisine()
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('personnage'); const competences = await SystemCompendiums.getCompetences(this.actor?.type);
formData.categories = this.item.getCategories() formData.categorieCompetences = RdDItemCompetence.getCategorieCompetences()
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 => RdDItemCompetence.isCompetenceArme(it));
} }
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));
@ -139,12 +138,12 @@ export class RdDItemSheet extends ItemSheet {
if (this.item.type == 'potion') { if (this.item.type == 'potion') {
await RdDHerbes.addPotionFormData(formData); await RdDHerbes.addPotionFormData(formData);
} }
if (formData.options.isOwned && this.item.type == 'herbe' && (formData.system.categorie == 'Soin' || formData.system.categorie == 'Repos')) { if (formData.isOwned && this.item.type == 'herbe' && (formData.system.categorie == 'Soin' || formData.system.categorie == 'Repos')) {
formData.isIngredientPotionBase = true; formData.isIngredientPotionBase = true;
} }
if (this.item.type == 'sortreserve') { if (this.item.type == 'sortreserve') {
const sortId = this.item.system.sortid; const sortId = this.item.system.sortid;
formData.sort = formData.options.isOwned ? this.item.actor.items.get(sortId) : game.items.get(sortId); formData.sort = formData.isOwned ? this.item.actor.items.get(sortId) : game.items.get(sortId);
} }
formData.bonusCaseList = RdDItemSort.getBonusCaseList(formData, true); formData.bonusCaseList = RdDItemSort.getBonusCaseList(formData, true);
@ -157,9 +156,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"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.item.isOwned);
|| game.user.isGM
|| !this.item.isOwned);
HtmlUtility.showControlWhen(this.html.find(".item-magique"), this.item.isMagique()); HtmlUtility.showControlWhen(this.html.find(".item-magique"), this.item.isMagique());
// Everything below here is only needed if the sheet is editable // Everything below here is only needed if the sheet is editable
@ -194,7 +191,7 @@ 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.getActionRenderItem())); this.html.find('.consommer-potion').click((event) => this._getEventActor(event).consommerPotion(this.item));
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).dialogFabriquerPotion(this.item));
this.html.find('.alchimie-tache a').click((event) => { this.html.find('.alchimie-tache a').click((event) => {
@ -209,23 +206,12 @@ export class RdDItemSheet extends ItemSheet {
} }
}); });
if (this.actor) { this.html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, async () => this.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-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true)); this.html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true));
this.html.find('.item-delete').click(async event => RdDUtility.confirmActorItemDelete(this, RdDSheetUtility.getItem(event, this.actor))); this.html.find('.item-delete').click(async event => RdDUtility.confirmActorItemDelete(this, RdDSheetUtility.getItem(event, this.actor)));
this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente()); this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente());
this.html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItemToChat()); 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-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor, async () => this.render(true)));
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) })
@ -233,16 +219,6 @@ 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);
@ -255,8 +231,7 @@ export class RdDItemSheet extends ItemSheet {
event.preventDefault(); event.preventDefault();
if (this.item.isCompetence()) { if (this.item.isCompetence()) {
const categorie = event.currentTarget.value; let level = RdDItemCompetence.getNiveauBase(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);
} }
@ -267,8 +242,9 @@ 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.buildBonuscaseFromArrays(formData.bonusValue, formData.caseValue); formData['system.bonuscase'] = RdDItemSort.buildBonusCaseStringFromFormData(formData.bonusValue, formData.caseValue);
} }
return this.item.update(formData); return this.item.update(formData);
} }

View File

@ -1,6 +1,6 @@
import { RdDItemSheet } from "../item-sheet.js"; import { RdDItemSheet } from "./item-sheet.js";
import { RdDItemSigneDraconique } from "./signedraconique.js"; import { RdDItemSigneDraconique } from "./item/item-signedraconique.js";
import { TMRUtility } from "../tmr-utility.js"; import { TMRUtility } from "./tmr-utility.js";
/** /**
* Item sheet pour signes draconiques * Item sheet pour signes draconiques

View File

@ -1,3 +1,4 @@
/* -------------------------------------------- */
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { TMRUtility } from "./tmr-utility.js"; import { TMRUtility } from "./tmr-utility.js";
@ -15,7 +16,7 @@ export class RdDItemSort extends Item {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
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;
} }
@ -30,22 +31,30 @@ export class RdDItemSort extends Item {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static buildBonusCaseList(bonuscase, newCase) { static buildBonusCaseList( caseBonusString, newCase ) {
const list = RdDItemSort._bonuscaseStringToList(bonuscase) if (caseBonusString == undefined) {
if (newCase) { return [];
return list.concat({ case: "Nouvelle", bonus: 0 });
} }
return list; 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;
} }
/* -------------------------------------------- */
/** /**
* 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 RdDItemSort.buildBonusCaseList(item.system.bonuscase, newCase); return this.buildBonusCaseList(item.system.bonuscase, newCase );
} }
return undefined; return undefined;
} }
@ -54,61 +63,56 @@ export class RdDItemSort extends Item {
/** 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 buildBonuscaseFromArrays(bonuses, coords) { static buildBonusCaseStringFromFormData( bonuses, cases ) {
if (bonuses) { if ( bonuses ) {
const list = []; let list = [];
const caseCheck = {}; let caseCheck = {};
for (let i = 0; i < bonuses.length && i < coords.length; i++) { for (let i=0; i<bonuses.length; i++) {
const coord = coords[i] == 'Fleuve' ? 'Fleuve' : (coords[i]?.toUpperCase() ?? 'A1'); let coord = cases[i]?.toUpperCase() || 'A1';
const bonus = bonuses[i] || 0; let 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({ case: coord, bonus: bonus }); list.push( coord+":"+bonus );
} }
} }
return RdDItemSort._bonuscaseListToString(list); return list.toString();
} }
return undefined; return undefined;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static incrementBonusCase(actor, sort, coord) { static incrementBonusCase( actor, sort, coord ) {
if (TMRUtility.getTMR(coord).type == "fleuve") { let bonusCaseList = this.buildBonusCaseList(sort.system.bonuscase, false);
coord = 'Fleuve'; //console.log("ITEMSORT", sort, bonusCaseList);
}
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( let found = false;
list.filter(it => it.case != coord).concat(modified) 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 // Sauvegarde/update
actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'system.bonuscase': bonuscase }]); let bonuscase = StringList.toString();
//console.log("Bonus cae :", bonuscase);
actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'system.bonuscase': bonuscase }] );
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getCaseBonus(sort, coord) { static getCaseBonus( sort, coord) {
const isFleuve = TMRUtility.getTMR(coord).type == "fleuve"; let bonusCaseList = this.buildBonusCaseList(sort.system.bonuscase, false);
for( let bc of bonusCaseList) {
let bc = RdDItemSort.buildBonusCaseList(sort.system.bonuscase, false) if (bc.case == coord) { // Case existante
.filter(it => it.case == coord || (isFleuve && it.case == 'Fleuve')) return Number(bc.bonus);
.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 0;
return (bonuscase ?? '').split(',').map(it => {
const b = it.split(':');
return { case: b[0], bonus: b[1] };
});
} }
} }

4
module/item-tache.js Normal file
View File

@ -0,0 +1,4 @@
export class RdDItemTache extends Item {
}

View File

@ -1,89 +1,41 @@
import { DialogItemVente } from "./dialog-item-vente.js"; import { DialogItemVente } from "./dialog-item-vente.js";
import { Environnement } from "./environnement.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 "./time/rdd-timestamp.js"; import { RdDTimestamp } from "./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 "./tirage/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 = [
TYPES.arme, "arme",
TYPES.armure, "armure",
TYPES.conteneur, "conteneur",
TYPES.faune, "faune",
TYPES.gemme, "gemme",
TYPES.herbe, "herbe",
TYPES.plante, "plante",
TYPES.ingredient, "ingredient",
TYPES.livre, "livre",
TYPES.monnaie, "monnaie",
TYPES.munition, "munition",
TYPES.nourritureboisson, "nourritureboisson",
TYPES.objet, "objet",
TYPES.potion, "potion",
] ]
const typesInventaire = { const typesInventaire = {
materiel: typesInventaireMateriel, materiel: typesInventaireMateriel,
all: ['service'].concat(typesInventaireMateriel), all: ['service'].concat(typesInventaireMateriel),
} }
const typesObjetsOeuvres = [TYPES.oeuvre, TYPES.recettecuisine, TYPES.musique, TYPES.chant, TYPES.danse, TYPES.jeu] const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu"]
const typesObjetsDraconiques = [TYPES.queue, TYPES.ombre, TYPES.souffle, TYPES.tete, TYPES.signedraconique, TYPES.sortreserve, TYPES.rencontre] const typesObjetsDraconiques = ["queue", "ombre", "souffle", "tete", "signedraconique", "sortreserve", "rencontre"]
const typesObjetsConnaissance = [TYPES.meditation, TYPES.recettealchimique, TYPES.sort] const typesObjetsConnaissance = ["meditation", "recettealchimique", "sort"]
const typesObjetsEffet = [TYPES.possession, TYPES.poison, TYPES.maladie, TYPES.blessure] const typesObjetsEffet = ["possession", "poison", "maladie"]
const typesObjetsCompetence = [TYPES.competence, TYPES.competencecreature] const typesObjetsCompetence = ["competence", "competencecreature"]
const typesObjetsTemporels = [TYPES.blessure, TYPES.poison, TYPES.maladie, TYPES.queue, TYPES.ombre, TYPES.souffle, TYPES.signedraconique, TYPES.rencontre] const typesObjetsTemporels = ["poison", "maladie", "queue", "ombre", "souffle", "signedraconique", "rencontre"]
const typesObjetsEquipable = [TYPES.arme, TYPES.armure, TYPES.objet]; const typesEnvironnement = Environnement.typesEnvironnement();
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
densité 3.5 (~2.3 à 4, parfois plus) -- https://www.juwelo.fr/guide-des-pierres/faits-et-chiffres/ densité 3.5 (~2.3 à 4, parfois plus) -- https://www.juwelo.fr/guide-des-pierres/faits-et-chiffres/
@ -124,16 +76,11 @@ 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];
} }
@ -141,12 +88,12 @@ export class RdDItem extends Item {
static isFieldInventaireModifiable(type, field) { static isFieldInventaireModifiable(type, field) {
switch (field) { switch (field) {
case 'quantite': case 'quantite':
if ([TYPES.conteneur].includes(type)) { if (['conteneur'].includes(type)) {
return false; return false;
} }
break; break;
case 'cout': case 'cout':
if ([TYPES.monnaie].includes(type)) { if (['monnaie'].includes(type)) {
return game.user.isGM; return game.user.isGM;
} }
break; break;
@ -192,85 +139,75 @@ 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 TYPES.monnaie: return "(Pièces)" case "monnaie": return "(Pièces)"
case TYPES.herbe: case "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 TYPES.ingredient: return "(Pépins ou Brins)" case "ingredient": return "(Pépins ou Brins)"
} }
return ''; return '';
} }
isEquipable() { isCompetencePersonnage() { return this.type == 'competence' }
return typesObjetsEquipable.includes(this.type) isCompetenceCreature() { return this.type == 'competencecreature' }
} isConteneur() { return this.type == 'conteneur'; }
isMonnaie() { return this.type == 'monnaie'; }
isCompetencePersonnage() { return this.type == TYPES.competence } isPotion() { return this.type == 'potion'; }
isCompetenceCreature() { return this.type == TYPES.competencecreature } isNourritureBoisson() { return this.type == 'nourritureboisson'; }
isConteneur() { return this.type == TYPES.conteneur; } isService() { return this.type == 'service'; }
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) }
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; }
isAlcool() { return this.isNourritureBoisson() && this.system.boisson && this.system.alcoolise; } isAlcool() { return this.isNourritureBoisson() && this.system.boisson && this.system.alcoolise; }
isHerbeAPotion() { return this.type == TYPES.herbe && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); } isHerbeAPotion() { return this.type == 'herbe' && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); }
isBlessure() { return this.type == TYPES.blessure } isEnvironnement() { return RdDItem.getItemTypesEnvironnement().includes(this.type) }
isPresentDansMilieux(milieux) { isPresentDansMilieux(milieux) {
return this.getEnvironnements(milieux).length > 0 return this.getEnvironnements(milieux).length > 0
} }
getCategories() { getEnvironnements(milieux = undefined) {
switch (this.type) { return this.isEnvironnement()
case TYPES.competence: return RdDItemCompetence.getCategories() ? this.system?.environnement.filter(env => !milieux || milieux.includes(env.milieu))
case TYPES.competencecreature: return RdDItemCompetenceCreature.getCategories() : []
}
getEnvRarete(milieux = undefined) {
if (this.isEnvironnement()) {
const list = this.getEnvironnements(milieux);
const frequenceMax = Math.max(...list.map(env => env.frequence));
return list.find(env => env.frequence == frequenceMax);
} }
return {} return {}
} }
getEnvironnements(milieux = undefined) { getRarete(milieux = undefined) {
const environnements = this.isInventaire() ? this.system.environnement : undefined; if (this.isEnvironnement()) {
if (milieux == undefined || !environnements) { const env = this.getEnvRarete(milieux);
return environnements ?? []; return RdDRaretes.getRarete(env.rarete);
} }
return environnements.filter(env => milieux.includes(env.milieu))
}
getMilieux() {
return this.getEnvironnements().map(env => env.milieu);
}
getRaretes(milieux = undefined) {
if (this.isInventaire()) { if (this.isInventaire()) {
const raretes = this.getEnvironnements(milieux).map(env => RdDRaretes.byCode(env.rarete)); return RdDRaretes.rareteEquipement(this)
if (milieux == undefined && raretes.length == 0) {
return [RdDRaretes.rareteFrequente()];
} }
return raretes; return RdDRaretes.getRareteFrequente();
} }
return [RdDRaretes.rareteEgale()];
}
getFrequence(milieux = undefined) { getFrequence(milieux = undefined) {
const frequences = this.getEnvironnements(milieux).map(it => it.frequence); const frequence = this.getRarete(milieux)?.frequence;
return frequences.length == 0 ? 0 : Math.max(...frequences); return frequence == undefined ? 1 : frequence;
} }
getItemGroup() { getItemGroup() {
@ -321,21 +258,18 @@ export class RdDItem extends Item {
console.log(`${this.actor.name}: l'objet ${this.name} a expiré et été supprimé`); console.log(`${this.actor.name}: l'objet ${this.name} a expiré et été supprimé`);
await this.actor?.deleteEmbeddedDocuments('Item', [this.id]); await this.actor?.deleteEmbeddedDocuments('Item', [this.id]);
} }
getUtilisation() { getUtilisation() {
switch (this.type) { switch (this.type) {
case TYPES.potion: case 'nourritureboisson':
switch (this.system.categorie) { return 'cuisine';
case 'Alchimie': case 'AlchimieEnchante': case 'AlchimieAutre': return 'alchimie' case 'herbe':
case 'Cuisine': return 'cuisine' case 'faune':
case 'Remede': case 'Repos': case 'ReposEnchante': case 'Soin': case 'SoinEnchante': return 'soins' case 'ingredient':
} case 'plante':
return '';
case TYPES.nourritureboisson: return 'cuisine';
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';
case 'Alchimie': return 'alchimie' case 'Alchimie': return 'alchimie'
case 'Soin': case 'Repos': return 'soins' case 'Soin': case 'Repos': return 'soins'
} }
@ -343,13 +277,15 @@ export class RdDItem extends Item {
} }
return ''; return '';
} }
getUtilisationCuisine() { getUtilisationCuisine() {
if (this.getUtilisation() == 'cuisine') { if (this.getUtilisation() == 'cuisine') {
switch (this.type) { switch (this.type) {
case TYPES.nourritureboisson: case 'nourritureboisson':
return 'pret'; return 'pret';
case TYPES.herbe: case TYPES.faune: case TYPES.ingredient: case TYPES.plante: case 'herbe':
case 'faune':
case 'ingredient':
case 'plante':
return 'brut'; return 'brut';
} }
} }
@ -357,7 +293,7 @@ export class RdDItem extends Item {
} }
isCristalAlchimique() { isCristalAlchimique() {
return this.type == TYPES.objet && Grammar.includesLowerCaseNoAccent(this.name, 'cristal alchimique') && this.system.quantite > 0; return this.type == 'objet' && Grammar.toLowerCaseNoAccent(this.name) == 'cristal alchimique' && this.system.quantite > 0;
} }
isMagique() { isMagique() {
@ -368,28 +304,21 @@ export class RdDItem extends Item {
return this.parent?.type == 'commerce'; return this.parent?.type == 'commerce';
} }
isNomLike(texte) {
return Grammar.includesLowerCaseNoAccent(this.name, texte)
}
isNomTypeLike(texte) {
return this.isNomLike(texte) || Grammar.includesLowerCaseNoAccent(Misc.typeName(this.type, 'Item'), texte)
}
getQuantite() { getQuantite() {
return this.isService() ? undefined : Math.round(this.system.quantite ?? 0) return this.isService() ? undefined : Math.round(this.system.quantite ?? 0)
} }
getEncTotal() { getEncTotal() {
return (this.getQuantite() ?? 0) * this.getEnc(); return (this.isService() ? 0 : this.getQuantite()) * this.getEnc();
} }
getEnc() { getEnc() {
switch (this.type) { switch (this.type) {
case TYPES.service: case 'service':
return 0; return 0;
case TYPES.herbe: case 'herbe':
return this.getEncHerbe(); return this.getEncHerbe();
case TYPES.gemme: case '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);
@ -429,7 +358,6 @@ 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() {
@ -445,7 +373,7 @@ export class RdDItem extends Item {
getActionPrincipale(options = { warnIfNot: true }) { getActionPrincipale(options = { warnIfNot: true }) {
switch (this.type) { switch (this.type) {
case TYPES.conteneur: return 'Ouvrir'; case 'conteneur': return 'Ouvrir';
} }
if (this.actor?.isPersonnage()) { if (this.actor?.isPersonnage()) {
const warn = options.warnIfNot; const warn = options.warnIfNot;
@ -453,11 +381,11 @@ export class RdDItem extends Item {
return 'Utiliser'; return 'Utiliser';
} }
switch (this.type) { switch (this.type) {
case TYPES.nourritureboisson: return this._actionOrWarnQuantiteZero(this.system.boisson ? 'Boire' : 'Manger', warn); case 'nourritureboisson': return this._actionOrWarnQuantiteZero(this.system.boisson ? 'Boire' : 'Manger', warn);
case TYPES.potion: return this._actionOrWarnQuantiteZero('Boire', warn); case 'potion': return this._actionOrWarnQuantiteZero('Boire', warn);
case TYPES.livre: return this._actionOrWarnQuantiteZero('Lire', warn); case 'livre': return this._actionOrWarnQuantiteZero('Lire', warn);
case TYPES.herbe: return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined; case 'herbe': return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined;
case TYPES.queue: case TYPES.ombre: return this.system.refoulement > 0 ? 'Refouler' : undefined; case 'queue': case 'ombre': return this.system.refoulement > 0 ? 'Refouler' : undefined;
} }
} }
return undefined; return undefined;
@ -472,11 +400,11 @@ export class RdDItem extends Item {
return; return;
} }
switch (this.type) { switch (this.type) {
case TYPES.potion: return await actor.consommerPotion(this, onActionItem); case 'potion': return await actor.consommerPotion(this, onActionItem);
case TYPES.livre: return await actor.actionLire(this); case 'livre': return await actor.actionLire(this);
case TYPES.conteneur: return await this.sheet.render(true); case 'conteneur': return await this.sheet.render(true);
case TYPES.herbe: return await actor.actionHerbe(this, onActionItem); case 'herbe': return await actor.actionHerbe(this);
case TYPES.queue: case TYPES.ombre: return await actor.actionRefoulement(this); case 'queue': case 'ombre': return await actor.actionRefoulement(this);
} }
} }
@ -570,7 +498,7 @@ export class RdDItem extends Item {
return [false, `Impossible de regrouper ${this.name} avec ${other.name}`]; return [false, `Impossible de regrouper ${this.name} avec ${other.name}`];
} }
else { else {
const excludedProperties = ['quantite', 'cout', 'encTotal', 'environnement', 'contenu']; const excludedProperties = ['quantite', 'cout', 'encTotal', 'environnement'];
if (this.getUtilisationCuisine()) { if (this.getUtilisationCuisine()) {
excludedProperties.push('sust', 'encombrement'); excludedProperties.push('sust', 'encombrement');
} }

View File

@ -1,51 +0,0 @@
import { RdDItem } from "../item.js";
import { Misc } from "../misc.js";
import { ReglesOptionelles } from "../settings/regles-optionelles.js";
export class RdDItemArmure extends RdDItem {
static get defaultIcon() {
return "systems/foundryvtt-reve-de-dragon/icons/armes_armures/armure_plaques.webp";
}
deteriorerArmure(dmg) {
if (!ReglesOptionelles.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;
}
}
}

View File

@ -1,199 +0,0 @@
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}`
)
),
];
}
}

View File

@ -1,4 +1,4 @@
import { EffetsRencontre } from "../tmr/effets-rencontres.js"; import { EffetsRencontre } from "../effets-rencontres.js";
import { RdDItem } from "../item.js"; import { RdDItem } from "../item.js";
const tableEffets = [ const tableEffets = [

View File

@ -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 "../time/rdd-timestamp.js"; import { RdDTimestamp } from "../rdd-timestamp.js";
import { TMRType, TMRUtility } from "../tmr-utility.js"; import { TMRType, TMRUtility } from "../tmr-utility.js";
const tableSignesIndicatifs = [ const tableSignesIndicatifs = [

View File

@ -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 "../time/rdd-timestamp.js"; import { RdDTimestamp } from "../rdd-timestamp.js";
export class RdDItemMaladie extends RdDItem { export class RdDItemMaladie extends RdDItem {

View File

@ -1,31 +0,0 @@
const RARETE_COMMUNE = { code: 'Commune', label: 'Commune', frequence: 54, min: 27, max: 108 };
const RARETE_FREQUENTE = { code: 'Frequente', label: 'Fréquente', frequence: 18, min: 9, max: 36 };
const RARETE_RARE = { code: 'Rare', label: 'Rare', frequence: 6, min: 3, max: 12 };
const RARETE_RARISSIME = { code: 'Rarissime', label: 'Rarissime', frequence: 2, min: 1, max: 4 };
const RARETE_INEXISTANT = { code: 'Inexistant', label: 'Inexistant', frequence: 0, min: 0, max: 0 };
const RARETE_EGALE = { code: 'eqal', label: 'Egal', frequence: 1, min: 1, max: 1 };
const RARETES = [
RARETE_COMMUNE,
RARETE_FREQUENTE,
RARETE_RARE,
RARETE_RARISSIME,
RARETE_INEXISTANT,
]
export class RdDRaretes {
static rareteFrequente() { return RARETE_FREQUENTE; }
static rareteEgale() { return RARETE_EGALE; }
static raretes() { return RARETES; }
static byCode(code = undefined) {
return RARETES.find(it => it.code == code) ?? RARETE_FREQUENTE;
}
static getChamp(rarete, field = undefined) {
return RdDRaretes.byCode(rarete)[field ?? 'frequence'];
}
}

View File

@ -1,120 +0,0 @@
import { HtmlUtility } from "../html-utility.js";
import { RdDItemSheet } from "../item-sheet.js";
import { Misc } from "../misc.js";
import { RdDRaretes } from "./raretes.js";
const TYPE_ITEMS_NATURELS = ["faune", "herbe", "plante", "ingredient"];
export class RdDItemInventaireSheet extends RdDItemSheet {
static get defaultOptions() {
return mergeObject(RdDItemSheet.defaultOptions, {
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "informations" }]
});
}
setPosition(options = {}) {
const position = super.setPosition(options);
const sheetHeader = this.element.find(".sheet-header");
const sheetBody = this.element.find(".sheet-body");
sheetBody.css("height", position.height - sheetHeader[0].clientHeight)
return position;
}
async getData() {
const formData = await super.getData();
return mergeObject(formData, {
milieux: await game.system.rdd.environnement.autresMilieux(this.item)
});
}
activateListeners(html) {
super.activateListeners(html);
HtmlUtility.showControlWhen(this.html.find("div.description-milieu"), TYPE_ITEMS_NATURELS.includes(this.item.type));
if (!this.options.editable) return;
this.html.find("a.preparer-nourriture").click(event => this.preparerNourriture(event));
this.html.find("a.manger-nourriture").click(event => this.mangerNourriture(event));
this.html.find("input.input-selection-milieu").keypress(event => {
if (event.keyCode == '13') {
this.onAddMilieu(event);
}
event.stopPropagation();
})
this.html.find("a.milieu-add").click(event => this.onAddMilieu(event));
this.html.find("div.environnement-milieu a.milieu-delete").click(event => this.onDeleteMilieu(event));
this.html.find("div.environnement-milieu select.environnement-rarete").change(event => this.onChange(event,
updated => this.$changeRarete(event, updated)));
this.html.find("div.environnement-milieu input[name='environnement-frequence']").change(event => this.onChange(event,
updated => this.$changeFrequence(event, updated)));
}
async preparerNourriture(event) {
if (this.actor && this.item.getUtilisationCuisine() == 'brut') {
await this.actor.preparerNourriture(this.item);
}
}
async mangerNourriture(event) {
if (this.actor && this.item.getUtilisation() == 'cuisine') {
await this.actor.mangerNourriture(this.item);
}
}
$changeFrequence(event, updated) {
updated.frequence = Number(this.html.find(event.currentTarget).val());
}
$changeRarete(event, updated) {
const code = this.html.find(event.currentTarget).val();
const rarete = RdDRaretes.byCode(code);
updated.rarete = rarete.code;
updated.frequence = rarete.frequence;
}
async onAddMilieu(event) {
const milieu = this.html.find('input.input-selection-milieu').val();
if (!milieu) {
ui.notifications.warn(`Choisissez le milieu dans lequel se trouve le/la ${this.item.name}`);
return
}
const list = this.item.getEnvironnements();
const exists = list.find(it => it.milieu == milieu);
if (exists) {
ui.notifications.warn(`${this.item.name} a déjà une rareté ${exists.rarete} en ${milieu} (fréquence: ${exists.frequence})`);
return
}
const rarete = RdDRaretes.rareteFrequente();
const added = { milieu, rarete: rarete.code, frequence: rarete.frequence };
const newList = [added, ...list].sort(Misc.ascending(it => it.milieu))
await this.item.update({ 'system.environnement': newList })
}
async onDeleteMilieu(event) {
const milieu = this.$getEventMilieu(event);
if (milieu != undefined) {
const newList = this.item.getEnvironnements().filter(it => it.milieu != milieu)
.sort(Misc.ascending(it => it.milieu));
await this.item.update({ 'system.environnement': newList });
}
}
async onChange(event, doMutation) {
const list = this.item.system.environnement;
const milieu = this.$getEventMilieu(event);
const updated = list.find(it => it.milieu == milieu);
if (updated) {
doMutation(updated);
const newList = [...list.filter(it => it.milieu != milieu), updated]
.sort(Misc.ascending(it => it.milieu));
await this.item.update({ 'system.environnement': newList });
}
}
$getEventMilieu(event) {
return this.html.find(event.currentTarget)?.parents("div.environnement-milieu").data("milieu");
}
}

View File

@ -1,29 +0,0 @@
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 })
});
}
}

View File

@ -1,38 +0,0 @@
import { RdDItemInventaireSheet } from "./sheet-base-inventaire.js";
export class RdDFauneItemSheet extends RdDItemInventaireSheet {
static get ITEM_TYPE() { return "faune" };
activateListeners(html) {
super.activateListeners(html);
if (!this.options.editable) return;
html.find("a.linked-actor-delete").click(event => this.onDeleteLinkedActor());
}
async _onDropActor(event, dragData) {
console.log('faune:dropActor', event, dragData)
const linkedActor = fromUuidSync(dragData.uuid);
if (linkedActor?.pack) {
this.item.update({
'system.actor.pack': linkedActor.pack,
'system.actor.id': linkedActor._id,
'system.actor.name': linkedActor.name
});
}
else {
ui.notifications.warn(`${linkedActor.name} ne provient pas d'un compendium.
<br>Choisissez une créature du compendium pour représenter un élément de faune générique`)
}
}
async onDeleteLinkedActor() {
this.item.update({
'system.actor.pack': '',
'system.actor.id': '',
'system.actor.name': ''
});
}
}

View File

@ -1,6 +0,0 @@
import { RdDItemInventaireSheet } from "./sheet-base-inventaire.js";
export class RdDHerbeItemSheet extends RdDItemInventaireSheet {
static get ITEM_TYPE() { return "herbe" };
}

View File

@ -1,5 +0,0 @@
import { RdDItemInventaireSheet } from "./sheet-base-inventaire.js";
export class RdDIngredientItemSheet extends RdDItemInventaireSheet {
static get ITEM_TYPE() { return "ingredient" };
}

View File

@ -1,7 +0,0 @@
import { RdDItemInventaireSheet } from "./sheet-base-inventaire.js";
export class RdDPlanteItemSheet extends RdDItemInventaireSheet {
static get ITEM_TYPE() { return "plante" };
}

View File

@ -1,10 +1,11 @@
import { RdDBaseActor } from "./actor/base-actor.js"; import { RdDBaseActor } from "./actor/base-actor.js";
import { LOG_HEAD, SYSTEM_RDD } from "./constants.js"; import { LOG_HEAD, SYSTEM_RDD } from "./constants.js";
import { Environnement } from "./environnement.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, TYPES } from "./item.js"; import { RdDItem } from "./item.js";
import { RdDTimestamp } from "./time/rdd-timestamp.js"; import { RdDTimestamp } from "./rdd-timestamp.js";
import { RdDRaretes } from "./item/raretes.js"; import { RdDRaretes } from "./tirage/raretes.js";
class Migration { class Migration {
get code() { return "sample"; } get code() { return "sample"; }
@ -13,7 +14,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).filter(it => it != undefined); const actorItemUpdates = computeUpdates(actor.items);
if (actorItemUpdates.length > 0) { if (actorItemUpdates.length > 0) {
console.log( console.log(
this.code, this.code,
@ -24,7 +25,7 @@ class Migration {
} }
}); });
const itemUpdates = computeUpdates(game.items).filter(it => it != undefined); const itemUpdates = computeUpdates(game.items);
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,6 +66,7 @@ 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"; }
@ -287,7 +289,7 @@ class _10_3_0_FrequenceEnvironnement extends Migration {
} }
_updatesFrequences(it) { _updatesFrequences(it) {
const rarete = RdDRaretes.byCode(it.system.rarete); const rarete = RdDRaretes.getRarete(it.system.rarete);
return { return {
_id: it.id, _id: it.id,
'system.rarete': undefined, 'system.rarete': undefined,
@ -369,7 +371,6 @@ 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,104 +417,6 @@ 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 [
@ -529,9 +432,6 @@ 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(),
]; ];
} }
@ -548,7 +448,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));

View File

@ -85,7 +85,6 @@ export class Misc {
list.forEach(it => addToObj(obj, it)) list.forEach(it => addToObj(obj, it))
return obj; return obj;
} }
static concat(lists) { static concat(lists) {
return lists.reduce((a, b) => a.concat(b), []); return lists.reduce((a, b) => a.concat(b), []);
} }
@ -119,17 +118,6 @@ 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)];
} }
@ -239,15 +227,4 @@ 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
};
}
} }

View File

@ -8,11 +8,13 @@ export class RdDAlchimie {
/* -------------------------------------------- */ /* -------------------------------------------- */
static processManipulation(recette, actorId = undefined) { static processManipulation(recette, actorId = undefined) {
//console.log("CALLED", recette, recette.isOwned, actorId );
let manip = recette.system.manipulation; let manip = recette.system.manipulation;
let matchArray = manip.match(matchOperations); let matchArray = manip.match(matchOperations);
if (matchArray) { if (matchArray) {
for (let matchStr of matchArray) { for (let matchStr of matchArray) {
let result = matchStr.match(matchOperationTerms); let result = matchStr.match(matchOperationTerms);
//console.log("RESULT ", result);
if (result[1] && result[2]) { if (result[1] && result[2]) {
let commande = Misc.upperFirst(result[1]); let commande = Misc.upperFirst(result[1]);
let replacement = this[`_alchimie${commande}`](recette, result[2], actorId); let replacement = this[`_alchimie${commande}`](recette, result[2], actorId);
@ -25,19 +27,20 @@ export class RdDAlchimie {
/* -------------------------------------------- */ /* -------------------------------------------- */
static _alchimieCouleur(recette, couleurs, actorId) { static _alchimieCouleur(recette, couleurs, actorId) {
return RdDAlchimie._alchimieLink(recette, couleurs, actorId, 'couleur', 'Température'); if (actorId) {
return `<span class="alchimie-tache"><a data-recette-id="${recette._id}" data-actor-id="${actorId}" data-alchimie-tache="couleur" data-alchimie-data="${couleurs}">couleur ${couleurs}</a></span>`;
} else {
return `<span class="alchimie-tache">couleur ${couleurs} </span>`;
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static _alchimieConsistance(recette, consistances, actorId) { static _alchimieConsistance(recette, consistances, actorId) {
return RdDAlchimie._alchimieLink(recette, consistances, actorId, 'consistance', 'Consistance'); if (actorId) {
return `<span class="alchimie-tache"><a data-recette-id="${recette._id}" data-actor-id="${actorId}" data-alchimie-tache="consistance" data-alchimie-data="${consistances}">consistance ${consistances}</a></span>`;
} else {
return `<span class="alchimie-tache">consistance ${consistances} </span>`;
} }
static _alchimieLink(recette, termes, actorId, tacheAlchimie, labelTache) {
const difficulte = RdDAlchimie.getDifficulte(termes);
const link = actorId ? ` <a data-recette-id="${recette._id}" data-actor-id="${actorId}" data-alchimie-tache="${tacheAlchimie}" data-alchimie-data="${termes}">` : '';
const endLink = actorId ? '</a>' : '';
return `<span class="alchimie-tache">${link}${labelTache} ${termes} (${difficulte})${endLink}</span>`;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -0,0 +1,49 @@
/**
* 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);
}
}

View File

@ -0,0 +1,96 @@
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();
}
}

View File

@ -1,5 +1,4 @@
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 },
@ -25,17 +24,11 @@ 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, isEntiteIncarnee = false) { static dmg(rollData, dmgActor, isCauchemar = 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
@ -48,7 +41,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, isEntiteIncarnee) dmg.mortalite = RdDBonus._calculMortalite(rollData, isCauchemar)
} }
return dmg; return dmg;
} }
@ -69,8 +62,11 @@ export class RdDBonus {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static _calculMortalite(rollData, isEntiteIncarnee) { static _calculMortalite(rollData, isCauchemar) {
return isEntiteIncarnee ? "entiteincarnee" if (isCauchemar) {
return "cauchemar";
}
return isCauchemar ? "cauchemar"
: rollData.dmg?.mortalite : rollData.dmg?.mortalite
?? rollData.arme?.system.mortalite ?? rollData.arme?.system.mortalite
?? "mortel"; ?? "mortel";
@ -78,7 +74,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);

View File

@ -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 RdDCalendrierEditor extends Dialog { export class RdDCalendrierEditeur extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
constructor(html, calendrier, calendrierData) { constructor(html, calendrier, calendrierData) {
@ -30,8 +30,8 @@ export class RdDCalendrierEditor 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);
RdDCalendrierEditor.setLimited(this.html.find("input[name='calendar.jourDuMois']"), this.calendrierData.jourDuMois, 1, 28); RdDCalendrierEditeur.setLimited(this.html.find("input[name='calendar.jourDuMois']"), this.calendrierData.jourDuMois, 1, 28);
RdDCalendrierEditor.setLimited(this.html.find("input[name='calendar.minute']"), this.calendrierData.minute, 0, 119); RdDCalendrierEditeur.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) {

505
module/rdd-calendrier.js Normal file
View File

@ -0,0 +1,505 @@
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);
}
}

View File

@ -58,6 +58,15 @@ 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) {
const selectedCarac = rollData.selectedCarac;
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))

View File

@ -1,5 +1,6 @@
import { ChatUtility } from "./chat-utility.js"; import { ChatUtility } from "./chat-utility.js";
import { ENTITE_BLURETTE, HIDE_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE, HIDE_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
import { DialogSelectTarget } from "./dialog-select-target.js";
import { Grammar } from "./grammar.js"; import { Grammar } from "./grammar.js";
import { RdDItemArme } from "./item-arme.js"; import { RdDItemArme } from "./item-arme.js";
import { RdDItemCompetence } from "./item-competence.js"; import { RdDItemCompetence } from "./item-competence.js";
@ -12,7 +13,6 @@ import { RdDRollTables } from "./rdd-rolltables.js";
import { ReglesOptionelles } from "./settings/regles-optionelles.js"; import { ReglesOptionelles } from "./settings/regles-optionelles.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 = [
@ -40,32 +40,35 @@ export class RdDCombatManager extends Combat {
static init() { static init() {
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.on("getCombatTrackerEntryContext", (html, options) => { RdDCombatManager.pushInitiativeOptions(html, options); }); Hooks.on("getCombatTrackerEntryContext", (html, options) => {
Hooks.on("updateCombat", (combat, change, options, userId) => { RdDCombat.onUpdateCombat(combat, change, options, userId) }); RdDCombatManager.pushInitiativeOptions(html, options);
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() {
if (Misc.isUniqueConnectedGM()) {
await this.finDeRound({ terminer: true }); 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);
@ -87,32 +90,19 @@ 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 => RdDItemCompetenceCreature.getCategorieAttaque(it)) const competence = combatant.actor.items.find(it => it.system.iscombat)
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)
let compName = "Corps à corps" const compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.system.competence;
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 && competence.system.defaut_carac) { if (competence) {
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`);
} }
} }
} }
@ -121,10 +111,10 @@ export class RdDCombatManager extends Combat {
if (!roll.total) { if (!roll.total) {
roll.evaluate({ async: false }); roll.evaluate({ async: false });
} }
const total = Math.max(roll.total, 0.00); if (roll.total <= 0) roll.total = 0.00;
console.log("Compute init for", rollFormula, roll, total, combatant); console.log("Compute init for", rollFormula, roll.total, combatant);
let id = combatant._id || combatant.id; let id = combatant._id || combatant.id;
await this.updateEmbeddedDocuments("Combatant", [{ _id: id, initiative: total }]); await this.updateEmbeddedDocuments("Combatant", [{ _id: id, initiative: roll.total }]);
// Send a chat message // Send a chat message
let rollMode = messageOptions.rollMode || game.settings.get("core", "rollMode"); let rollMode = messageOptions.rollMode || game.settings.get("core", "rollMode");
@ -155,8 +145,9 @@ export class RdDCombatManager extends Combat {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static calculInitiative(niveau, caracValue, bonus = 0) { static calculInitiative(niveau, caracValue, bonusEcaille = 0) {
let base = niveau + Math.floor(caracValue / 2) + bonus; let base = niveau + Math.floor(caracValue / 2);
base += bonusEcaille;
return "1d6" + (base >= 0 ? "+" : "") + base; return "1d6" + (base >= 0 ? "+" : "") + base;
} }
@ -230,15 +221,15 @@ export class RdDCombatManager extends Combat {
} }
static listActionsCreature(competences) { static listActionsCreature(competences) {
return competences.map(it => RdDItemCompetenceCreature.armeCreature(it)) return competences.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
.filter(it => it != undefined); .map(it => RdDItemCompetenceCreature.armeNaturelle(it));
} }
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: 'possession', action: 'conjurer',
system: { system: {
competence: p.name, competence: p.name,
possessionid: p.system.possessionid, possessionid: p.system.possessionid,
@ -255,15 +246,15 @@ export class RdDCombatManager extends Combat {
return actions; return actions;
} }
if (actor.isCreatureEntite()) { if (actor.isCreatureEntite()) {
actions = RdDCombatManager.listActionsCreature(actor.itemTypes['competencecreature']); actions = actions.concat(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)) const armes = actor.itemTypes['arme'].filter(it => RdDItemArme.isArmeUtilisable(it))
.concat(RdDItemArme.empoignade()) //.concat(RdDItemArme.empoignade())
.concat(RdDItemArme.mainsNues()); .concat(RdDItemArme.mainsNues());
const competences = actor.itemTypes['competence']; const competences = actor.itemTypes['competence'];
actions = RdDCombatManager.listActionsArmes(armes, competences, actor.system.carac); actions = actions.concat(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" } });
@ -351,7 +342,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 == 'possession') { } else if (action.action == 'conjurer') {
initOffset = 10; initOffset = 10;
caracForInit = combatant.actor.getReveActuel(); caracForInit = combatant.actor.getReveActuel();
initInfo = "Possession" initInfo = "Possession"
@ -430,11 +421,18 @@ 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": return RdDCombat.onMsgEncaisser(sockmsg.data); case "msg_encaisser":
case "msg_defense": return RdDCombat.onMsgDefense(sockmsg.data); return RdDCombat.onMsgEncaisser(sockmsg.data);
case "msg_defense":
return RdDCombat.onMsgDefense(sockmsg.data);
} }
} }
@ -445,6 +443,16 @@ 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()) {
@ -749,14 +757,29 @@ 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') { if (arme.system.cac == 'empoignade' && this.attacker.isCombatTouche()) {
RdDEmpoignade.onAttaqueEmpoignade(this.attacker, this.defender) ChatMessage.create({
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);
@ -790,7 +813,7 @@ export class RdDCombat {
passeArme: randomID(16), passeArme: randomID(16),
mortalite: arme?.system.mortalite, mortalite: arme?.system.mortalite,
coupsNonMortels: false, coupsNonMortels: false,
competence: competence.clone(), competence: competence,
surprise: this.attacker.getSurprise(true), surprise: this.attacker.getSurprise(true),
surpriseDefenseur: this.defender.getSurprise(true), surpriseDefenseur: this.defender.getSurprise(true),
targetToken: Targets.extractTokenData(this.target), targetToken: Targets.extractTokenData(this.target),
@ -948,8 +971,9 @@ 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))
items.forEach(item => item.system.nbUsage = defender.getItemUse(item.id)); // Ajout du # d'utilisation ce round for (let item of items) {
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':
@ -1045,7 +1069,7 @@ export class RdDCombat {
passeArme: attackerRoll.passeArme, passeArme: attackerRoll.passeArme,
diffLibre: attackerRoll.diffLibre, diffLibre: attackerRoll.diffLibre,
attackerRoll: attackerRoll, attackerRoll: attackerRoll,
competence: this.defender.getCompetence(competenceParade).clone(), 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: ReglesOptionelles.isUsing('categorieParade') && RdDItemArme.needParadeSignificative(attackerRoll.arme, armeParade),
@ -1126,7 +1150,7 @@ export class RdDCombat {
passeArme: attackerRoll.passeArme, passeArme: attackerRoll.passeArme,
diffLibre: attackerRoll.diffLibre, diffLibre: attackerRoll.diffLibre,
attackerRoll: attackerRoll, attackerRoll: attackerRoll,
competence: competence.clone(), competence: competence,
surprise: this.defender.getSurprise(true), surprise: this.defender.getSurprise(true),
surpriseDefenseur: this.defender.getSurprise(true), surpriseDefenseur: this.defender.getSurprise(true),
carac: this.defender.system.carac, carac: this.defender.system.carac,
@ -1304,8 +1328,13 @@ export class RdDCombat {
blessuresStatus: actor.computeResumeBlessure(), blessuresStatus: actor.computeResumeBlessure(),
SConst: actor.getSConst(), SConst: actor.getSConst(),
actorId: actor.id, actorId: actor.id,
isGrave: actor.countBlessures(it => it.isGrave()) > 0, isGrave: false,
isCritique: actor.countBlessures(it => it.isCritique()) > 0 isCritique: false
}
if (actor.countBlessuresNonSoigneeByName("critiques") > 0) { // Pour éviter le cumul grave + critique
formData.isCritique = true;
} else if (actor.countBlessuresNonSoigneeByName("graves") > 0) {
formData.isGrave = true;
} }
ChatUtility.createChatWithRollMode(actor.name, { ChatUtility.createChatWithRollMode(actor.name, {

View File

@ -2,8 +2,7 @@
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 { DialogChateauDormant } from "./sommeil/dialog-chateau-dormant.js"; import { DialogStress } from "./dialog-stress.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";
@ -14,6 +13,7 @@ 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";
@ -64,6 +64,7 @@ export class RdDCommands {
<br><strong>/table rencontre deso</strong> affiche la table des rencontres en Désolation <br><strong>/table rencontre deso</strong> affiche la table des rencontres en Désolation
<br><strong>/table rencontre mauvaise</strong> affiche la table des mauvaises rencontres` <br><strong>/table rencontre mauvaise</strong> affiche la table des mauvaises rencontres`
}); });
this.registerCommand({ path: ["/table", "milieu"], func: (content, msg, params) => this.tableMilieu(msg, params, 'liste'), descr: "Affiche la table des ressource naturelles pour un milieu donné" });
this.registerCommand({ path: ["/tirer", "comp"], func: (content, msg, params) => RdDRollTables.getCompetence('chat'), descr: "Tire une compétence au hasard" }); this.registerCommand({ path: ["/tirer", "comp"], func: (content, msg, params) => RdDRollTables.getCompetence('chat'), descr: "Tire une compétence au hasard" });
this.registerCommand({ path: ["/tirer", "queue"], func: (content, msg, params) => RdDRollTables.getQueue('chat'), descr: "Tire une Queue de Dragon" }); this.registerCommand({ path: ["/tirer", "queue"], func: (content, msg, params) => RdDRollTables.getQueue('chat'), descr: "Tire une Queue de Dragon" });
@ -75,9 +76,9 @@ export class RdDCommands {
this.registerCommand({ path: ["/tirer", "ideefixe"], func: (content, msg, params) => RdDRollTables.getIdeeFixe('chat'), descr: "Tire une Idée fixe" }); this.registerCommand({ path: ["/tirer", "ideefixe"], func: (content, msg, params) => RdDRollTables.getIdeeFixe('chat'), descr: "Tire une Idée fixe" });
this.registerCommand({ path: ["/tirer", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant('chat'), descr: "Tire un Désir Lancinant" }); this.registerCommand({ path: ["/tirer", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant('chat'), descr: "Tire un Désir Lancinant" });
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: ["/tirer", "milieu"], func: (content, msg, params) => this.tableMilieu(msg, params, 'chat'), descr: "Effectue un tirage dans la table des ressource naturelles pour un milieu donné" });
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" });
@ -332,7 +333,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.doRollCaracCompetence(caracName, competence.name, diff); await actor.rollCaracCompetence(caracName, competence.name, diff);
} }
} }
return; return;
@ -396,6 +397,32 @@ export class RdDCommands {
return false; return false;
} }
async tableMilieu(msg, params, toChat) {
if (params && params.length > 0) {
const search = Misc.join(params, ' ');
const milieux = await game.system.rdd.environnement.findEnvironnementsLike(search);
if (milieux.length == 0) {
const tous = Object.values(await game.system.rdd.environnement.milieux());
return RdDCommands._chatAnswer(msg, `<strong>Aucun milieu correspondant à '${search}'.</strong>
<br>Milieux disponibles:
<br><ul class="chat-list"><li>${tous.reduce(Misc.joining('</li><li>'))}</li></ul>`);
}
if (milieux.length > 1) {
ui.notifications.warn(`<strong>Plusieurs milieux correspondent à '${search}'</strong>:
<br><ul class="chat-list"><li>${milieux.reduce(Misc.joining('</li><li>'))}</li></ul>`);
}
const tableName = `ressources en ${milieux.reduce(Misc.joining(', '))}`;
if (toChat == 'liste') {
return await game.system.rdd.environnement.searchToChatMessage(milieux, tableName);
}
else {
const row = await game.system.rdd.environnement.getRandom(milieux, tableName);
await CompendiumTableHelpers.tableRowToChatMessage(row, 'Item');
return true;
}
}
return false;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getCoutXpComp(msg, params) { getCoutXpComp(msg, params) {
if (params && (params.length == 1 || params.length == 2)) { if (params && (params.length == 1 || params.length == 2)) {
@ -463,14 +490,13 @@ 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) {
// TODO: ne plus stresser les entités de cauchemar! actor.distribuerStress('stress', stress, motif);
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) {
await actor.distribuerStress('stress', stress, motif); 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,10 +511,7 @@ export class RdDCommands {
} }
async tirage() { async tirage() {
FenetreRechercheTirage.create(); new FenetreRechercheTirage({}).render(true);
}
async sommeil() {
DialogChateauDormant.create();
} }
} }

View File

@ -1,8 +1,8 @@
import { SYSTEM_RDD } from "./constants.js"; import { SYSTEM_RDD } from "./constants.js";
export class RdDCompendiumOrganiser { export class RddCompendiumOrganiser {
static init() { static init() {
Hooks.on('renderCompendium', async (pack, html, compendiumData) => RdDCompendiumOrganiser.onRenderCompendium(pack, html, compendiumData)) Hooks.on('renderCompendium', async (pack, html, compendiumData) => RddCompendiumOrganiser.onRenderCompendium(pack, html, compendiumData))
} }
static async onRenderCompendium(compendium, html, compendiumData) { static async onRenderCompendium(compendium, html, compendiumData) {
@ -10,14 +10,14 @@ export class RdDCompendiumOrganiser {
const pack = compendium.collection const pack = compendium.collection
if (pack.metadata.system === SYSTEM_RDD) { if (pack.metadata.system === SYSTEM_RDD) {
html.find('.directory-item').each((i, element) => { html.find('.directory-item').each((i, element) => {
RdDCompendiumOrganiser.setEntityTypeName(pack, element); RddCompendiumOrganiser.setEntityTypeName(pack, element);
}); });
} }
} }
static async setEntityTypeName(pack, element) { static async setEntityTypeName(pack, element) {
const label = RdDCompendiumOrganiser.getEntityTypeLabel(await pack.getDocument(element.dataset.documentId)); const label = RddCompendiumOrganiser.getEntityTypeLabel(await pack.getDocument(element.dataset.documentId));
RdDCompendiumOrganiser.insertEntityType(element, label); RddCompendiumOrganiser.insertEntityType(element, label);
} }
static insertEntityType(element, label) { static insertEntityType(element, label) {

View File

@ -1,436 +0,0 @@
/* -------------------------------------------- */
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 { ReglesOptionelles } from "./settings/regles-optionelles.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.getCompetence("Corps à corps").clone(),
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.getCompetence("Corps à corps").clone()
}
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).clone(),
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
})
}
}

View File

@ -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 "./time/rdd-timestamp.js"; import { RdDTimestamp } from "./rdd-timestamp.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
export class RdDHerbes extends Item { export class RdDHerbes extends Item {

View File

@ -1,20 +1,16 @@
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
import { Migrations } from './migrations.js'; import { RdDActor } from "./actor.js";
import { RdDItem } from "./item.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 { RdDCalendrier } from "./rdd-calendrier.js";
import { RdDCalendrier } from "./time/rdd-calendrier.js";
import { RdDTimestamp } from "./time/rdd-timestamp.js";
import { DialogChronologie } from "./dialog-chronologie.js";
import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js";
import { RdDTokenHud } from "./rdd-token-hud.js"; import { RdDTokenHud } from "./rdd-token-hud.js";
import { RdDCommands } from "./rdd-commands.js"; import { RdDCommands } from "./rdd-commands.js";
import { RdDCombatManager, RdDCombat } from "./rdd-combat.js"; 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 { ReglesOptionelles } from "./settings/regles-optionelles.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";
@ -22,43 +18,38 @@ import { RdDHerbes } from "./rdd-herbes.js";
import { RdDDice } from "./rdd-dice.js"; import { RdDDice } from "./rdd-dice.js";
import { RdDPossession } from "./rdd-possession.js"; import { RdDPossession } from "./rdd-possession.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { Migrations } from './migrations.js';
import { DialogChronologie } from "./dialog-chronologie.js";
import { SystemCompendiums } from "./settings/system-compendiums.js"; import { SystemCompendiums } from "./settings/system-compendiums.js";
import { Environnement } from "./environnement.js"; import { Environnement } from "./environnement.js";
import { RdDItemService } from "./item/item-service.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 { 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 { RdDCommerce } from "./actor/commerce.js";
import { RdDActorVehiculeSheet } from "./actor-vehicule-sheet.js"; import { RdDTimestamp } from "./rdd-timestamp.js";
import { RdDActorEntiteSheet } from "./actor-entite-sheet.js";
import { RdDItem } from "./item.js";
import { RdDItemBlessure } from "./item/blessure.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";
import { RdDItemSigneDraconique } from "./item/signedraconique.js"; import { RdDItemSigneDraconique } from "./item/item-signedraconique.js";
import { RdDItemQueue } from "./item/queue.js"; import { RdDItemQueue } from "./item/queue.js";
import { RdDItemOmbre } from "./item/ombre.js"; import { RdDItemOmbre } from "./item/ombre.js";
import { RdDItemSouffle } from "./item/souffle.js"; import { RdDItemSouffle } from "./item/souffle.js";
import { RdDRencontre } from "./item/rencontre.js"; import { RdDRencontre } from "./item/item-rencontre.js";
import { RdDActorSheet } from "./actor-sheet.js";
import { RdDActorCreatureSheet } from "./actor-creature-sheet.js";
import { RdDActorVehiculeSheet } from "./actor-vehicule-sheet.js";
import { RdDActorEntiteSheet } from "./actor-entite-sheet.js";
import { RdDItemSheet } from "./item-sheet.js"; import { RdDItemSheet } from "./item-sheet.js";
import { RdDBlessureItemSheet } from "./item/sheet-blessure.js"; import { RdDServiceItemSheet } from "./item-service-sheet.js";
import { RdDServiceItemSheet } from "./item/sheet-service.js"; import { RdDHerbeItemSheet } from "./item-herbe-sheet.js";
import { RdDRencontreItemSheet } from "./item/sheet-rencontre.js"; import { RdDRencontreItemSheet } from "./item-rencontre-sheet.js";
import { RdDHerbeItemSheet } from "./item/sheet-herbe.js"; import { RdDPlanteItemSheet } from "./item-plante-sheet.js";
import { RdDPlanteItemSheet } from "./item/sheet-plante.js"; import { RdDIngredientItemSheet } from "./item-ingredient-sheet.js";
import { RdDIngredientItemSheet } from "./item/sheet-ingredient.js"; import { RdDFauneItemSheet } from "./item-faune-sheet.js";
import { RdDFauneItemSheet } from "./item/sheet-faune.js"; import { RdDConteneurItemSheet } from "./item-conteneur-sheet.js";
import { RdDConteneurItemSheet } from "./item/sheet-conteneur.js"; import { RdDSigneDraconiqueItemSheet } from "./item-signedraconique-sheet.js";
import { RdDSigneDraconiqueItemSheet } from "./item/sheet-signedraconique.js";
import { RdDItemInventaireSheet } from "./item/sheet-base-inventaire.js"; import { TMRRencontres } from "./tmr-rencontres.js";
import { AppAstrologie } from "./sommeil/app-astrologie.js";
import { RdDItemArmure } from "./item/armure.js";
/** /**
* RdD system * RdD system
@ -77,23 +68,21 @@ export class SystemReveDeDragon {
this.RdDUtility = RdDUtility; this.RdDUtility = RdDUtility;
this.RdDHotbar = RdDHotbar; this.RdDHotbar = RdDHotbar;
this.itemClasses = { this.itemClasses = {
armure: RdDItemArmure, service: RdDItemService,
blessure: RdDItemBlessure,
maladie: RdDItemMaladie, maladie: RdDItemMaladie,
ombre: RdDItemOmbre,
poison: RdDItemPoison, poison: RdDItemPoison,
queue: RdDItemQueue, queue: RdDItemQueue,
rencontre: RdDRencontre, ombre: RdDItemOmbre,
service: RdDItemService,
signedraconique: RdDItemSigneDraconique,
souffle: RdDItemSouffle, souffle: RdDItemSouffle,
signedraconique: RdDItemSigneDraconique,
rencontre: RdDRencontre
} }
this.actorClasses = { this.actorClasses = {
commerce: RdDCommerce,
creature: RdDActor, creature: RdDActor,
entite: RdDActor, entite: RdDActor,
personnage: RdDActor, personnage: RdDActor,
vehicule: RdDActor, vehicule: RdDActor,
commerce: RdDCommerce,
} }
} }
@ -102,8 +91,6 @@ 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`);
@ -162,38 +149,33 @@ 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, {
types: [
"objet", "arme", "armure", "livre", "potion", "munition",
"monnaie", "nourritureboisson", "gemme",
], makeDefault: true
});
Items.registerSheet(SYSTEM_RDD, RdDItemSheet, { Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
types: [ types: [
"competence", "competencecreature", "competence", "competencecreature",
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre", "recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
"objet", "arme", "armure", "livre", "potion", "munition",
"monnaie", "nourritureboisson", "gemme",
"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", "empoignade" "tarot", "extraitpoetique"
], makeDefault: true ], makeDefault: true
}); });
CONFIG.Combat.documentClass = RdDCombatManager; CONFIG.Combat.documentClass = RdDCombatManager;
// préparation des différents modules // préparation des différents modules
RdDTimestamp.init(); RdDTimestamp.init();
RdDCalendrier.init();
SystemCompendiums.init(); SystemCompendiums.init();
DialogChronologie.init(); DialogChronologie.init();
ReglesOptionelles.init(); ReglesOptionelles.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();
RdDCompendiumOrganiser.init(); RddCompendiumOrganiser.init();
EffetsDraconiques.init() EffetsDraconiques.init()
TMRUtility.init(); TMRUtility.init();
RdDHotbar.initDropbar(); RdDHotbar.initDropbar();
@ -219,6 +201,25 @@ 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",
@ -264,11 +265,9 @@ 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();
@ -276,7 +275,14 @@ export class SystemReveDeDragon {
RdDDice.onReady(); RdDDice.onReady();
/* -------------------------------------------- */ /* -------------------------------------------- */
/* Affiche/Init le calendrier */ /* Affiche/Init le calendrier */
game.system.rdd.calendrier.display(); let calendrier = new RdDCalendrier();
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 !");
@ -285,6 +291,10 @@ export class SystemReveDeDragon {
user: game.user.id user: game.user.id
}); });
} }
if (Misc.isUniqueConnectedGM()) {
this.messageDeBienvenue();
this.registerUsageCount(SYSTEM_RDD);
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -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 == TYPES.possession && poss.system.victime.actorid == defender.id); let poss = attacker.items.find(poss => poss.type == 'possession' && poss.system.possedeid == defender.id);
if (!poss) { if (!poss) {
poss = defender.items.find(poss => poss.type == TYPES.possession && poss.system.victime.actorid == defender.id); poss = defender.items.find(poss => poss.type == 'possession' && poss.system.possedeid == defender.id);
} }
return poss && duplicate(poss) || undefined; return poss && duplicate(poss) || undefined;
} }
@ -31,40 +31,39 @@ 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: "attaque", mode: "possession",
isECNIDefender: false, isECNIDefender: false,
competence: competence.clone(), competence: competence,
possession: possession, possession: possession,
attacker: attacker, attacker: attacker,
defender: defender, defender: defender,
targetToken: Targets.extractTokenData(target) targetToken: Targets.extractTokenData(target)
}; };
RdDPossession.selectCompetenceDraconicOuPossession(rollData, attacker) if (attacker.isCreatureEntite()) {
RdDItemCompetenceCreature.setRollDataCreature(rollData)
}
await RdDPossession.$rollAttaquePossession(attacker, rollData, isNouvelle); await RdDPossession.$rollAttaquePossession(attacker, rollData, isNouvelle);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async onConjurerPossession(attacker, possession) { static async onConjurerPossession(attacker, competence, 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: "attaque", mode: "possession",
isECNIDefender: true, isECNIDefender: true,
competence: competence,
possession: possession, possession: possession,
attacker: attacker, attacker: attacker,
defender: defender, defender: game.actors.get(possession.system.possesseurid)
}; };
RdDPossession.selectCompetenceDraconicOuPossession(rollData, attacker)
await RdDPossession.$rollAttaquePossession(attacker, rollData); await RdDPossession.$rollAttaquePossession(attacker, rollData);
} }
@ -72,7 +71,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.entite.actorid ?? undefined defenderId = defenderId ?? possession?.system.possesseurid ?? 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;
@ -83,30 +82,20 @@ export class RdDPossession {
possession = duplicate(possession) possession = duplicate(possession)
// Update for draconic roll // Update for draconic roll
let rollData = { let rollData = {
mode: "defense", mode: "conjuration",
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() } }
} }
RdDPossession.selectCompetenceDraconicOuPossession(rollData, defender) rollData.competence.system.defaut_carac = 'reve-actuel'
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) {
const dialog = await RdDRoll.create(attacker, rollData, const dialog = await RdDRoll.create(attacker, rollData,
@ -115,22 +104,21 @@ 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: [
{ action: async (r) => await RdDPossession.$onRollPossession(r, isNouvelle) }, { condition: r => (r.rolled.isSuccess), action: async (r) => await RdDPossession.$onRollPossession(r, true, 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, isNouvelle = false) { static async $onRollPossession(rollData, isSuccess, isNouvelle = false) {
rollData.possession.isSuccess = rollData.rolled.isSuccess; rollData.possession.isSuccess = isSuccess;
RdDPossession.$updateEtatPossession(rollData.possession, rollData); RdDPossession.$updateEtatPossession(rollData.possession);
if (isNouvelle) { if (isNouvelle) {
// Creer la possession sur le defenseur // Creer la possession sur le defenseur
await rollData.defender.createEmbeddedDocuments('Item', [rollData.possession.toObject()]) 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');
} }
@ -139,7 +127,7 @@ 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: 'possession', name: 'conjurer',
label: 'Conjurer une Possession', label: 'Conjurer une Possession',
callbacks: [ callbacks: [
{ action: async (r) => await RdDPossession.$onRollConjuration(r) } { action: async (r) => await RdDPossession.$onRollConjuration(r) }
@ -151,30 +139,23 @@ export class RdDPossession {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async $onRollConjuration(rollData) { static async $onRollConjuration(rollData) {
let victime = game.actors.get(rollData.possession.system.victime.actorid) let actor = game.actors.get(rollData.possession.system.possedeid)
let compteur = rollData.possession.system.compteur
if (!rollData.rolled.isSuccess) { if (!rollData.rolled.isSuccess) {
if (rollData.isECNIDefender) { if (rollData.isECNIDefender) {
compteur-- rollData.possession.system.compteur--
} else { } else {
compteur++ rollData.possession.system.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
victime.deleteEmbeddedDocuments("Item", [rollData.possession._id]) actor.deleteEmbeddedDocuments("Item", [rollData.possession._id])
} }
} }
@ -199,42 +180,12 @@ 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: { system: { description: "", typepossession: attacker.name, possede: false, possessionid: randomID(16), possesseurid: attacker.id, possedeid: defender.id, date: 0, compteur: 0 }
description: "", typepossession: attacker.name,
possede: false,
possessionid: randomID(16),
entite: { actorid: attacker.id },
victime: { actorid: defender.id },
compteur: 0
}
}, },
{ {
temporary: true temporary: true

View File

@ -91,17 +91,13 @@ 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(RdDResolutionTable.actorChatName(actor), { return await ChatUtility.createChatWithRollMode(actor?.userName ?? game.user.name, {
content: await RdDResolutionTable.buildRollDataHtml(rollData, template) content: await RdDResolutionTable.buildRollDataHtml(rollData, actor, template)
}); });
} }
static actorChatName(actor) {
return actor?.userName ?? game.user.name;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async buildRollDataHtml(rollData, template = 'chat-resultat-general.html') { static async buildRollDataHtml(rollData, actor, 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);
} }
@ -199,6 +195,17 @@ 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) {
@ -287,9 +294,12 @@ export class RdDResolutionTable {
carac: carac, carac: carac,
difficulte: level, difficulte: level,
min: minLevel, min: minLevel,
rows: Misc.intArray(minCarac, maxCarac+1), rows: RdDResolutionTable.incrementalArray(minCarac, maxCarac),
cols: Misc.intArray(minLevel, maxLevel+1) cols: RdDResolutionTable.incrementalArray(minLevel, maxLevel)
}); });
} }
static incrementalArray(min, max) {
return Array.from(Array(max-min+1).keys()).map(i=>i+min)
}
} }

View File

@ -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 = "entiteincarnee" dialogConf.default = "cauchemar"
dialogConf.buttons = { dialogConf.buttons = {
"entiteincarnee": { label: "Entité incarnée", callback: html => this.performEncaisser("entiteincarnee") } "cauchemar": { label: "Cauchemar", callback: html => this.performEncaisser("cauchemar") }
} }
} }
@ -70,6 +70,7 @@ 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
} }
}); });

View File

@ -314,8 +314,8 @@ export class RdDRoll extends Dialog {
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(".divAppelAuMoral"), rollData.use.appelAuMoral);
HtmlUtility.showControlWhen(this.html.find(".diffMoral"), rollData.ajustements.moralTotal.used); HtmlUtility.showControlWhen(this.html.find(".diffMoral"), rollData.ajustements.moralTotal.used);
HtmlUtility.showControlWhen(this.html.find(".divAppelAuMoral"), rollData.use.appelAuMoral);
// 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));

View File

@ -1,25 +1,9 @@
import { DialogSplitItem } from "./dialog-split-item.js"; import { DialogSplitItem } from "./dialog-split-item.js";
import { RdDItem } from "./item.js"; import { RdDItem } from "./item.js";
import { SystemCompendiums } from "./settings/system-compendiums.js";
export class RdDSheetUtility { export class RdDSheetUtility {
static mergeDocumentRights(options, document, editable) {
const userRightLevel = game.user.isGM
? CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER
: document.getUserLevel(game.user);
let newOptions = {
isGM: game.user.isGM,
isOwned: document.parent ? true : false,
editable: editable,
cssClass: editable ? "editable" : "locked",
isLimited: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED,
isObserver: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER,
isOwner: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER
}
mergeObject(options, newOptions);
return options;
}
static getItem(event, actor) { static getItem(event, actor) {
return actor.items.get(RdDSheetUtility.getItemId(event)) return actor.items.get(RdDSheetUtility.getItemId(event))
} }
@ -39,7 +23,7 @@ export class RdDSheetUtility {
static async prepareItemDropParameters(destItemId, actor, dragData, objetVersConteneur) { static async prepareItemDropParameters(destItemId, actor, dragData, objetVersConteneur) {
let item = fromUuidSync(dragData.uuid); let item = fromUuidSync(dragData.uuid);
if (item.pack && !item.system) { if (item.pack && !item.system){
item = await RdDItem.getCorrespondingItem(item); item = await RdDItem.getCorrespondingItem(item);
} }
if (actor.canReceive(item)) { if (actor.canReceive(item)) {

View File

@ -1,17 +1,16 @@
import { SHOW_DICE, SYSTEM_RDD } from "../constants.js"; import { SHOW_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } 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";
export const WORLD_TIMESTAMP_SETTING = "calendrier"; export const WORLD_TIMESTAMP_SETTING = "calendrier";
const RDD_JOURS_PAR_AN = 336; //RDD_JOURS_PAR_MOIS * RDD_MOIS_PAR_AN;
const RDD_MOIS_PAR_AN = 12; const RDD_MOIS_PAR_AN = 12;
export const RDD_JOURS_PAR_MOIS = 28; const RDD_JOURS_PAR_MOIS = 28;
export const RDD_HEURES_PAR_JOUR = 12; const RDD_JOURS_PAR_AN = 336; //RDD_JOURS_PAR_MOIS * RDD_MOIS_PAR_AN;
export const MAX_NOMBRE_ASTRAL = 12; const RDD_HEURES_PAR_JOUR = 12;
export const RDD_MINUTES_PAR_HEURES = 120; const RDD_MINUTES_PAR_HEURES = 120;
export const RDD_MINUTES_PAR_JOUR = 1440; //RDD_HEURES_PAR_JOUR * RDD_MINUTES_PAR_HEURES; 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 = [
@ -49,6 +48,10 @@ 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,
@ -60,45 +63,16 @@ export class RdDTimestamp {
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) {
signe = 0;
}
if (Number.isInteger(signe)) { if (Number.isInteger(signe)) {
return DEFINITION_HEURES[signe % RDD_HEURES_PAR_JOUR]; return DEFINITION_HEURES[signe % RDD_HEURES_PAR_JOUR];
} }
@ -109,26 +83,20 @@ 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}" title="${signe.label}"/>` return `<img class="img-signe-heure" src="${signe.webp}" alt="${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) => { }) {
@ -228,14 +196,6 @@ 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 }
/** /**
* Convertit le timestamp en une structure avec les informations utiles * Convertit le timestamp en une structure avec les informations utiles
@ -253,6 +213,13 @@ 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;
@ -260,10 +227,6 @@ 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() {

View File

@ -15,8 +15,9 @@ import { HtmlUtility } from "./html-utility.js";
import { ReglesOptionelles } from "./settings/regles-optionelles.js"; import { ReglesOptionelles } from "./settings/regles-optionelles.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/item-rencontre.js";
import { RdDTimestamp } from "./time/rdd-timestamp.js"; import { RdDCalendrier } from "./rdd-calendrier.js";
import { RdDTimestamp } from "./rdd-timestamp.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -284,12 +285,7 @@ export class RdDTMRDialog extends Dialog {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async onActionRencontre(action, tmr, rencontre) { async onActionRencontre(action, tmr) {
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")
console.error("#612 Rencontre perdue", action, tmr, rencontre, this);
this.currentRencontre = rencontre;
}
switch (action) { switch (action) {
case 'derober': case 'derober':
await this.derober(); await this.derober();
@ -593,7 +589,6 @@ export class RdDTMRDialog extends Dialog {
return await game.system.rdd.rencontresTMR.getRencontreAleatoire(tmr, this.actor.isMauvaiseRencontre()) return await game.system.rdd.rencontresTMR.getRencontreAleatoire(tmr, this.actor.isMauvaiseRencontre())
} else { } else {
this._tellToUser(myRoll + ": Pas de rencontre en " + locTMR); this._tellToUser(myRoll + ": Pas de rencontre en " + locTMR);
return undefined;
} }
} }
@ -804,21 +799,19 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
async declencheSortEnReserve(coord) { async declencheSortEnReserve(coord) {
const sorts = this.getSortsReserve(coord); let 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;
} }
const reserveSecurite = EffetsDraconiques.isReserveEnSecurite(this.actor); if (!EffetsDraconiques.isUrgenceDraconique(this.actor) &&
const reserveExtensible = this.isReserveExtensible(coord); (EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord))) {
if (!EffetsDraconiques.isUrgenceDraconique(this.actor) && (reserveSecurite || reserveExtensible)) { 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>";
const msg = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-demande-declencher-sort.hbs`, { for (let sort of sorts) {
actor: this.actor, 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>`;
sorts: sorts, }
coord: coord, msg += "</ol>";
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)

View File

@ -29,13 +29,12 @@ export class RdDTMRRencontreDialog extends Dialog {
this.toClose = false; this.toClose = false;
this.tmr = tmr; this.tmr = tmr;
this.tmrApp = tmrApp; this.tmrApp = tmrApp;
this.rencontre = rencontre;
this.tmrApp.minimize(); this.tmrApp.minimize();
} }
async onButtonAction(action) { async onButtonAction(action) {
this.toClose = true; this.toClose = true;
this.tmrApp.onActionRencontre(action, this.tmr, this.rencontre) this.tmrApp.onActionRencontre(action, this.tmr)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -2,7 +2,6 @@
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 {
@ -19,39 +18,29 @@ export class RdDTokenHud {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async addExtensionHud(app, html, tokenId, isCombat) { static async addExtensionHud(app, html, tokenId) {
let token = canvas.tokens.get(tokenId); let token = canvas.tokens.get(tokenId);
let actor = token.actor; let actor = token.actor;
app.hasExtension = true;
// soins
await RdDTokenHud.addExtensionHudSoins(html, actor);
if (isCombat) {
let combatant = game.combat.combatants.find(c => c.tokenId == tokenId); let combatant = game.combat.combatants.find(c => c.tokenId == tokenId);
if (!(combatant?.actor)) { 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); app.hasExtension = true;
// initiative
await RdDTokenHud.addExtensionHudInit(html, combatant, actions);
// combat
await RdDTokenHud.addExtensionHudCombat(html, combatant, actions);
}
let actionsCombat = RdDCombatManager.listActionsCombat(combatant);
}
static async addExtensionHudInit(html, combatant, actions) {
const hudData = { const hudData = {
combatant, actions, combatant: combatant,
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,
@ -62,47 +51,26 @@ 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 = hudData.actions[index]; let action = actionsCombat[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 = hudData.actions[actionIndex]; const action = actionsCombat[actionIndex];
const possession = action.action == 'possession' ? combatant.actor.getPossession(action.system.possessionid) : undefined; if (action.action == 'conjurer') {
if (possession) { actor.conjurerPossession(actor.getPossession(action.system.possessionid));
combatant.actor.conjurerPossession(possession);
} }
else { else {
combatant.actor.rollArme(action); 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);
@ -115,17 +83,16 @@ export class RdDTokenHud {
/* -------------------------------------------- */ /* -------------------------------------------- */
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]');
if (controlIconCombat.length > 0) {
controlIconCombat.click(event => { controlIconCombat.click(event => {
if (event.currentTarget.className.includes('active')) { if (event.currentTarget.className.includes('active')) {
RdDTokenHud.removeExtensionHud(app, html, tokenId); RdDTokenHud.removeExtensionHud(app, html, tokenId);
} else { } else {
setTimeout(() => RdDTokenHud.addExtensionHud(app, html, tokenId), 200); setTimeout(function () { RdDTokenHud.addExtensionHud(app, html, tokenId) }, 200);
} }
}); });
const isCombat = controlIconCombat[0].className.includes('active'); if (controlIconCombat.length>0 && controlIconCombat[0].className.includes('active')) {
RdDTokenHud.addExtensionHud(app, html, tokenId, isCombat); RdDTokenHud.addExtensionHud(app, html, tokenId);
} }
} }

View File

@ -8,22 +8,22 @@ import { DialogItemAchat } from "./dialog-item-achat.js";
import { ReglesOptionelles } from "./settings/regles-optionelles.js"; import { ReglesOptionelles } from "./settings/regles-optionelles.js";
import { RdDDice } from "./rdd-dice.js"; import { RdDDice } from "./rdd-dice.js";
import { RdDItem } from "./item.js"; import { RdDItem } from "./item.js";
import { Monnaie } from "./item-monnaie.js";
import { RdDPossession } from "./rdd-possession.js"; import { RdDPossession } from "./rdd-possession.js";
import { RdDNameGen } from "./rdd-namegen.js"; import { RdDNameGen } from "./rdd-namegen.js";
import { RdDConfirm } from "./rdd-confirm.js"; import { RdDConfirm } from "./rdd-confirm.js";
import { Environnement } from "./environnement.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 "./time/rdd-timestamp.js"; import { RdDTimestamp } from "./rdd-timestamp.js";
import { RdDRaretes } from "./item/raretes.js"; import { RdDRaretes } from "./tirage/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 = Misc.intArray(0, -11); const difficultesLibres = [0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10];
const ajustementsConditions = Misc.intArray(-10, 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 ajustementsEncaissement = Misc.intArray(-10, 26); 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];
/* -------------------------------------------- */ /* -------------------------------------------- */
function _buildAllSegmentsFatigue(max) { function _buildAllSegmentsFatigue(max) {
@ -68,31 +68,38 @@ 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", gravite: -1}, { minimum: undefined, maximum: 0, endurance: "0", vie: "0", eraflures: 0, legeres: 0, graves: 0, critiques: 0 },
{ minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0}, { minimum: 1, maximum: 10, endurance: "1d4", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
{ minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 2}, { minimum: 11, maximum: 15, endurance: "1d6", vie: "0", eraflures: 0, legeres: 1, graves: 0, critiques: 0 },
{ minimum: 16, maximum: 19, endurance: "2d6", vie: "2", gravite: 4}, { minimum: 16, maximum: 19, endurance: "2d6", vie: "2", eraflures: 0, legeres: 0, graves: 1, critiques: 0 },
{ minimum: 20, maximum: undefined, endurance: "100", vie: "4 + @over20", gravite: 6}, { minimum: 20, maximum: undefined, endurance: "100", vie: "4 + @over20", eraflures: 0, legeres: 0, graves: 0, critiques: 1 },
], ],
"non-mortel": [ "non-mortel": [
{ minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1}, { minimum: undefined, maximum: 0, endurance: "0", vie: "0", eraflures: 0, legeres: 0, graves: 0, critiques: 0 },
{ minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0 }, { minimum: 1, maximum: 10, endurance: "1d4", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
{ minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 0 }, { minimum: 11, maximum: 15, endurance: "1d6", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
{ minimum: 16, maximum: 19, endurance: "2d6", vie: "0", gravite: 2 }, { minimum: 16, maximum: 19, endurance: "2d6", vie: "0", eraflures: 0, legeres: 1, graves: 0, critiques: 0 },
{ minimum: 20, maximum: undefined, endurance: "100", vie: "0", gravite: 2 }, { minimum: 20, maximum: undefined, endurance: "100", vie: "0", eraflures: 0, legeres: 1, graves: 0, critiques: 0 },
], ],
"entiteincarnee": [ "cauchemar": [
{ minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1}, { minimum: undefined, maximum: 0, endurance: "0", vie: "0", eraflures: 0, legeres: 0, graves: 0, critiques: 0 },
{ minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0}, { minimum: 1, maximum: 10, endurance: "1d4", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
{ minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 0 }, { minimum: 11, maximum: 15, endurance: "1d6", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
{ minimum: 16, maximum: 19, endurance: "2d6", vie: "0", gravite: 0 }, { minimum: 16, maximum: 19, endurance: "2d6", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
{ minimum: 20, maximum: undefined, endurance: "3d6 + @over20", vie: "0", gravite: 0 }, { minimum: 20, maximum: undefined, endurance: "3d6 + @over20", vie: "0", eraflures: 1, legeres: 0, graves: 0, critiques: 0 },
] ]
}; };
@ -134,10 +141,9 @@ 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.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/blessure.html',
'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',
@ -145,7 +151,6 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/actor/jeux.html', 'systems/foundryvtt-reve-de-dragon/templates/actor/jeux.html',
'systems/foundryvtt-reve-de-dragon/templates/actor/alchimie.html', 'systems/foundryvtt-reve-de-dragon/templates/actor/alchimie.html',
'systems/foundryvtt-reve-de-dragon/templates/actor/astrologie.html', 'systems/foundryvtt-reve-de-dragon/templates/actor/astrologie.html',
'systems/foundryvtt-reve-de-dragon/templates/actor/chirurgie.html',
'systems/foundryvtt-reve-de-dragon/templates/actor/non-haut-revant.html', 'systems/foundryvtt-reve-de-dragon/templates/actor/non-haut-revant.html',
'systems/foundryvtt-reve-de-dragon/templates/actor/haut-revant.html', 'systems/foundryvtt-reve-de-dragon/templates/actor/haut-revant.html',
'systems/foundryvtt-reve-de-dragon/templates/actor/dragon-queues.html', 'systems/foundryvtt-reve-de-dragon/templates/actor/dragon-queues.html',
@ -182,7 +187,7 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/enum-caracteristiques.html', '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-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-categories.html', 'systems/foundryvtt-reve-de-dragon/templates/enum-categorie-competence.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',
@ -198,8 +203,7 @@ export class RdDUtility {
'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-tmr-effet.html', 'systems/foundryvtt-reve-de-dragon/templates/enum-tmr-effet.html',
// Partials // Partials
'systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats-recherche.hbs', 'systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats.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',
@ -231,10 +235,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/sommeil/sommeil-actor-moral.hbs', 'systems/foundryvtt-reve-de-dragon/templates/dialog-astrologie-joueur.html',
'systems/foundryvtt-reve-de-dragon/templates/sommeil/astrologie-gardien.hbs', // Calendrier
'systems/foundryvtt-reve-de-dragon/templates/sommeil/astrologie-joueur.hbs', 'systems/foundryvtt-reve-de-dragon/templates/calendar-template.html',
'systems/foundryvtt-reve-de-dragon/templates/sommeil/astrologie-theme.hbs', 'systems/foundryvtt-reve-de-dragon/templates/calendar-editor-template.html',
// 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',
@ -243,6 +247,20 @@ 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-demande-attaque-particuliere.html',
'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-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',
@ -256,15 +274,13 @@ 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() ?? ''); Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL');
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));
Handlebars.registerHelper('accord', (genre, ...args) => Grammar.accord(genre, args)); Handlebars.registerHelper('accord', (genre, ...args) => Grammar.accord(genre, args));
Handlebars.registerHelper('buildLigneInventaire', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildLigneInventaire(item, options)); }); Handlebars.registerHelper('buildConteneur', (objet, templateItem, options) => { return new Handlebars.SafeString(RdDUtility.buildConteneur(objet, 1, templateItem, options)); });
Handlebars.registerHelper('buildInventaireConteneur', (actorId, itemId, options) => { return new Handlebars.SafeString(RdDUtility.buildInventaireConteneur(actorId, itemId, options)); }); Handlebars.registerHelper('buildContenu', (objet) => { return new Handlebars.SafeString(RdDUtility.buildContenu(objet, 1, true)); });
Handlebars.registerHelper('buildContenuConteneur', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildContenuConteneur(item, options)); });
Handlebars.registerHelper('calculerPrixCommercant', item => item.calculerPrixCommercant()); Handlebars.registerHelper('calculerPrixCommercant', item => item.calculerPrixCommercant());
Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord)); Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord));
Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord)); Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord));
@ -285,9 +301,6 @@ export class RdDUtility {
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);
} }
@ -339,13 +352,13 @@ export class RdDUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static buildArbreDeConteneurs(conteneurs, inventaires) { static buildArbreDeConteneurs(conteneurs, objets) {
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 = inventaires.find(objet => (id == objet._id)); let objet = objets.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;
@ -354,20 +367,20 @@ export class RdDUtility {
} }
} }
for (let conteneur of conteneurs) { for (let conteneur of conteneurs) {
conteneur.system.encTotal = RdDUtility.calculEncContenu(conteneur, inventaires); conteneur.system.encTotal = RdDUtility.calculEncContenu(conteneur, objets);
} }
return objetVersConteneur; return objetVersConteneur;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static calculEncContenu(conteneur, inventaires) { static calculEncContenu(conteneur, objets) {
const contenus = (conteneur.system.contenu ?? []).filter(id => id != undefined) const contenus = (conteneur.system.contenu ?? []).filter(id => id != undefined)
.map(id => inventaires.find(it => (id == it.id))) .map(id => objets.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, inventaires); enc += RdDUtility.calculEncContenu(contenu, objets);
} }
else { else {
enc += Number(contenu.system.encombrement ?? 0) * Number(contenu.system.quantite ?? 1) enc += Number(contenu.system.encombrement ?? 0) * Number(contenu.system.quantite ?? 1)
@ -382,64 +395,40 @@ export class RdDUtility {
return conteneurs.filter((conteneur, index, arr) => !conteneur.estContenu); return conteneurs.filter((conteneur, index, arr) => !conteneur.estContenu);
} }
static prepareOptionsArbreInventaire(item, optionsArbre) {
if (!optionsArbre.profondeur) {
optionsArbre.profondeur = 1
};
if (!optionsArbre.templateItem) {
optionsArbre.templateItem = item.parent?.type == 'commerce'
? "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire-item.html"
: "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-item.html";
}
item.niveau = optionsArbre.profondeur;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
/** Construit la structure récursive des conteneurs, avec imbrication potentielle
/** *
* Construit la structure récursive des conteneurs, avec imbrication potentielle
*/ */
static buildLigneInventaire(item, options = {}, optionsArbre = { ouvert: false, profondeur: 1 }) { static buildConteneur(objet, profondeur, templateItem, options) {
RdDUtility.prepareOptionsArbreInventaire(item, optionsArbre); if (!profondeur) profondeur = 1;
if (!templateItem) templateItem = 'actor/inventaire-item.html'
objet.niveau = profondeur;
const isConteneur = item.type == 'conteneur'; const isConteneur = objet.type == 'conteneur';
const inventaire = { const isOuvert = isConteneur && this.getAfficheContenu(objet._id);
item: item, const isVide = isConteneur && objet.system.contenu.length == 0;
vide: isConteneur && item.system.contenu.length == 0, const conteneur = Handlebars.partials[`systems/foundryvtt-reve-de-dragon/templates/${templateItem}`]({
ouvert: isConteneur && RdDUtility.getAfficheContenu(item._id), item: objet,
vide: isVide,
ouvert: isOuvert,
options: options options: options
}; });
optionsArbre.ouvert = inventaire.ouvert const contenu = isConteneur ? RdDUtility.buildContenu(objet, profondeur, isOuvert, templateItem, options) : '';
const ligneObjet = Handlebars.partials[optionsArbre.templateItem](inventaire); return conteneur + contenu;
if (isConteneur) {
return ligneObjet + RdDUtility.buildContenuConteneur(item, options, optionsArbre);
}
return ligneObjet;
}
static buildInventaireConteneur(actorId, itemId, options) {
const actor = game.actors.get(actorId)
const item = actor?.items.get(itemId)
if (item) {
return RdDUtility.buildContenuConteneur(item, options, { ouvert: true, profondeur: 1 });
}
return '';
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static buildContenuConteneur(conteneur, options = {}, optionsArbre = {}) { static buildContenu(objet, profondeur, afficherContenu, templateItem, options) {
RdDUtility.prepareOptionsArbreInventaire(conteneur, optionsArbre); if (!profondeur) profondeur = 1;
const display = optionsArbre.ouvert ? 'item-display-show' : 'item-display-hide'; if (!templateItem) templateItem = 'actor/inventaire-item.html'
const profondeur = optionsArbre.profondeur; objet.niveau = profondeur;
optionsArbre.profondeur++;
const lignesContenu = conteneur.subItems.sort(Misc.ascending(it => it.name))
.map(contenu => this.buildLigneInventaire(contenu, options, optionsArbre));
return `<ul class='item-list alterne-list ${display} list-item-margin${Math.min(profondeur, 6)}'>`
+ lignesContenu.reduce(Misc.joining(''), '')
+ "</ul>";
const display = afficherContenu ? 'item-display-show' : 'item-display-hide';
let strContenu = `<ul class='item-list alterne-list ${display} list-item-margin${Math.min(profondeur, 6)}'>`;
for (let subItem of objet.subItems) {
strContenu += this.buildConteneur(subItem, profondeur + 1, templateItem, options);
}
return strContenu + "</ul>";
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -456,6 +445,10 @@ export class RdDUtility {
return ajustementsEncaissement; return ajustementsEncaissement;
} }
static getDefinitionsBlessures() {
return definitionsBlessures;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static getSegmentsFatigue(maxEnd) { static getSegmentsFatigue(maxEnd) {
maxEnd = Math.max(maxEnd, 1); maxEnd = Math.max(maxEnd, 1);
@ -596,10 +589,17 @@ 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;
} }
@ -668,7 +668,6 @@ 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 => {
@ -827,13 +826,17 @@ export class RdDUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static confirmerSuppressionSubacteur(sheet, subActor, htmlToDelete, onSuppression = ()=>{}) { static confirmerSuppressionSubacteur(sheet, subActor, htmlToDelete) {
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: onSuppression onAction: () => {
console.log('Delete : ', subActor.id);
sheet.actor.removeSubacteur(subActor.id);
RdDUtility.slideOnDelete(sheet, htmlToDelete);
}
}) })
} }

View File

@ -5,7 +5,6 @@ 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 { ReglesOptionelles } from "./settings/regles-optionelles.js";
@ -31,7 +30,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 ?? RdDPossession.isDefensePossession(rollData) ? 'Imposée' : 'Libre', getLabel: (rollData, actor) => rollData.selectedSort?.name ?? rollData.attackerRoll ? '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
@ -52,7 +51,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) => !RollDataAjustements.isIgnoreEtatGeneral(rollData), isUsed: (rollData, actor) => !RdDCarac.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 })
}, },
@ -140,12 +139,6 @@ 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,
} }
} }
@ -178,11 +171,4 @@ 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);
}
} }

View File

@ -17,7 +17,6 @@ const listeReglesOptionelles = [
{ 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: '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: '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: 'Règles générales', name: 'afficher-colonnes-reussite', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false },
{ group: 'Règles générales', name: 'chateau-dormant-gardien', descr: "Saisie des heures de sommeil/jets de moral par le gardien des rêves", default: true },
{ group: 'Confirmations', name: 'confirmer-combat-sans-cible', descr: "Confirmer avant une attaque sans cible", scope: "client"}, { 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-tmr', descr: "Confirmer pour monter dans les TMR", scope: "client"},

View File

@ -52,16 +52,12 @@ export class SystemCompendiums extends FormApplication {
} }
static getPack(compendium) { static getPack(compendium) {
const pack = game.packs.get(compendium);
if (pack) {
return pack;
}
return game.packs.get(SystemCompendiums.getCompendium(compendium)) ?? game.packs.get(SystemCompendiums._getDefaultCompendium(compendium)); return game.packs.get(SystemCompendiums.getCompendium(compendium)) ?? game.packs.get(SystemCompendiums._getDefaultCompendium(compendium));
} }
static async getPackContent(compendium, docType) { static async getPackContent(compendium, docType) {
const pack = SystemCompendiums.getPack(compendium); const pack = SystemCompendiums.getPack(compendium);
if (pack?.metadata.type == docType) { if (pack.metadata.type == docType) {
return await pack.getDocuments(); return await pack.getDocuments();
} }
return []; return [];
@ -191,7 +187,7 @@ export class CompendiumTable {
async getContent(itemFrequence = it => it.system.frequence, filter = it => true) { async getContent(itemFrequence = it => it.system.frequence, filter = it => true) {
return await SystemCompendiums.getContent(this.compendium, return await SystemCompendiums.getContent(this.compendium,
this.type, this.type,
it => (!this.subTypes || this.subTypes.includes(it.type)) && itemFrequence(it) > 0 && filter(it), it => (!this.subTypes || this.subTypes.includes(it.type)) && filter(it),
itemFrequence, itemFrequence,
this.sorting); this.sorting);
} }

View File

@ -1,206 +0,0 @@
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.rebuildNombresAstraux());
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 rebuildNombresAstraux() {
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)
}
}

View File

@ -1,105 +0,0 @@
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',
}
};
}
}

View File

@ -1,87 +0,0 @@
import { ReglesOptionelles } from "../settings/regles-optionelles.js";
import { EffetsDraconiques } from "../tmr/effets-draconiques.js";
export class DialogRepos extends Dialog {
static async create(actor) {
if (!actor.isPersonnage()) {
return
}
if (!ReglesOptionelles.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));
}
}

View File

@ -39,18 +39,18 @@ export class Targets {
} }
} }
static getTarget(options = { warn: true }) { static getTarget() {
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:
if (options.warn) ui.notifications.warn("Vous devez choisir une cible à attaquer!"); ui.notifications.warn("Vous devez choisir une cible à attaquer!");
break; break;
default: default:
if (options.warn) ui.notifications.warn("Vous devez choisir une cible (et <strong>une seule</strong>) à attaquer!"); ui.notifications.warn("Vous devez choisir une cible (et <strong>une seule</strong>) à attaquer!");
return;
} }
return undefined;
} }
} }

View File

@ -1,453 +0,0 @@
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, SHOW_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "../constants.js";
import { ReglesOptionelles } from "../settings/regles-optionelles.js";
import { DialogChateauDormant } from "../sommeil/dialog-chateau-dormant.js";
import { APP_ASTROLOGIE_REFRESH, AppAstrologie } from "../sommeil/app-astrologie.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(HIDE_DICE); // 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() {
const pos = this.getSavePosition()
this.render(true, { left: pos.left, top: pos.top });
return this;
}
_getHeaderButtons() {
const buttons = [];
if (game.user.isGM) {
buttons.unshift({
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 buttons
}
async maximize() {
await super.maximize()
this.render(true)
}
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;
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('.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, 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
}
}
/* -------------------------------------------- */
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(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.nombresAstraux.find(n => n.index == dayIndex);
if (na) {
newList[i] = na;
} else {
newList[i] = await this.ajouterNombreAstral(dayIndex, showDice);
}
}
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 && ReglesOptionelles.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();
}
}

View File

@ -1,14 +1,14 @@
import { RdDItem } from '../item.js'; import { RdDItem } from '../item.js';
import { HtmlUtility } from '../html-utility.js'; import { HtmlUtility } from '../html-utility.js';
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { CompendiumTableHelpers } from '../settings/system-compendiums.js'; import { CompendiumTable, CompendiumTableHelpers, SystemCompendiums } from '../settings/system-compendiums.js';
import { RdDRaretes } from '../item/raretes.js'; import { RdDRaretes } from './raretes.js';
import { Grammar } from '../grammar.js';
const FILTER_GROUPS = [ const FILTER_GROUPS = [
{ group: 'type', label: "Type d'objet" }, { group: 'type', label: "Type d'objet" },
{ group: 'comestible', label: 'Alimentaire' }, { group: 'comestible', label: 'Alimentaire' },
{ group: 'utilisation', label: 'Utilisation' }, { group: 'categorie', label: 'Utilisation' },
{ group: 'milieu', label: 'Milieu' },
{ group: 'rarete', label: 'Rarete' }, { group: 'rarete', label: 'Rarete' },
{ group: 'qualite', label: 'Qualité' }, { group: 'qualite', label: 'Qualité' },
{ group: 'enc', label: 'Encombrement' }, { group: 'enc', label: 'Encombrement' },
@ -16,106 +16,42 @@ const FILTER_GROUPS = [
] ]
const FILTERS = [ const FILTERS = [
{ group: 'comestible', code: 'comestible', label: 'Comestible', check: (item, milieux) => item.getUtilisation() == 'cuisine' }, { group: 'comestible', code: 'pret', label: 'Préparé', check: item => item.getUtilisationCuisine() == 'pret' },
{ group: 'comestible', code: 'pret', label: 'Préparé', check: (item, milieux) => item.getUtilisationCuisine() == 'pret' }, { group: 'comestible', code: 'comestible', label: 'Comestible', check: item => item.getUtilisation() == 'cuisine' },
{ group: 'comestible', code: 'brut', label: 'A préparer', check: (item, milieux) => item.getUtilisationCuisine() == 'brut' }, { group: 'comestible', code: 'boisson', label: 'Boisson', check: item => item.isNourritureBoisson() && item.system.boisson },
{ group: 'comestible', code: 'boisson', label: 'Boisson', check: (item, milieux) => item.isBoisson() }, { group: 'comestible', code: 'alcool', label: 'Alcool', check: item => item.isAlcool() },
{ group: 'comestible', code: 'alcool', label: 'Alcool', check: (item, milieux) => item.isAlcool() }, { group: 'comestible', code: 'brut', label: 'A préparer', check: item => item.getUtilisationCuisine() == 'brut' },
{ group: 'comestible', code: 'immangeable', label: 'Immangeable', check: (item, milieux) => item.isInventaire() && item.getUtilisation() != 'cuisine' }, { group: 'comestible', code: 'non', label: 'Immangeable', check: item => item.isEnvironnement() && !item.getUtilisationCuisine() },
{ group: 'utilisation', code: 'alchimie', label: 'Alchimique', check: (item, milieux) => item.isInventaire() && item.getUtilisation() == 'alchimie' }, { group: 'categorie', code: 'alchimie', label: 'Alchimique', check: item => item.isEnvironnement() && item.getUtilisation() == 'alchimie' },
{ group: 'utilisation', code: 'soins', label: 'Médical', check: (item, milieux) => item.isInventaire() && item.getUtilisation() == 'soins' }, { group: 'categorie', code: 'cuisine', label: 'Cuisine', check: item => item.isEnvironnement() && item.getUtilisation() == 'cuisine' },
{ group: 'utilisation', code: 'poison', label: 'Toxique', check: (item, milieux) => item.isInventaire() && item.getUtilisation() == 'poison' }, { group: 'categorie', code: 'soins', label: 'Médical', check: item => item.isEnvironnement() && item.getUtilisation() == 'soins' },
{ group: 'utilisation', code: 'cuisine', label: 'Cuisine', check: (item, milieux) => item.isInventaire() && item.getUtilisation() == 'cuisine' }, { group: 'categorie', code: 'cpoison', label: 'Toxique', check: item => item.isEnvironnement() && item.getUtilisation() == 'poison' },
{ group: 'utilisation', code: 'autres', label: 'Autres/inconnu', check: (item, milieux) => !item.isInventaire() || item.getUtilisation() == '' }, { group: 'categorie', code: 'autres', label: 'Autres', check: item => !item.isEnvironnement() || item.getUtilisation() == '' },
{ group: "qualite", code: "mauvaise", label: "Mauvaise (négative)", check: (item, milieux) => item.isInventaire() && item.system.qualite < 0 }, { group: "qualite", code: "mauvaise", label: "Mauvaise (négative)", check: item => item.isInventaire() && item.system.qualite < 0 },
{ group: "qualite", code: "quelconque", label: "Quelconque (0)", check: (item, milieux) => item.isInventaire() && item.system.qualite == 0 }, { group: "qualite", code: "quelconque", label: "Quelconque (0)", check: item => item.isInventaire() && item.system.qualite == 0 },
{ group: "qualite", code: "correcte", label: "Correcte (1-3)", check: (item, milieux) => item.isInventaire() && 1 <= item.system.qualite && item.system.qualite <= 3 }, { group: "qualite", code: "correcte", label: "Correcte (1-3)", check: item => item.isInventaire() && 1 <= item.system.qualite && item.system.qualite <= 3 },
{ group: "qualite", code: "bonne", label: "Bonne (4-6)", check: (item, milieux) => item.isInventaire() && 4 <= item.system.qualite && item.system.qualite <= 6 }, { group: "qualite", code: "bonne", label: "Bonne (4-6)", check: item => item.isInventaire() && 4 <= item.system.qualite && item.system.qualite <= 6 },
{ group: "qualite", code: "excellente", label: "Excellente (7-9)", check: (item, milieux) => item.isInventaire() && 7 <= item.system.qualite && item.system.qualite <= 9 }, { group: "qualite", code: "excellente", label: "Excellente (7-9)", check: item => item.isInventaire() && 7 <= item.system.qualite && item.system.qualite <= 9 },
{ group: "qualite", code: "mythique", label: "Mythique (10+)", check: (item, milieux) => item.isInventaire() && 10 <= item.system.qualite }, { group: "qualite", code: "mythique", label: "Mythique (10+)", check: item => item.isInventaire() && 10 <= item.system.qualite },
{ group: "enc", code: "negligeable", label: "Négligeable (jusqu'à 0.1)", check: (item, milieux) => item.isInventaire() && item.system.encombrement <= 0.1 }, { group: "enc", code: "negligeable", label: "Négligeable (jusqu'à 0.1)", check: item => item.isInventaire() && item.system.encombrement <= 0.1 },
{ group: "enc", code: "leger", label: "Léger (0.1 à 0.5)", check: (item, milieux) => item.isInventaire() && 0.1 < item.system.encombrement && item.system.encombrement <= 0.5 }, { group: "enc", code: "leger", label: "Léger (0.1 à 0.5)", check: item => item.isInventaire() && 0.1 < item.system.encombrement && item.system.encombrement <= 0.5 },
{ group: "enc", code: "moyen", label: "Moyen (0.5 à 1.5)", check: (item, milieux) => item.isInventaire() && 0.5 < item.system.encombrement && item.system.encombrement <= 1.5 }, { group: "enc", code: "moyen", label: "Moyen (0.5 à 1.5)", check: item => item.isInventaire() && 0.5 < item.system.encombrement && item.system.encombrement <= 1.5 },
{ group: "enc", code: "lourd", label: "Lourd (1.5 à 3)", check: (item, milieux) => item.isInventaire() && 1.5 < item.system.encombrement && item.system.encombrement <= 3 }, { group: "enc", code: "lourd", label: "Lourd (1.5 à 3)", check: item => item.isInventaire() && 1.5 < item.system.encombrement && item.system.encombrement <= 3 },
{ group: "enc", code: "massif", label: "Massif (3 à 10)", check: (item, milieux) => item.isInventaire() && 3 < item.system.encombrement && item.system.encombrement <= 10 }, { group: "enc", code: "massif", label: "Massif (3 à 10)", check: item => item.isInventaire() && 3 < item.system.encombrement && item.system.encombrement <= 10 },
{ group: "enc", code: "anemort", label: "Un âne mort (plus de 10)", check: (item, milieux) => item.isInventaire() && 10 < item.system.encombrement }, { group: "enc", code: "anemort", label: "Un âne mort (plus de 10)", check: item => item.isInventaire() && 10 < item.system.encombrement },
{ group: "prix", code: "gratuit", label: "Gratuit", check: (item, milieux) => item.isInventaire() && item.system.cout == 0 }, { group: "prix", code: "gratuit", label: "Gratuit", check: item => item.isInventaire() && item.system.cout == 0 },
{ group: "prix", code: "deniers", label: "Deniers (étain)", check: (item, milieux) => item.isInventaire() && 0 < item.system.cout && item.system.cout < 0.1 }, { group: "prix", code: "deniers", label: "Deniers (étain) 1-9", check: item => item.isInventaire() && 0 < item.system.cout && item.system.cout < 0.1 },
{ group: "prix", code: "bronze", label: "Sous (bronze)", check: (item, milieux) => item.isInventaire() && 0.1 <= item.system.cout && item.system.cout < 1 }, { group: "prix", code: "bronze", label: "Bronzes 1-9", check: item => item.isInventaire() && 0.1 <= item.system.cout && item.system.cout < 1 },
{ group: "prix", code: "sols", label: "Sols (argent)", check: (item, milieux) => item.isInventaire() && 1 <= item.system.cout && item.system.cout < 10 }, { group: "prix", code: "sols", label: "Sols (argent) 1-9", check: item => item.isInventaire() && 1 <= item.system.cout && item.system.cout < 10 },
{ group: "prix", code: "dragons", label: "Dragons (or)", check: (item, milieux) => item.isInventaire() && 10 <= item.system.cout }, { group: "prix", code: "dragons", label: "Dragons (or) 1+ ", check: item => item.isInventaire() && 10 <= item.system.cout },
] ]
function $filterMilieux(milieux) {
return milieux.map(m => {
return {
code: m,
label: m,
check: (item, milieux) => item.isPresentDansMilieux(m)
}
})
}
function $filterRarete() {
return RdDRaretes.raretes()
.filter(it => it.frequence > 0)
.map(r => {
return {
group: 'rarete',
code: r.code,
label: r.label,
check: (item, milieux) => item.getRaretes(milieux).map(it => it.code).includes(r.code)
}
});
}
function $filterTypes() {
return RdDItem.getItemTypesInventaire().map(type => {
return {
group: 'type',
code: type,
label: Misc.typeName('Item', type),
check: (item, milieux) => item.type == type
};
});
}
function $getAllFilters() {
return FILTERS
.concat($filterTypes())
.concat($filterRarete());
}
function $addFilterToGroup(groups, filter) {
if (filter.group && filter.code && filter.label) {
let fg = groups.find(g => g.group == filter.group);
if (fg == undefined) {
groups.push({ group: filter.group, label: filter.group, filters: [filter] })
}
else if (fg.filters == undefined) {
fg.filters = [filter];
}
else {
fg.filters.push(filter);
}
}
else {
console.warn("Filtre incorrect, pas de groupe/code/label", filter);
}
}
function $loadFilters(parameters) {
$getAllFilters(parameters.milieux).forEach(f => $addFilterToGroup(parameters.filterGroups, f));
}
export class FenetreRechercheTirage extends Application { export class FenetreRechercheTirage extends Application {
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return mergeObject(super.defaultOptions, {
template: "systems/foundryvtt-reve-de-dragon/templates/tirage/fenetre-recherche-tirage.hbs", template: "systems/foundryvtt-reve-de-dragon/templates/tirage/fenetre-recherche-tirage.hbs",
@ -128,57 +64,96 @@ export class FenetreRechercheTirage extends Application {
}); });
} }
static async create() { static async $filterMilieux() {
const milieux = await game.system.rdd.environnement.milieux(); const milieux = await game.system.rdd.environnement.milieux();
const parameters = { return milieux.map(m => { return { group: 'milieu', code: m, label: m, check: item => item.isPresentDansMilieux(m) } })
milieux: milieux,
filterMilieux: $filterMilieux(milieux),
filterGroups: duplicate(FILTER_GROUPS).filter(it => it.group),
}
const options = {}
$loadFilters(parameters);
new FenetreRechercheTirage(parameters, options).render(true);
} }
constructor(parameters, options) { static $filterRarete() {
return RdDRaretes.raretes()
.map(r => { return { group: 'rarete', code: r.code, label: r.label, check: item => item.getRarete()?.code == r.code }; });
}
static $filterTypes() {
return [
{ group: 'type', code: 'inventaire', label: 'Inventaire', check: item => item.isInventaire() && !item.isEnvironnement() },
]
.concat(['arme', 'armure'].map(it => FenetreRechercheTirage.$typeToFilter(it)))
.concat([{ group: 'type', code: 'environement', label: 'Faune, Flore, Ingrédients', check: item => item.isEnvironnement() }])
.concat(RdDItem.getItemTypesEnvironnement().map(it => FenetreRechercheTirage.$typeToFilter(it)))
}
static $typeToFilter(type) { return { group: 'type', code: type, label: Misc.typeName('Item', type), check: item => item.type == type }; }
static async create(options) {
new FenetreRechercheTirage(options).render(true);
}
constructor(options) {
super(options); super(options);
this.parameters = parameters; this.tirage = {};
this.compendiums = [
SystemCompendiums.getCompendium('faune-flore-mineraux'),
SystemCompendiums.getCompendium('equipement')
]
} }
async getData() { async getData() {
return mergeObject(await super.getData(), this.parameters) const filterGroups = duplicate(FILTER_GROUPS);
FILTERS
.concat(FenetreRechercheTirage.$filterTypes())
.concat(await FenetreRechercheTirage.$filterMilieux())
.concat(FenetreRechercheTirage.$filterRarete())
.forEach(f => addFilterToGroup(filterGroups, f))
mergeObject(this.tirage,
{
filterGroups: filterGroups.filter(it => it.group)
})
let formData = super.getData();
mergeObject(formData, this.tirage)
return formData;
function addFilterToGroup(filterGroups, filter) {
if (filter.group && filter.code && filter.label) {
let fg = filterGroups.find(g => g.group == filter.group);
if (fg == undefined) {
filterGroups.push({ group: filter.group, label: filter.group, filters: [filter] })
}
else if (fg.filters == undefined) {
fg.filters = [filter];
}
else {
fg.filters.push(filter);
}
}
else {
console.warn("Filtre incorrect, pas de groupe/code/label", filter);
}
}
} }
_canDragStart() { return true; } _canDragStart() {
_onDragStart(event) { } return true;
_getHeaderButtons() {
let buttons = super._getHeaderButtons();
if (game.user.isGM) {
buttons.unshift({
class: "configurer",
label: "Configurer",
icon: "fas fa-cogs",
onclick: ev => this.configurer()
});
} }
return buttons _onDragStart(event) {
console.log('_onDragStart', event)
} }
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
this.html = html; this.html = html;
this.showFilterGroup(this.html, false); HtmlUtility.showControlWhen(this.html.find('div.group-filters'), false);
HtmlUtility.showControlWhen(this.html.find('i.filter-group-hide'), false);
HtmlUtility.showControlWhen(this.html.find('i.filter-group-show'), true);
this.html.find("a.section-filters-toggle").click(event => { this.html.find("a.filter-group-toggle").click(event => {
const groupDiv = this.html.find(event.currentTarget)?.parents('div.section-filters-root').first(); const groupDiv = this.html.find(event.currentTarget)?.parents('div.filter-group').first();
const visible = groupDiv.find('div.section-filters-content').first().is(":visible"); const visible = groupDiv.find('div.group-filters').first().is(":visible");
this.showFilterGroup(groupDiv, !visible) this.showFilterGroup(groupDiv, !visible)
}); });
this.html.find("input:is(.activate-filter-group,.activate-filter-milieu)").change(event => this.changeListeFiltresActifs()) this.html.find("input.activate-filter").change(event => this.changeListeFiltresActifs())
this.html.find("a.supprimer-filtres").click(async event => this.supprimerFiltres()) this.html.find("a.supprimer-filtres").click(async event => this.supprimerFiltres())
@ -191,145 +166,68 @@ export class FenetreRechercheTirage extends Application {
}) })
} }
showFilterGroup(groupDiv, show) {
if (groupDiv) {
HtmlUtility.showControlWhen(groupDiv.find('div.section-filters-content'), show);
HtmlUtility.showControlWhen(groupDiv.find('i.section-filters-hide'), show);
HtmlUtility.showControlWhen(groupDiv.find('i.section-filters-show'), !show);
}
}
supprimerFiltres() { supprimerFiltres() {
this.html.find('input:is(.activate-filter-group,.activate-filter-milieu)').prop("checked", false); this.html.find('div.liste-resultats').html('');
this.html.find('div.liste-resultats-recherche').html(''); return this.html.find('input.activate-filter:checked').prop("checked", false);
this.html.find('.section-filters-text input.recherche').val('');
} }
async recherche() { async recherche() {
const table = await this.buildTable(); const table = await this.buildTable();
const htmlResultats = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats-recherche.hbs`, { resultats: table }); const htmlResultats = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats.hbs`, { resultats: table });
this.html.find('div.liste-resultats-recherche').html(htmlResultats); this.html.find('div.liste-resultats').html(htmlResultats);
this._dragDrop.forEach(dragDropHandler => dragDropHandler.bind(this.element[0])) this._dragDrop.forEach(dragDropHandler => dragDropHandler.bind(this.element[0]))
} }
async buildTable() { async buildTable() {
const milieux = this.getSelectedMilieux(); const filter = this.getSelectedItemsFilter();
const filterItemMilieux = this.buildCheckedGroupFilter(milieux); const equipementCompendiumTable = new CompendiumTable('equipement', 'Item');
const filter = it => filterItemMilieux(it, milieux); const equipements = await equipementCompendiumTable.buildTable(it => it.getFrequence(), filter)
const itemFrequence = it => it.getFrequence(milieux); const environnements = await game.system.rdd.environnement.buildEnvironnementTable(undefined, filter);
return await game.system.rdd.environnement.buildTable(itemFrequence, filter) return CompendiumTableHelpers.concatTables(environnements, equipements);
} }
buildMilieuxFilter(milieux) { getSelectedItemsFilter() {
if (milieux) { const byGroup = this.getSelectedFiltersByGroup();
return this.buildOrFilter(this.parameters.filterMilieux.filter(it => milieux.includes(it.code)).map(f => f.check)); const groupSummaries = Object.entries(byGroup).map(([key, list]) => {
const group = this.tirage.filterGroups.find(g => key == g.group);
const filters = list.map(it => it.code).map(code => group.filters.find(f => code == f.code))
return filters
.map(f => f.check)
.reduce((a, b) => { return it => a(it) || b(it) });;
});
if (groupSummaries.length == 0) {
return it => true;
} }
return (it, mi) => true; return groupSummaries.reduce((a, b) => { return it => a(it) && b(it) })
}
buildFilterRechercheName() {
const recherche = this.html.find('.section-filters-text input.recherche').val();
if (recherche) {
return (it, mi) => Grammar.includesLowerCaseNoAccent(it.name, recherche);
}
return (it, mi) => true;
} }
buildCheckedGroupFilter(milieux) { showFilterGroup(groupDiv, show) {
const filtersList = this.getGroupCheckedFilters() if (groupDiv) {
.map(gf => this.buildOrFilter(gf.filters.map(f => f.check))); HtmlUtility.showControlWhen(groupDiv.find('div.group-filters'), show);
filtersList.push(this.buildMilieuxFilter(milieux)); HtmlUtility.showControlWhen(groupDiv.find('i.filter-group-hide'), show);
filtersList.push(this.buildFilterRechercheName()); HtmlUtility.showControlWhen(groupDiv.find('i.filter-group-show'), !show);
return this.buildAndFilter(filtersList) }
} }
buildAndFilter(filters) { return filters.reduce((f1, f2) => { return (it, mi) => f1(it, mi) && f2(it, mi); }); }
buildOrFilter(filters) { return filters.reduce((f1, f2) => { return (it, mi) => f1(it, mi) || f2(it, mi); }); }
changeListeFiltresActifs() { changeListeFiltresActifs() {
const milieux = this.getSelectedMilieux(); const byGroup = this.getSelectedFiltersByGroup();
const summariesList = this.getGroupCheckedFilters() const groupSummaries = Object.entries(byGroup).map(([key, list]) => {
.map(gf => { const group = this.tirage.filterGroups.find(g => key == g.group);
return gf.group.label + ': ' + gf.filters const filters = list.map(it => it.code).map(code => group.filters.find(f => code == f.code))
return group.label + ': ' + filters
.map(f => f.label) .map(f => f.label)
.reduce(Misc.joining(', ')) .reduce(Misc.joining(', '));;
}); });
if (milieux) { const fullText = groupSummaries.length == 0 ? "" : groupSummaries.reduce(Misc.joining(' - '));
summariesList.push('Milieux: ' + this.parameters.filterMilieux.filter(f => milieux.includes(f.code)).map(f => f.label).reduce(Misc.joining(', ')))
}
const fullText = summariesList.length == 0 ? "" : summariesList.reduce(Misc.joining(' - '));
this.html.find('span.liste-filtres-actifs').text(fullText); this.html.find('span.liste-filtres-actifs').text(fullText);
} }
getGroupCheckedFilters() { getSelectedFiltersByGroup() {
const checkedGroupFilters = jQuery.map(this.html.find('input.activate-filter-group:checked'), it => this.html.find(it)) const selectedFilters = jQuery.map(this.html.find('input.activate-filter:checked'), it => {
.map(element => { const element = this.html.find(it);
return { return { group: element.data('group'), code: element.data('code') };
group: element.data('group'),
code: element.data('code')
};
}).filter(it => it.group);
const entries = Object.entries(Misc.classify(checkedGroupFilters, it => it.group));
return entries.map(([key, list]) => {
const group = this.parameters.filterGroups.find(g => g.group == key);
const filters = list.map(it => group.filters.find(f => it.code == f.code));
return { group, filters };
}); });
} const byGroup = Misc.classify(selectedFilters, it => it.group);
return byGroup;
getSelectedMilieux() {
const milieux = jQuery.map(this.html.find('input.activate-filter-milieu:checked'), it => {
return this.html.find(it).data('code');
});
return milieux.length == 0 ? undefined : milieux
}
async configurer() {
FenetreRechercheConfiguration.create();
}
}
class FenetreRechercheConfiguration extends Dialog {
static async create() {
const configuration = {
compendiums: game.packs.filter(it => it.metadata.type == 'Item').map(it => it.metadata)
.map(it => mergeObject({ selected: game.system.rdd.environnement.compendiums.includes(it.id) }, it))
}
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/tirage/fenetre-recherche-configuration.hbs", configuration);
new FenetreRechercheConfiguration(html).render(true);
}
constructor(html) {
const options = {
classes: ["fenetre-recherche-configuration"],
width: 600,
height: 'fit-content',
'max-height': 600,
height: 'fit-content',
'z-index': 99999
};
const conf = {
title: 'Configuration de la recherche',
content: html,
buttons: {
"Sauvegarder": { label: "Sauvegarder", callback: async it => { await this.sauvegarder(); } }
}
};
super(conf, options)
}
activateListeners(html) {
this.html = html;
super.activateListeners(html);
this.html.find("button.configuration-save").click(event => this.sauvegarder())
}
async sauvegarder() {
const compendiumIds = jQuery.map(this.html.find("input.select-compendium:checked"), it => {
return this.html.find(it).data('id');
});
await game.system.rdd.environnement.saveCompendiums(compendiumIds);
this.close();
} }
} }

45
module/tirage/raretes.js Normal file
View File

@ -0,0 +1,45 @@
const RARETES = [
{ code: 'Commune', label: 'Commune', frequence: 54, min: 27, max: 108 },
{ code: 'Frequente', label: 'Fréquente', frequence: 18, min: 9, max: 36 },
{ code: 'Rare', label: 'Rare', frequence: 6, min: 3, max: 12 },
{ code: 'Rarissime', label: 'Rarissime', frequence: 2, min: 1, max: 4 }]
const DEFAULT_RARETE = 1;
export class RdDRaretes {
static getRarete(code = undefined) {
return RARETES.find(it => it.code == code) ?? RARETES[DEFAULT_RARETE];
}
static getChamp(rarete, field = undefined) {
const selected = this.getRarete(rarete);
return field ? selected[field] : selected[frequence];
}
static getRareteFrequente() {
return RARETES[DEFAULT_RARETE];
}
static raretes() {
return RARETES;
}
static frequenceEquipement(item) {
return RdDRaretes.rareteEquipement(item).frequence
}
static rareteEquipement(item) {
const qualite = item.system.qualite ?? 0;
if (qualite <= 0) {
return RARETES[0]
}
if (qualite <= 3) {
return RARETES[1]
}
if (qualite <= 6) {
return RARETES[2]
}
return RARETES[3]
}
}

View File

@ -226,6 +226,9 @@ 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 },
@ -236,6 +239,8 @@ const tmrRandomMovePatten =
{ name: 'topleft', col: -1, row: -1 } { name: 'topleft', col: -1, row: -1 }
] ]
/* -------------------------------------------- */
/* -------------------------------------------- */ /* -------------------------------------------- */
export class TMRUtility { export class TMRUtility {
static init() { static init() {
@ -253,25 +258,32 @@ export class TMRUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static verifyTMRCoord(coord) { static verifyTMRCoord(coord) {
return Grammar.equalsInsensitive(coord, 'Fleuve') || TMRUtility.getTMR(coord); let TMRregexp = new RegExp(/([A-M])(\d+)/g);
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 coord == 'Fleuve' ? TMRMapping['D1'] : TMRMapping[coord]; return TMRMapping[coord];
} }
static getTMRLabel(coord) { static getTMRLabel(coord) {
return TMRUtility.getTMR(coord)?.label ?? (coord + ": case inconnue"); return TMRMapping[coord]?.label ?? (coord + ": case inconnue");
} }
static getTMRType(coord) { static getTMRType(coord) {
const tmr = TMRUtility.getTMR(coord); const tmr = TMRMapping[coord];
return Misc.upperFirst(TMRType[tmr.type].name); return Misc.upperFirst(TMRType[tmr.type].name);
} }
static getTMRDescr(coord) { static getTMRDescr(coord) {
const tmr = TMRUtility.getTMR(coord); const tmr = TMRMapping[coord];
return Grammar.articleDetermine(tmr.type) + ' ' + tmr.label; return Grammar.articleDetermine(tmr.type) + ' ' + tmr.label;
} }

View File

@ -1,4 +1,4 @@
import { TYPES } from "../item.js"; import { Misc } from "../misc.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 == TYPES.casetmr; } static isCaseTMR(item) { return item.type == 'casetmr'; }
static isQueueDragon(item) { return item.isQueueDragon(); } static isQueueDragon(item) { return item.type == 'queue' || item.type == 'ombre'; }
static isSouffleDragon(item) {return item.type == TYPES.souffle; } static isSouffleDragon(item) { return item.type == 'souffle'; }
static isTeteDragon(item) { return item.type == TYPES.tete; } static isTeteDragon(item) { return item.type == '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); }

View File

@ -18,7 +18,6 @@ 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 {
@ -115,57 +114,46 @@ export class EffetsDraconiques {
); );
} }
static tetesDragon(actor, name) { static filterItems(actor, filter, name) {
return actor.itemTypes[TYPES.tete].filter(it => Grammar.includesLowerCaseNoAccent(it.name, name)); return actor.filterItems(filter)
} .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.tetesDragon(actor, 'Augmentation du seuil de rêve').length; return EffetsDraconiques.filterItems(actor, Draconique.isTeteDragon, 'Augmentation du seuil de rêve').length;
} }
static isDonDoubleReve(actor) { static isDonDoubleReve(actor) {
return EffetsDraconiques.tetesDragon(actor, 'Don de double-rêve').length > 0; return EffetsDraconiques.filterItems(actor, Draconique.isTeteDragon, 'Don de double-rêve').length>0;
} }
static isConnaissanceFleuve(actor) { static isConnaissanceFleuve(actor) {
return EffetsDraconiques.tetesDragon(actor, 'connaissance du fleuve').length > 0; return EffetsDraconiques.filterItems(actor, Draconique.isTeteDragon, 'connaissance du fleuve').length>0;
} }
static isReserveEnSecurite(actor) { static isReserveEnSecurite(actor) {
return EffetsDraconiques.tetesDragon(actor, 'réserve en sécurité').length > 0; return EffetsDraconiques.filterItems(actor, Draconique.isTeteDragon, 'réserve en sécurité').length>0;
} }
static isDeplacementAccelere(actor) { static isDeplacementAccelere(actor) {
return EffetsDraconiques.tetesDragon(actor, 'déplacement accéléré').length > 0; return EffetsDraconiques.filterItems(actor, Draconique.isTeteDragon, ' déplacement accéléré').length>0;
} }
static isDoubleResistanceFleuve(actor) { static isDoubleResistanceFleuve(actor) {
return EffetsDraconiques.soufflesDragon(actor, 'résistance du fleuve').length > 0; return EffetsDraconiques.filterItems(actor, Draconique.isSouffleDragon, 'résistance du fleuve').length>0;
} }
static countInertieDraconique(actor) { static countInertieDraconique(actor) {
return EffetsDraconiques.queuesDragon(actor, 'inertie draconique').length; return EffetsDraconiques.filterItems(actor, Draconique.isQueueDragon, 'inertie draconique').length;
} }
static countMonteeLaborieuse(actor) { static countMonteeLaborieuse(actor) {
return EffetsDraconiques.queuesSoufflesDragon(actor, 'montée laborieuse').length; return EffetsDraconiques.filterItems(actor, Draconique.isQueueSouffle, 'montée laborieuse').length;
} }
static mauvaiseRencontre(actor) { static mauvaiseRencontre(actor) {
const mauvaisesRencontres = EffetsDraconiques.queuesSoufflesDragon(actor, 'mauvaise rencontre'); const mauvaisesRencontres = EffetsDraconiques.filterItems(actor, Draconique.isQueueSouffle, 'mauvaise rencontre');
return mauvaisesRencontres.length > 0 ? mauvaisesRencontres[0] : undefined; return mauvaisesRencontres.length>0 ? mauvaisesRencontres[0] : undefined;
} }
static isPontImpraticable(actor) { static isPontImpraticable(actor) {
@ -176,12 +164,8 @@ 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.soufflesDragon(actor, 'péage').length > 0; return EffetsDraconiques.filterItems(actor, Draconique.isSouffleDragon, 'péage').length > 0;
} }

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

View File

@ -1,206 +1,198 @@
{"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"}} {"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},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206013,"modifiedTime":1671050477120,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206013,"modifiedTime":1671050477120,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206013,"modifiedTime":1671050477120,"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"}} {"_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,"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.3.13","coreVersion":"10.291","createdTime":1668808206014,"modifiedTime":1671050477120,"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&eacute;ch&eacute;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"}} {"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&eacute;ch&eacute;e...</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.02,"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.3.13","coreVersion":"10.291","createdTime":1668808206014,"modifiedTime":1671050477120,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206014,"modifiedTime":1671050477120,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1671050477120,"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":"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&eacute;es de 1m.</p>\n<p>Chaque point de force en dessous de 9 diminue les port&eacute;es de 1m.</p>","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":3,"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.3.13","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1671050477120,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1671050477120,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_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&eacute;es de 1m.</p>\n<p>Chaque point de force en dessous de 9 diminue les port&eacute;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":"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,"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":false,"initpremierround":"masse"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1671050477120,"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":"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&egrave;me sirupeuse blanch&acirc;tre.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"rarete":"","categorie":"AlchimieAutre","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.3.13","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1671050477121,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206015,"modifiedTime":1671050477121,"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&egrave;me sirupeuse blanch&acirc;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":"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,"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1671050477121,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1671050477121,"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":"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,"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1671050477121,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1671050477121,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206016,"modifiedTime":1671050477121,"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":"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 &Acirc;ge, c&rsquo;&eacute;tait<em> une grande &eacute;p&eacute;e &agrave; deux mains</em>. Encombrante et prohibant le bouclier, c&rsquo;&eacute;tait avant tout une &eacute;p&eacute;e de duel et de frime.</p>","descriptionmj":"","equipe":false,"encombrement":4,"quantite":1,"qualite":0,"cout":50,"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.3.13","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1671050477121,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1671050477121,"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 &Acirc;ge, c&rsquo;&eacute;tait<em> une grande &eacute;p&eacute;e &agrave; deux mains</em>. Encombrante et prohibant le bouclier, c&rsquo;&eacute;tait avant tout une &eacute;p&eacute;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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1671050477121,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1671050477121,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1671050477121,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1671050477121,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206017,"modifiedTime":1671050477121,"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":"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&egrave;me sirupeuse gris&acirc;tre.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"rarete":"","categorie":"AlchimieAutre","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.3.13","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1671050477122,"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"}} {"_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,"rarete":"","categorie":"Alchimie","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.3.13","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1671050477122,"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"}} {"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},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1671050477122,"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&egrave;me sirupeuse gris&acirc;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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1671050477122,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1671050477122,"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":"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,"contenu":[],"capacite":1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1671050477122,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1671050477122,"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.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,"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":false,"deuxmains":false,"unemain":false,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1671050477122,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1671050477122,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206018,"modifiedTime":1671050477122,"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":"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&eacute;s. Poudre blanche.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"rarete":"","categorie":"AlchimieAutre","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.3.13","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1671050477123,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1671050477123,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1671050477123,"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":"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&eacute;s. Coquille d'oeuf de cane broy&eacute;.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"rarete":"","categorie":"AlchimieAutre","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.3.13","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1671050477123,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1671050477123,"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&eacute;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":"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,"contenu":[],"capacite":1.3,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206019,"modifiedTime":1671050477123,"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":"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&eacute; de la fourrure, le prix d'un tel manteau peut varier de 1 &agrave; 20 sols.</p>","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":0,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1671050477123,"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&eacute;s. Coquille d'oeuf de cane broy&eacute;.</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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1671050477123,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1671050477123,"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":"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&rsquo;est une &eacute;p&eacute;e <em>courte</em>, essentiellement fabriqu&eacute;e et port&eacute;e par les Gnomes au Second &Acirc;ge.</p>","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":12,"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.3.13","coreVersion":"10.291","createdTime":1668808206020,"modifiedTime":1671050477123,"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&eacute; de la fourrure, le prix d'un tel manteau peut varier de 1 &agrave; 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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1671050477123,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1671050477123,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1671050477123,"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&rsquo;est une &eacute;p&eacute;e <em>courte</em>, essentiellement fabriqu&eacute;e et port&eacute;e par les Gnomes au Second &Acirc;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":"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,"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1671050477123,"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":"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,"rarete":"","categorie":"Alchimie","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.3.13","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1671050477123,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1671050477124,"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":"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,"contenu":[],"capacite":10,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206021,"modifiedTime":1671050477124,"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":"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,"contenu":[],"capacite":1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1671050477124,"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":"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>&nbsp;</p>","descriptionmj":"","equipe":false,"encombrement":6,"quantite":1,"qualite":0,"cout":50,"protection":5,"deterioration":null,"malus":-4},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1671050477124,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1671050477124,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1671050477124,"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":"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>(&agrave; modifier/compl&eacute;ter)</em></p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1671050477124,"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>&nbsp;</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":"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,"contenu":[],"capacite":0.3,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1671050477124,"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":"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&eacute;g&egrave;rement huileux.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"rarete":"","categorie":"Alchimie","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.3.13","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1671050477124,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1671050477125,"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>(&agrave; modifier/compl&eacute;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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206022,"modifiedTime":1671050477125,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1671050477125,"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&eacute;g&egrave;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":"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&rsquo;indique, c&rsquo;est une <em>b&acirc;tarde </em>de l'&eacute;p&eacute;e longue et de l'&eacute;p&eacute;e sorde, &agrave; la fois longue et large, pouvant s&rsquo;utiliser &agrave; une ou deux mains.</p>","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":30,"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.3.13","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1671050477125,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1671050477125,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1671050477125,"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&rsquo;indique, c&rsquo;est une <em>b&acirc;tarde </em>de l'&eacute;p&eacute;e longue et de l'&eacute;p&eacute;e sorde, &agrave; la fois longue et large, pouvant s&rsquo;utiliser &agrave; 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":"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,"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1671050477125,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1671050477125,"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":"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&eacute;s translucides.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":1,"rarete":"","categorie":"AlchimieAutre","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.3.13","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1671050477125,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1671050477125,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1671050477125,"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&eacute;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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206023,"modifiedTime":1671050477125,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1671050477125,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1671050477125,"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":"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,"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1671050477125,"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":"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,"rarete":"","categorie":"Alchimie","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.3.13","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1671050477125,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1671050477126,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1671050477126,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1671050477126,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1671050477126,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206024,"modifiedTime":1671050477126,"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":"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,"contenu":[],"capacite":0.2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1671050477126,"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":"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,"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1671050477126,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1671050477126,"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":"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&eacute;es de 1m.</p>\n<p>Chaque point de force en dessous de 9 diminue les port&eacute;es de 1m.</p>","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":1,"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.3.13","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1671050477126,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206025,"modifiedTime":1671050477126,"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":"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>&nbsp;</p>","descriptionmj":"","equipe":false,"encombrement":8,"quantite":1,"qualite":0,"cout":100,"protection":6,"deterioration":0,"malus":-6},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477127,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477127,"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&eacute;es de 1m.</p>\n<p>Chaque point de force en dessous de 9 diminue les port&eacute;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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477127,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477127,"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>&nbsp;</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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477127,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477127,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477127,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477128,"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":"UE79xKWXTwYAn70K","name":"Arme dhast","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,"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.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477128,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477128,"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":"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,"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":""},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206026,"modifiedTime":1671050477128,"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":"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,"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206027,"modifiedTime":1671050477128,"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":"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,"contenu":[],"capacite":0.3,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1671050477128,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"UE79xKWXTwYAn70K","name":"Arme dhast","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":"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&rsquo;est une &eacute;p&eacute;e semblable &agrave; la <em>rapi&egrave;re</em>, longue et ne frappant uniquement d&rsquo;estoc. Elle doit son nom &agrave; ce qu&rsquo;elle &eacute;tait particuli&egrave;rement en vogue, au Second &Acirc;ge, dans la cit&eacute; d&rsquo;Esparlongue. En ce d&eacute;but du Troisi&egrave;me &Acirc;ge, toutefois, on lui substitue le plus souvent la <strong>demi-dragonne</strong>, &eacute;p&eacute;e tr&egrave;s voisine, ne frappant pareillement que d&rsquo;estoc, mais plus r&eacute;sistante (r&eacute;sistance 10) et moins co&ucirc;teuse (15 sols) ; son bonus aux dommages (+2) est identique.</p>","descriptionmj":"","equipe":false,"encombrement":1.5,"quantite":1,"qualite":0,"cout":20,"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.3.13","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1671050477129,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1671050477129,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1671050477129,"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":"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,"contenu":[],"capacite":0.2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1671050477129,"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":"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&eacute;g&acirc;ts \"non mortels\".</p>\n<p>Les armures sont major&eacute;es de 2.</p>\n<p>Si la protection atteint une valeur de 5 ou plus, le fouet ne peut causer de d&eacute;g&acirc;t.</p>","descriptionmj":"","equipe":false,"encombrement":0.5,"quantite":1,"qualite":0,"cout":1,"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.3.13","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1671050477129,"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&rsquo;est une &eacute;p&eacute;e semblable &agrave; la <em>rapi&egrave;re</em>, longue et ne frappant uniquement d&rsquo;estoc. Elle doit son nom &agrave; ce qu&rsquo;elle &eacute;tait particuli&egrave;rement en vogue, au Second &Acirc;ge, dans la cit&eacute; d&rsquo;Esparlongue. En ce d&eacute;but du Troisi&egrave;me &Acirc;ge, toutefois, on lui substitue le plus souvent la <strong>demi-dragonne</strong>, &eacute;p&eacute;e tr&egrave;s voisine, ne frappant pareillement que d&rsquo;estoc, mais plus r&eacute;sistante (r&eacute;sistance 10) et moins co&ucirc;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":"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,"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":false,"deuxmains":false,"unemain":false,"initpremierround":"dague"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206107,"modifiedTime":1671050477129,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1671050477129,"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":"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,"contenu":[],"capacite":25,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1671050477129,"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":"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,"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1671050477129,"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&eacute;g&acirc;ts \"non mortels\".</p>\n<p>Les armures sont major&eacute;es de 2.</p>\n<p>Si la protection atteint une valeur de 5 ou plus, le fouet ne peut causer de d&eacute;g&acirc;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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1671050477129,"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":"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&egrave;re.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.01,"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.3.13","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1671050477129,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1671050477129,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1671050477129,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1671050477129,"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":"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,"contenu":[],"capacite":6,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1671050477129,"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":"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&eacute;paration &agrave; base de gibier, &eacute;labor&eacute;e dans les for&ecirc;ts proches de la mer par des chasseurs sp&eacute;cialis&eacute;s : les </span><span class=\"fontstyle2\">cornebouffiers</span><span class=\"fontstyle0\">. Achemin&eacute;e vers les ports, principaux consommateurs, elle constitue l&rsquo;aliment de base de la plupart des marins.</span></p>\n<p><span class=\"fontstyle0\">Certains voyageurs qui l&rsquo;ont exp&eacute;riment&eacute;e et en ont accept&eacute; l&rsquo;exotisme, en&nbsp; transportent parfois en cas de disette. Pratiquement, il s&rsquo;agit de gibier&nbsp; r&eacute;f&eacute;rentiellement cornu (bramart, cornicochon, mercureuil), que l&rsquo;on cuit et recuit dans de l&rsquo;eau de mer avec des herbes, jusqu&rsquo;&agrave; obtenir une p&acirc;te, sorte de mastic, que l&rsquo;on fa&ccedil;onne en forme de galettes, puis que l&rsquo;on laisse longuement s&eacute;cher au soleil. On aboutit au final &agrave; des sortes de petites briques plates, de la taille d&rsquo;une demi-main, de couleur vert-de-gris, et &agrave; peu pr&egrave;s aussi dures que les briques v&eacute;ritables. La meilleure fa&ccedil;on de consommer ces galettes est de les r&eacute;hydrater avec de l&rsquo;eau chaude, c&rsquo;est la fa&ccedil;on dite </span><span class=\"fontstyle2\">soup&eacute;e </span><span class=\"fontstyle0\">: on obtient une sorte de soupe ou de bouillie gluante. L&rsquo;autre fa&ccedil;on, dite s&egrave;che, consiste &agrave; les grignoter telles quelles comme des biscuits, mais il est imp&eacute;ratif de boire beaucoup par dessus, sous peine d&rsquo;une soif torride accompagn&eacute;e de maux d&rsquo;estomac.</span></p>\n<p><span class=\"fontstyle0\">L&eacute;g&egrave;re, peu encombrante, et surtout nourrissante, une galette de cornebouffe suffit pour un repas. Quant au go&ucirc;t, eh bien... ceux qui disent que, tant qu&rsquo;&agrave; y aller, autant manger directement des crottes de chien &agrave; la croque-au-sel, ne sont probablement que des enfants g&acirc;t&eacute;s et difficiles.</span></p>\n<p><span class=\"fontstyle0\">Aliment de longue conservation (pratiquement inalt&eacute;rable), la cornebouffe poss&egrave;de un des meilleurs rapports sustentation/encombrement.</span></p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.02,"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.3.13","coreVersion":"10.291","createdTime":1668808206108,"modifiedTime":1671050477130,"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&egrave;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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1671050477130,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1671050477130,"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":"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>&nbsp;</p>","descriptionmj":"","equipe":false,"encombrement":0,"quantite":1,"qualite":0,"cout":6,"protection":2,"deterioration":0,"malus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1671050477130,"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":"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.&nbsp;</p>\n<p>Liquide ros&acirc;tre.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"rarete":"","categorie":"Alchimie","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.3.13","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1671050477130,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1671050477130,"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&eacute;paration &agrave; base de gibier, &eacute;labor&eacute;e dans les for&ecirc;ts proches de la mer par des chasseurs sp&eacute;cialis&eacute;s : les </span><span class=\"fontstyle2\">cornebouffiers</span><span class=\"fontstyle0\">. Achemin&eacute;e vers les ports, principaux consommateurs, elle constitue l&rsquo;aliment de base de la plupart des marins.</span></p>\n<p><span class=\"fontstyle0\">Certains voyageurs qui l&rsquo;ont exp&eacute;riment&eacute;e et en ont accept&eacute; l&rsquo;exotisme, en&nbsp; transportent parfois en cas de disette. Pratiquement, il s&rsquo;agit de gibier&nbsp; r&eacute;f&eacute;rentiellement cornu (bramart, cornicochon, mercureuil), que l&rsquo;on cuit et recuit dans de l&rsquo;eau de mer avec des herbes, jusqu&rsquo;&agrave; obtenir une p&acirc;te, sorte de mastic, que l&rsquo;on fa&ccedil;onne en forme de galettes, puis que l&rsquo;on laisse longuement s&eacute;cher au soleil. On aboutit au final &agrave; des sortes de petites briques plates, de la taille d&rsquo;une demi-main, de couleur vert-de-gris, et &agrave; peu pr&egrave;s aussi dures que les briques v&eacute;ritables. La meilleure fa&ccedil;on de consommer ces galettes est de les r&eacute;hydrater avec de l&rsquo;eau chaude, c&rsquo;est la fa&ccedil;on dite </span><span class=\"fontstyle2\">soup&eacute;e </span><span class=\"fontstyle0\">: on obtient une sorte de soupe ou de bouillie gluante. L&rsquo;autre fa&ccedil;on, dite s&egrave;che, consiste &agrave; les grignoter telles quelles comme des biscuits, mais il est imp&eacute;ratif de boire beaucoup par dessus, sous peine d&rsquo;une soif torride accompagn&eacute;e de maux d&rsquo;estomac.</span></p>\n<p><span class=\"fontstyle0\">L&eacute;g&egrave;re, peu encombrante, et surtout nourrissante, une galette de cornebouffe suffit pour un repas. Quant au go&ucirc;t, eh bien... ceux qui disent que, tant qu&rsquo;&agrave; y aller, autant manger directement des crottes de chien &agrave; la croque-au-sel, ne sont probablement que des enfants g&acirc;t&eacute;s et difficiles.</span></p>\n<p><span class=\"fontstyle0\">Aliment de longue conservation (pratiquement inalt&eacute;rable), la cornebouffe poss&egrave;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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1671050477130,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1671050477130,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1671050477130,"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>&nbsp;</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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206109,"modifiedTime":1671050477130,"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.&nbsp;</p>\n<p>Liquide ros&acirc;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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1671050477130,"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":"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&rsquo;est une &eacute;p&eacute;e <em>longue</em>, plus robuste que l&rsquo;esparlongue, pouvant &eacute;galement frapper de taille.</p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":20,"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.3.13","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1671050477130,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1671050477130,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1671050477130,"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":"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>&nbsp;</p>","descriptionmj":"","equipe":false,"encombrement":4,"quantite":1,"qualite":0,"cout":20,"protection":"4","deterioration":0,"malus":-2},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1671050477130,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1671050477131,"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"}} {"_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,"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.3.13","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1671050477131,"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&rsquo;est une &eacute;p&eacute;e <em>longue</em>, plus robuste que l&rsquo;esparlongue, pouvant &eacute;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"}} {"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},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206110,"modifiedTime":1671050477131,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1671050477131,"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"}} {"_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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1671050477131,"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>&nbsp;</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"}} {"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},"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1671050477131,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1671050477131,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1671050477131,"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":"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,"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":""},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1671050477131,"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":"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,"contenu":[],"capacite":1.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1671050477131,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1671050477131,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206111,"modifiedTime":1671050477131,"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":"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,"contenu":[],"capacite":0.25,"equipe":false},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1671050477131,"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":"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'&agrave; 2 points d'armure.</p>\n<p>Rechargement 1/2 round (s'il tire en d&eacute;but de round, il pourra recharger durant le reste du round pour tirer de nouveau au d&eacute;but du round suivant).</p>","descriptionmj":"","equipe":false,"encombrement":1,"quantite":1,"qualite":0,"cout":10,"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.3.13","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1671050477131,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1671050477131,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1671050477131,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1671050477132,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1671050477132,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1671050477132,"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'&agrave; 2 points d'armure.</p>\n<p>Rechargement 1/2 round (s'il tire en d&eacute;but de round, il pourra recharger durant le reste du round pour tirer de nouveau au d&eacute;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":"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,"contenu":[],"capacite":2.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1671050477132,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206112,"modifiedTime":1671050477132,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1671050477132,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1671050477132,"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":"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&egrave;me sirupeuse.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0.2,"rarete":"","categorie":"AlchimieAutre","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.3.13","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1671050477132,"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":"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&acirc;tre clair et sans d&eacute;pot.</p>","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":2,"rarete":"","categorie":"Alchimie","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.3.13","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1671050477132,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1671050477132,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206113,"modifiedTime":1671050477132,"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":"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'&agrave; 2 points d'armure.</p>\n<p>Rechargement 1 round.</p>","descriptionmj":"","equipe":false,"encombrement":3,"quantite":1,"qualite":0,"cout":30,"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":""},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1671050477132,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1671050477132,"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&egrave;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":"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,"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1671050477132,"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&acirc;tre clair et sans d&eacute;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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1671050477132,"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":"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,"contenu":[],"capacite":5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1671050477132,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1671050477132,"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'&agrave; 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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1671050477132,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206114,"modifiedTime":1671050477132,"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":"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&rsquo;est une &eacute;p&eacute;e plus courte que la dragonne, mais plus <em>large</em>. Elle peut s&rsquo;utiliser &agrave; une ou deux mains. Sa grande solidit&eacute; en fait l&rsquo;&eacute;p&eacute;e de pr&eacute;dilection des gardes et des soldats.</p>\n<p>C&rsquo;est probablement &agrave; elle que le <em>Guerrier Sorde</em> doit son nom (&agrave; moins que ce ne soit l&rsquo;inverse).</p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":20,"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.3.13","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1671050477133,"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":"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,"contenu":[],"capacite":25,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1671050477133,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1671050477133,"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":"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,"contenu":[],"capacite":25,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1671050477133,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1671050477133,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1671050477133,"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&rsquo;est une &eacute;p&eacute;e plus courte que la dragonne, mais plus <em>large</em>. Elle peut s&rsquo;utiliser &agrave; une ou deux mains. Sa grande solidit&eacute; en fait l&rsquo;&eacute;p&eacute;e de pr&eacute;dilection des gardes et des soldats.</p>\n<p>C&rsquo;est probablement &agrave; elle que le <em>Guerrier Sorde</em> doit son nom (&agrave; moins que ce ne soit l&rsquo;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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1671050477133,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1671050477133,"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":"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,"contenu":[],"capacite":0.2,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206115,"modifiedTime":1671050477133,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1671050477133,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1671050477133,"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":"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,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1671050477133,"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":"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,"contenu":[],"capacite":0.1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1671050477135,"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":"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>&nbsp;</p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":10,"protection":3,"deterioration":0,"malus":-1},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1671050477135,"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":"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,"contenu":[],"capacite":1,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1671050477135,"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.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,"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":false,"initpremierround":"masse"},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1671050477135,"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":"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1671050477135,"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"}} {"_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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1671050477135,"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"}} {"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206117,"modifiedTime":1671050477136,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1671050477136,"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>&nbsp;</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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1671050477136,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1671050477136,"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":"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,"contenu":[],"capacite":5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1671050477136,"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"}} {"_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 jusquaux genoux, façon Robin des Bois.</p>\n<p>&nbsp;</p>","descriptionmj":"","equipe":false,"encombrement":0,"quantite":1,"qualite":0,"cout":4,"protection":1,"deterioration":0,"malus":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1671050477136,"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"}} {"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,"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.3.13","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1671050477136,"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":"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>&agrave; l&rsquo;acier bleut&eacute;, exclusivement fabriqu&eacute; par les Cyans ou Hommes bleus.</p>","descriptionmj":"","equipe":false,"encombrement":2,"quantite":1,"qualite":0,"cout":25,"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.3.13","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1671050477136,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1671050477136,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1671050477136,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206118,"modifiedTime":1671050477136,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206119,"modifiedTime":1671050477136,"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 jusquaux genoux, façon Robin des Bois.</p>\n<p>&nbsp;</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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206119,"modifiedTime":1671050477136,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1671050477136,"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>&agrave; l&rsquo;acier bleut&eacute;, exclusivement fabriqu&eacute; 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":"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,"contenu":[],"capacite":10,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1671050477136,"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":"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,"equipe":false,"resistance":0},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1671050477136,"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":"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,"contenu":[],"capacite":2,"equipe":false},"ownership":{"default":0,"jOzRscDxoXZWpGS6":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1671050477136,"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":"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,"contenu":[],"capacite":0.5,"equipe":false},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.3.13","coreVersion":"10.291","createdTime":1668808206179,"modifiedTime":1671050477136,"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.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"}}

View File

@ -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&ucirc;rier, petit arbuste tr&egrave;s ramifi&eacute; vivant en sous-bois &agrave; l&rsquo;ombre des plus grands arbres. La noisem&ucirc;re a ext&eacute;rieurement l&rsquo;apparence d&rsquo;une grosse noisette &agrave; la coquille rouge&acirc;tre et granul&eacute;e. Int&eacute;rieurement, sa chair est tendre, juteuse et sucr&eacute;e.</p>\n<p>Fr&eacute;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&ucirc;rier, petit arbuste tr&egrave;s ramifi&eacute; vivant en sous-bois &agrave; l&rsquo;ombre des plus grands arbres. La noisem&ucirc;re a ext&eacute;rieurement l&rsquo;apparence d&rsquo;une grosse noisette &agrave; la coquille rouge&acirc;tre et granul&eacute;e. Int&eacute;rieurement, sa chair est tendre, juteuse et sucr&eacute;e.</p>\n<p>Fr&eacute;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 deau 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 deau 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 &agrave; pied mince et blanc, et large chapeau pointu blanc &agrave; pois bleus.</p>\n<p>Fr&eacute;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 &agrave; pied mince et blanc, et large chapeau pointu blanc &agrave; pois bleus.</p>\n<p>Fr&eacute;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&eacute;t&eacute; d&rsquo;ortie non urticante, poussant dans les lieux humides &agrave; l&rsquo;abri de la lumi&egrave;re. Ses d&eacute;coctions sont r&eacute;put&eacute;es souveraines contre les maladies des yeux.</p>\n<p>Rare.</p>\n<p>&nbsp;</p>\n<p><em>Voir Fi&egrave;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":"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&eacute;t&eacute; d&rsquo;ortie non urticante, poussant dans les lieux humides &agrave; l&rsquo;abri de la lumi&egrave;re. Ses d&eacute;coctions sont r&eacute;put&eacute;es souveraines contre les maladies des yeux.</p>\n<p>Rare.</p>\n<p>&nbsp;</p>\n<p><em>Voir Fi&egrave;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":"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&acirc;tre obtenue par disruption alchimique du minerai appel&eacute; <em>obbadine</em>, &nbsp;sorte de tourbe.</p>\n<p>VUE/Alchimie &agrave; -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&acirc;tre obtenue par disruption alchimique du minerai appel&eacute; <em>obbadine</em>, &nbsp;sorte de tourbe.</p>\n<p>VUE/Alchimie &agrave; -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&ecirc;t, rivage, 3 kg, 7 sust. Nom parfois donn&eacute; au noisot m&acirc;le quand il est particuli&egrave;rement &eacute;nerv&eacute; (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&ecirc;t, rivage, 3 kg, 7 sust. Nom parfois donn&eacute; au noisot m&acirc;le quand il est particuli&egrave;rement &eacute;nerv&eacute; (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&ecirc;t, plaine, 10 kg, 25 sust. Lacrampe est une grosse dinde sauvage vi-vant en lisi&egrave;re de for&ecirc;t ou en sous-bois peu &eacute;pais. La crampe passe sa vie &agrave; essayer deprendre son envol, ce qu&rsquo;elle ne r&eacute;ussit querarement et pour quelques m&egrave;tres. &Agrave; forcede battre inutilement des ailes, les cram-pes s&rsquo;&eacute;croulent p&eacute;riodiquement, en proie &agrave; de terribles douleurs musculaires. C&rsquo;est &eacute;videmment &agrave; ce moment qu&rsquo;elles sont les plus vuln&eacute;rables &ndash; ce que n&rsquo;ignorent pas les pr&eacute;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&ecirc;t, plaine, 10 kg, 25 sust. Lacrampe est une grosse dinde sauvage vi-vant en lisi&egrave;re de for&ecirc;t ou en sous-bois peu &eacute;pais. La crampe passe sa vie &agrave; essayer deprendre son envol, ce qu&rsquo;elle ne r&eacute;ussit querarement et pour quelques m&egrave;tres. &Agrave; forcede battre inutilement des ailes, les cram-pes s&rsquo;&eacute;croulent p&eacute;riodiquement, en proie &agrave; de terribles douleurs musculaires. C&rsquo;est &eacute;videmment &agrave; ce moment qu&rsquo;elles sont les plus vuln&eacute;rables &ndash; ce que n&rsquo;ignorent pas les pr&eacute;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 dune é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 dune é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&eacute;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&eacute;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&eacute;e aux feuilles en forme de polygone &agrave; 7 c&ocirc;t&eacute;s, d&rsquo;un bleu tr&egrave;s p&acirc;le, presque translucide, ne poussant qu&rsquo;en haute montagne, &agrave; partir de 2000 m&egrave;tres, et uniquement dans les recoins pouvant &ecirc;tre &eacute;clair&eacute;s par la lune. <br /><br />L&rsquo;herbe de lune poss&egrave;de un fort pouvoir onirique sur celui qui la consomme\"; en termes de jeu, elle permet de gagner des points de r&ecirc;ve. Elle doit &ecirc;tre cueillie de nuit et lorsque la lune l&rsquo;&eacute;claire, faute de quoi son pouvoir est nul. Sa force d&eacute;pend de la phase lunaire durant laquelle elle est cueillie. <br /><br />Une fois s&eacute;ch&eacute;e, l&rsquo;herbe de lune peut &ecirc;tre fum&eacute;e dans une pipe ou pr&eacute;par&eacute;e en d&eacute;coction. Dans les deux cas, une dose doit &ecirc;tre compos&eacute;e de 7 brins. D&egrave;s la dose absorb&eacute;e (bue ou fum&eacute;e), le consommateur doit jouer un JR r-force, c&rsquo;est-&agrave;-dire un jet de points de r&ecirc;ve ajust&eacute; n&eacute;gativement &agrave; la force de l&rsquo;herbe. Si le JR r&eacute;ussit, aucun effet ne se produit\"; s&rsquo;il &eacute;choue, le consommateur gagne imm&eacute;diatement un nombre de points de r&ecirc;ve &eacute;gal &agrave; la force de l&rsquo;herbe, puis en &eacute;change, marque un nombre identique de points de fatigue. On peut ainsi gagner des points de r&ecirc;ve m&ecirc;me si le seuil de r&ecirc;ve est d&eacute;pass&eacute;, mais se souvenir que d&eacute;passer le triple de son seuil provoque l&rsquo;&eacute;clatement. <br /><br />L&rsquo;herbe de lune est parfois trouvable chez les herboristes, mais n&rsquo;est pas bon march&eacute;. Une dose (7 brins) vaut usuellement un nombre de sols &eacute;gal &agrave; 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":"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&eacute;e aux feuilles en forme de polygone &agrave; 7 c&ocirc;t&eacute;s, d&rsquo;un bleu tr&egrave;s p&acirc;le, presque translucide, ne poussant qu&rsquo;en haute montagne, &agrave; partir de 2000 m&egrave;tres, et uniquement dans les recoins pouvant &ecirc;tre &eacute;clair&eacute;s par la lune. <br /><br />L&rsquo;herbe de lune poss&egrave;de un fort pouvoir onirique sur celui qui la consomme\"; en termes de jeu, elle permet de gagner des points de r&ecirc;ve. Elle doit &ecirc;tre cueillie de nuit et lorsque la lune l&rsquo;&eacute;claire, faute de quoi son pouvoir est nul. Sa force d&eacute;pend de la phase lunaire durant laquelle elle est cueillie. <br /><br />Une fois s&eacute;ch&eacute;e, l&rsquo;herbe de lune peut &ecirc;tre fum&eacute;e dans une pipe ou pr&eacute;par&eacute;e en d&eacute;coction. Dans les deux cas, une dose doit &ecirc;tre compos&eacute;e de 7 brins. D&egrave;s la dose absorb&eacute;e (bue ou fum&eacute;e), le consommateur doit jouer un JR r-force, c&rsquo;est-&agrave;-dire un jet de points de r&ecirc;ve ajust&eacute; n&eacute;gativement &agrave; la force de l&rsquo;herbe. Si le JR r&eacute;ussit, aucun effet ne se produit\"; s&rsquo;il &eacute;choue, le consommateur gagne imm&eacute;diatement un nombre de points de r&ecirc;ve &eacute;gal &agrave; la force de l&rsquo;herbe, puis en &eacute;change, marque un nombre identique de points de fatigue. On peut ainsi gagner des points de r&ecirc;ve m&ecirc;me si le seuil de r&ecirc;ve est d&eacute;pass&eacute;, mais se souvenir que d&eacute;passer le triple de son seuil provoque l&rsquo;&eacute;clatement. <br /><br />L&rsquo;herbe de lune est parfois trouvable chez les herboristes, mais n&rsquo;est pas bon march&eacute;. Une dose (7 brins) vaut usuellement un nombre de sols &eacute;gal &agrave; 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":"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

View File

@ -8,6 +8,5 @@
{"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"}

Some files were not shown because too many files have changed in this diff Show More