Compare commits

...

76 Commits

Author SHA1 Message Date
1b8ad316b9 Merge conteneur + fix hotbar 2022-09-25 21:21:28 +02:00
b35eaad757 Merge conteneur + fix hotbar 2022-09-25 21:17:47 +02:00
e325ab9278 Merge pull request 'Drop sur un objet met dans le conteneur parent' (#559) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: #559
2022-09-25 21:17:01 +02:00
Vincent Vandemeulebrouck
ebe19959fa Drop sur un objet met dans le conteneur parent
Augmenter la zone pour lacher un objet:
* si c'est un objet similaire, on regroupe
* si c'est un conteneur: on met dans le conteneur
* si c'est un objet dans un conteneur, on met dans le conteneur
* si c'est un objet porté, on met dans les objets portés
2022-09-25 18:45:40 +02:00
Vincent Vandemeulebrouck
5a2bc69fbb Typo "nuage" dans les signes draconiques 2022-09-25 17:50:07 +02:00
57dfdf0b65 Merge fixes from Vincent 2022-09-24 09:58:45 +02:00
028e8b883f Merge pull request 'Corrections et quelques améliorations' (#557) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: #557
2022-09-24 09:57:44 +02:00
Vincent Vandemeulebrouck
4bab69b88f Fix: déplacement de contenu rangé 2022-09-24 01:05:32 +02:00
Vincent Vandemeulebrouck
be0c0fbf3a Correction de la monnaie de la serveuse 2022-09-24 00:53:27 +02:00
Vincent Vandemeulebrouck
cd4bf203e6 Corrections d'images dans les compendiums 2022-09-24 00:53:27 +02:00
Vincent Vandemeulebrouck
fc5674a7d8 TMR et acteurs à cocher pour les signe draconiques
Au lieu d'une liste à sélection multiple, choisir les types de TMR
avec des cases à cocher.

Lors de l'ajout de signes éphémères, sélectionner les personnages
avec des cases à cocher.
2022-09-24 00:53:27 +02:00
Vincent Vandemeulebrouck
fe80881405 Fenêtre de stress avec acteurs à cocher
Remplacement de la liste d'acteurs par des cases à cocher car la
sélection n'est pas visible
2022-09-24 00:53:27 +02:00
Vincent Vandemeulebrouck
3a29c25b09 Fix: calculs des bonus de potions
Le calcul du bonus d'herbe d'une potion dépend des brins manquants.

La fabrication de potion propose les nombres de brins pour avoir un
effet. Impossible de faire une potion si on n'a pas assez de brins.

La puissance/points de guérison des potions magiques sont affichées lors
 de la consomation
2022-09-23 02:23:20 +02:00
Vincent Vandemeulebrouck
e2ff813226 Fix: pas plus de lots que disponibles
On pouvait saisir à la main un nombre de lots plus grand que le nombre
disponible, ce qui multipliait la quantité par ce nombre de lots
2022-09-23 01:32:18 +02:00
Vincent Vandemeulebrouck
b67f230212 Fix actionPrincipale de l'équipement 2022-09-23 00:57:02 +02:00
Vincent Vandemeulebrouck
47f9e1adaa Fix boutons d'avancement des heures
Bloqués par la recherche de maladies/poisons pour afficher le
message sur leurs effets
2022-09-23 00:46:57 +02:00
Vincent Vandemeulebrouck
33808b8cf0 Fix transfert de contenants 2022-09-23 00:46:57 +02:00
0d67d9af88 New v10.0.18 release 2022-09-22 08:35:57 +02:00
45a562f502 Merge pull request 'Stabilisation v10.0.18' (#556) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: #556
2022-09-22 08:34:46 +02:00
Vincent Vandemeulebrouck
21fc62b302 Fix de la séquence TMR
Lors d'une rencontre/case humide/conquête/..., le haut rêvant
déclenchait tout de même les sorts en réserve
2022-09-22 01:19:10 +02:00
Vincent Vandemeulebrouck
c37c68e6db Fix erreur quand la fenêtre est fermée
Erreur dans les logs, par exemple, suite à une rencontre
2022-09-22 01:19:10 +02:00
Vincent Vandemeulebrouck
ca893088d2 Détails de case pour les sorts en réserve 2022-09-22 01:19:10 +02:00
Vincent Vandemeulebrouck
e69fb222c3 Affiche le type de case si TMR cachées 2022-09-22 01:19:10 +02:00
Vincent Vandemeulebrouck
c76bf912d1 Fix compteur d'utilisations d'esquive 2022-09-22 01:19:10 +02:00
Vincent Vandemeulebrouck
4b1573ab8b Rétablissement des icônes RdD des onglets Foundry
Perdus avec le changement d'entrée FontAwsome
2022-09-22 01:19:10 +02:00
e0049cc2f7 v10 mods+fixes 2022-09-20 07:48:36 +02:00
8e0949442d Merge pull request 'Stabilisation de la v10' (#555) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: #555
2022-09-20 07:46:17 +02:00
Vincent Vandemeulebrouck
28427bc7c7 Initiative et competences créatures
Fix de l'initiative des compétences de créatures
* armes naturelles en général
* lancer pour les pierres lancées des Glous et Mariols

La catégorie de parade: remplace l'utilisation de "isparade"

Migration autoimatique des items du monde
Modification des compendiums
2022-09-20 00:14:34 +02:00
Vincent Vandemeulebrouck
50980d5216 Fix Initiative: utilise l'action, pas l'arme 2022-09-20 00:14:18 +02:00
Vincent Vandemeulebrouck
a75ee8fbc6 Fix RollTables: utilisent data, pas system 2022-09-20 00:14:18 +02:00
Vincent Vandemeulebrouck
78c757a21a Ajout des images dans le haut-rêve 2022-09-20 00:14:18 +02:00
Vincent Vandemeulebrouck
6d06c96497 chgt endurance ne rend plus inconscient 2022-09-20 00:14:18 +02:00
Vincent Vandemeulebrouck
5402508b26 Le "label for" indique le "name" du contrôle 2022-09-20 00:14:18 +02:00
Vincent Vandemeulebrouck
43d097581e Log de l'acteur avec monnaies manquantes 2022-09-19 20:22:30 +02:00
Vincent Vandemeulebrouck
7785851719 Log de l'actor dont les sorts sont migrés 2022-09-19 20:22:30 +02:00
8f127bc66b Corrections diverses suite v10 2022-09-18 08:57:45 +02:00
8c5f6b8f1b Merge pull request 'Corrections des TMRs et des Statuis' (#554) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: #554
2022-09-18 08:55:40 +02:00
Vincent Vandemeulebrouck
00630849cb Réinsertion sortie de carte
En sortant de la carte (avec les flèches de direction), le demi-rêve
est maintenant bien réinséré aléatoirement
2022-09-18 01:00:38 +02:00
Vincent Vandemeulebrouck
c4392f0320 Fix TMR accessibles par une rencontre
Les cases n'étaient polus accessibles, ni coloriées
2022-09-18 01:00:38 +02:00
Vincent Vandemeulebrouck
7a92ee85ef Nettoyage des status effects
* Recherche et suppression toujours par flags.core.statusId
* l'ajout d'un status depuis le token est maintenant équivallent
  à l'ajout par le code
* Correction des demi-surprises
* Correction du Demi-rêve (qui ne disparaissait pas)
* fix de la selection dans la configuration système
2022-09-18 01:00:36 +02:00
Vincent Vandemeulebrouck
56ea9dd2e4 Sorts en réserve éditables 2022-09-17 22:35:17 +02:00
ee42902b5c Gestion reserve et queues ameliores(Vincent) 2022-09-17 09:09:09 +02:00
838d4381a4 Merge pull request 'Refouler des queues et supprimer des sorts en réserve' (#553) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: #553
2022-09-17 09:04:19 +02:00
Vincent Vandemeulebrouck
2232224951 Suppression de sorts en réserve 2022-09-17 01:54:27 +02:00
Vincent Vandemeulebrouck
1251d04860 Action Refoulement de queue 2022-09-17 01:54:27 +02:00
63c6d5ff0f Integration fixes Vincent 2022-09-16 08:35:48 +02:00
c0d37e42ca Merge pull request 'Petits fixes suite à tests' (#552) from VincentVk/foundryvtt-reve-de-dragon:v10-fixes into v10
Reviewed-on: #552
2022-09-16 08:34:18 +02:00
Vincent Vandemeulebrouck
c8c13d626c Fix drop item sans actor 2022-09-16 02:41:54 +02:00
Vincent Vandemeulebrouck
e1ca7ab738 Amélioration des monnaies
On peut maintenant supprimer es monnaies tant qu'on garde une monnaie
pour chaque valeur de base
2022-09-16 02:41:08 +02:00
Vincent Vandemeulebrouck
8f1ee315ef Template en-tête standard 2022-09-16 02:24:08 +02:00
Vincent Vandemeulebrouck
5daf15901a Correction erreur xp restant 2022-09-16 02:24:08 +02:00
bddaecbc74 Fix entite 2022-09-11 16:14:27 +02:00
87fdd655d4 Merge v10 fixes 2022-09-07 23:09:21 +02:00
9cbb12e900 Merge pull request 'Utilisation de system dans les Item/Actor Sheet' (#551) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: #551
2022-09-07 23:08:26 +02:00
Vincent Vandemeulebrouck
509b7f97dc Utilisation de system dans les Item/Actor Sheet
Utilisation de system dans les data de formulaire pour tous
les Item/Actor (à la base, ou les sous-éléments)

Corrections sur les sorts en réserve (ce ne sont pas des Item)

Petites améliorations:

* `actor.itemTypes[type]`
   revient à faire (sans besoin de filtrer)
    `actor.items.filter(it => it.type == type)`
* dans les ItemSheet, this.object et this.document
  remplacés par this.item
* dans les ActorSheet, this.object et this.document
  remplacés par this.actor

Quelques corrections en plus:
* parade ne marchait pas
* problèmes sur le commerce
2022-09-07 18:47:56 +02:00
5cd9fb3a1c v10 WIP 2022-09-07 09:14:42 +02:00
336767c19e v10 WIP 2022-09-07 09:01:23 +02:00
5a32cf26dc Merge pull request 'Corrections v10' (#550) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: #550
2022-09-07 08:17:41 +02:00
Vincent Vandemeulebrouck
67b0555b11 Corrections v10
Il y en avait partout dans des dialogues, des options,
le drag&drop d'acteur sur acteur, l'empilage d'objet...
2022-09-07 00:36:52 +02:00
59613c3bf8 Sync 2022-09-06 23:52:21 +02:00
e257b6fbee v10 sync 2022-08-31 22:31:27 +02:00
ea990d7c4e Merge VK mods 2022-08-28 08:46:26 +02:00
6271c75508 Merge VK mods 2022-08-28 08:41:53 +02:00
cd7cc8eeef Merge pull request 'Amélioration de la feuille de personnages' (#547) from VincentVk/foundryvtt-reve-de-dragon:v1.5 into v1.5
Reviewed-on: #547
2022-08-28 08:40:51 +02:00
Vincent Vandemeulebrouck
bb3bc0ea77 Suppression logs hbs 2022-08-27 23:17:05 +02:00
Vincent Vandemeulebrouck
f348f3dc3f Condenser les listes (sauf caractéristiques 2022-08-27 23:14:27 +02:00
Vincent Vandemeulebrouck
dbf9f5e908 Améliorations des boutons fontawesome&css 2022-08-27 23:14:27 +02:00
Vincent Vandemeulebrouck
e4da124579 Filtrer les catégories sans compétences 2022-08-27 23:14:27 +02:00
Vincent Vandemeulebrouck
6e361a5531 Ne pas raffraîchir si le text ne change pas 2022-08-27 23:14:27 +02:00
Vincent Vandemeulebrouck
049b23c666 Boutons +/- de fontawsome 2022-08-27 23:14:27 +02:00
Vincent Vandemeulebrouck
3ff59d1f07 Amélioration rendu équipement 2022-08-27 23:14:27 +02:00
cfe8bee1c2 Merge brnch 2022-08-27 19:16:27 +02:00
8c0fbf15b6 Merge VK features 2022-08-27 19:12:44 +02:00
d4fddf8600 Merge pull request 'Arbre de conteneurs et recherche améliorée' (#546) from VincentVk/foundryvtt-reve-de-dragon:v1.5 into v1.5
Reviewed-on: #546
2022-08-27 19:11:56 +02:00
Vincent Vandemeulebrouck
4b1862fa48 Arborescence de conteneurs
Les conteneurs sont maintenant précédés d'une icone:
* pour ouvrir:  '+'
* pour fermer: '-'
* si vide: carré vide
2022-08-26 22:23:09 +02:00
Vincent Vandemeulebrouck
82115ed8d7 Amélioration recherche
La recherche de compétence fonctionne sur timer
2022-08-26 22:23:08 +02:00
158 changed files with 3017 additions and 2943 deletions

View File

@@ -41,7 +41,8 @@
"TypeOmbre": "Ombre de Thanatos", "TypeOmbre": "Ombre de Thanatos",
"TypeSouffle": "Souffle de Dragon", "TypeSouffle": "Souffle de Dragon",
"TypeTete": "Tête de Dragon", "TypeTete": "Tête de Dragon",
"TypePossession": "Possession" "TypePossession": "Possession",
"TypeSortreserve": "Sort en réserve"
}, },
"EFFECT": { "EFFECT": {
"StatusStunned": "Sonné", "StatusStunned": "Sonné",

View File

@@ -30,8 +30,8 @@ export class RdDActorCreatureSheet extends RdDActorSheet {
let formData = await super.getData() let formData = await super.getData()
//console.log("Creature : ", formData, formData.system) //console.log("Creature : ", formData, formData.system)
formData.calc = { formData.calc = {
caracTotal: RdDCarac.computeTotal(formData.data.carac), caracTotal: RdDCarac.computeTotal(formData.system.carac),
resumeBlessures: this.actor.computeResumeBlessure(formData.data.blessures), resumeBlessures: this.actor.computeResumeBlessure(formData.system.blessures),
encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(), encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(),
surEncombrementMessage: this.actor.getMessageSurEncombrement() surEncombrementMessage: this.actor.getMessageSurEncombrement()
} }

View File

@@ -25,23 +25,21 @@ export class RdDActorEntiteSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
const objectData = this.object;
let formData = { let formData = {
title: this.title, title: this.title,
id: objectData.id, id: this.actor.id,
type: objectData.type, type: this.actor.type,
img: objectData.img, img: this.actor.img,
name: objectData.name, name: this.actor.name,
// actor: this.object,
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
data: foundry.utils.deepClone(this.actor.system), system: foundry.utils.deepClone(this.actor.system),
effects: this.object.effects.map(e => foundry.utils.deepClone(e)), effects: this.actor.effects.map(e => foundry.utils.deepClone(e)),
// items: items, // items: items,
limited: this.object.limited, limited: this.actor.limited,
options: this.options, options: this.options,
owner: this.document.isOwner, owner: this.actor.isOwner,
itemsByType: Misc.classify(this.object.items.map(i => foundry.utils.deepClone(i))), itemsByType: Misc.classify(this.actor.items.map(i => foundry.utils.deepClone(i))),
}; };
formData.options.isGM = game.user.isGM; formData.options.isGM = game.user.isGM;
@@ -141,6 +139,6 @@ export class RdDActorEntiteSheet extends ActorSheet {
/** @override */ /** @override */
_updateObject(event, formData) { _updateObject(event, formData) {
// Update the Actor // Update the Actor
return this.object.update(formData); return this.actor.update(formData);
} }
} }

View File

@@ -15,6 +15,7 @@ import { DialogSplitItem } from "./dialog-split-item.js";
import { ReglesOptionelles } from "./regles-optionelles.js"; import { ReglesOptionelles } from "./regles-optionelles.js";
import { DialogRepos } from "./dialog-repos.js"; import { DialogRepos } from "./dialog-repos.js";
import { RdDSheetUtility } from "./rdd-sheet-utility.js"; import { RdDSheetUtility } from "./rdd-sheet-utility.js";
import { STATUSES } from "./status-effects.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
export class RdDActorSheet extends ActorSheet { export class RdDActorSheet extends ActorSheet {
@@ -36,23 +37,22 @@ export class RdDActorSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
const objectData = this.object.system this.timerRecherche = undefined;
console.log("New actor", objectData)
let formData = { let formData = {
title: this.title, title: this.title,
id: this.object.id, id: this.actor.id,
type: this.object.type, type: this.actor.type,
img: this.object.img, img: this.actor.img,
name: this.object.name, name: this.actor.name,
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
data: foundry.utils.deepClone(this.actor.system), system: foundry.utils.deepClone(this.actor.system),
effects: this.object.effects.map(e => foundry.utils.deepClone(e)), effects: this.actor.effects.map(e => foundry.utils.deepClone(e)),
limited: this.object.limited, limited: this.actor.limited,
options: this.options, options: this.options,
owner: this.document.isOwner, owner: this.actor.isOwner,
itemsByType: Misc.classify(this.object.items.map(i => foundry.utils.deepClone(i))), itemsByType: Misc.classify(this.actor.items.map(i => foundry.utils.deepClone(i))),
} }
RdDUtility.filterItemsPerTypeForSheet(formData) RdDUtility.filterItemsPerTypeForSheet(formData)
@@ -65,24 +65,23 @@ export class RdDActorSheet extends ActorSheet {
formData.calc = { formData.calc = {
comptageArchetype: RdDItemCompetence.computeResumeArchetype(formData.competences), comptageArchetype: RdDItemCompetence.computeResumeArchetype(formData.competences),
competenceXPTotal: RdDItemCompetence.computeTotalXP(formData.competences), competenceXPTotal: RdDItemCompetence.computeTotalXP(formData.competences),
caracTotal: RdDCarac.computeTotal(formData.data.carac, formData.data.beaute), caracTotal: RdDCarac.computeTotal(formData.system.carac, formData.system.beaute),
// Mise à jour de l'encombrement total et du prix de l'équipement // Mise à jour de l'encombrement total et du prix de l'équipement
encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(), encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(),
prixTotalEquipement: this.actor.computePrixTotalEquipement(), prixTotalEquipement: this.actor.computePrixTotalEquipement(),
surprise: RdDBonus.find(this.actor.getSurprise(false)).descr, surprise: RdDBonus.find(this.actor.getSurprise(false)).descr,
fatigue: RdDUtility.calculFatigueHtml(formData.data.sante.fatigue.value, formData.data.sante.endurance.max), fatigue: RdDUtility.calculFatigueHtml(formData.system.sante.fatigue.value, formData.system.sante.endurance.max),
resumeBlessures: this.actor.computeResumeBlessure(formData.data.blessures), resumeBlessures: this.actor.computeResumeBlessure(formData.system.blessures),
surEncombrementMessage: this.actor.getMessageSurEncombrement() surEncombrementMessage: this.actor.getMessageSurEncombrement()
}; };
formData.competences.forEach(item => { formData.competences.forEach(item => {
item.system.visible = this.options.cherchercompetence item.system.isVisible = this.options.recherche
? RdDItemCompetence.nomContientTexte(item, this.options.cherchercompetence) ? RdDItemCompetence.nomContientTexte(item, this.options.recherche.text)
: (!this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(item)); : (!this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(item));
RdDItemCompetence.levelUp(item, formData.data.compteurs.experience.value); RdDItemCompetence.levelUp(item, formData.system.compteurs.experience.value);
}); });
Object.values(formData.system.carac).forEach(c => {
Object.values(formData.data.carac).forEach(c => {
RdDCarac.levelUp(c); RdDCarac.levelUp(c);
}); });
@@ -90,9 +89,9 @@ export class RdDActorSheet extends ActorSheet {
// toujours avoir une liste d'armes (pour mettre esquive et corps à corps) // toujours avoir une liste d'armes (pour mettre esquive et corps à corps)
formData.combat = duplicate(formData.armes ?? []); formData.combat = duplicate(formData.armes ?? []);
RdDItemArme.computeNiveauArmes(formData.combat, formData.competences); RdDItemArme.computeNiveauArmes(formData.combat, formData.competences);
RdDItemArme.ajoutCorpsACorps(formData.combat, formData.competences, formData.data.carac); RdDItemArme.ajoutCorpsACorps(formData.combat, formData.competences, formData.system.carac);
formData.esquives = this.actor.getCompetences("Esquive").map(i => foundry.utils.deepClone(i.system)); formData.esquives = this.actor.getCompetences("Esquive");
formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.data.carac); formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.system.carac);
this.armesList = formData.combat; this.armesList = formData.combat;
@@ -101,9 +100,8 @@ export class RdDActorSheet extends ActorSheet {
formData.difficultesLibres = CONFIG.RDD.difficultesLibres; formData.difficultesLibres = CONFIG.RDD.difficultesLibres;
formData.hautreve = { formData.hautreve = {
isDemiReve: this.actor.getEffectByLabel("Demi-rêve"), isDemiReve: this.actor.getEffect(STATUSES.StatusDemiReve),
sortsReserve: formData.data.reve.reserve.list, rencontres: duplicate(formData.system.reve.rencontre.list),
rencontres: duplicate(formData.data.reve.rencontre.list),
casesTmr: formData.itemsByType.casetmr, casesTmr: formData.itemsByType.casetmr,
cacheTMR: this.actor.isTMRCache() cacheTMR: this.actor.isTMRCache()
} }
@@ -129,8 +127,8 @@ export class RdDActorSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async _onDropActor(event, dragData) { async _onDropActor(event, dragData) {
console.log("_onDropActor", this.actor.id, dragData); const dropActor = fromUuidSync(dragData.uuid);
this.actor.addSubActeur(dragData.id || dragData.data._id); this.actor.addSubActeur(dropActor);
super._onDropActor(event, dragData); super._onDropActor(event, dragData);
} }
@@ -182,7 +180,8 @@ export class RdDActorSheet extends ActorSheet {
}); });
html.find('.item-delete').click(async event => { html.find('.item-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event); const li = RdDSheetUtility.getEventElement(event);
RdDUtility.confirmerSuppression(this, li); const item = this.actor.getObjet(li.data("item-id"));
RdDUtility.confirmerSuppressionItem(this, item, li);
}); });
html.find('.item-vendre').click(async event => { html.find('.item-vendre').click(async event => {
const item = RdDSheetUtility.getItem(event, this.actor); const item = RdDSheetUtility.getItem(event, this.actor);
@@ -199,7 +198,11 @@ export class RdDActorSheet extends ActorSheet {
}); });
html.find('.subacteur-delete').click(async event => { html.find('.subacteur-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event); const li = RdDSheetUtility.getEventElement(event);
RdDUtility.confirmerSuppressionSubacteur(this, li); const actorId = li.data("actor-id");
if (actorId) {
const subActor = game.actors.get(actorId);
RdDUtility.confirmerSuppressionSubacteur(this, subActor, li);
}
}); });
html.find('.encaisser-direct').click(async event => { html.find('.encaisser-direct').click(async event => {
@@ -331,7 +334,7 @@ export class RdDActorSheet extends ActorSheet {
}); });
// Initiative pour l'arme // Initiative pour l'arme
html.find('.arme-initiative a').click(async event => { html.find('.arme-initiative a').click(async event => {
let combatant = game.combat.data.combatants.find(c => c.actor.data._id == this.actor.data._id); let combatant = game.combat.combatants.find(c => c.actor.id == this.actor.id);
if (combatant) { if (combatant) {
let action = this._getEventArmeCombat(event); let action = this._getEventArmeCombat(event);
RdDCombatManager.rollInitiativeAction(combatant._id, action); RdDCombatManager.rollInitiativeAction(combatant._id, action);
@@ -358,11 +361,15 @@ export class RdDActorSheet extends ActorSheet {
await DialogRepos.create(this.actor); await DialogRepos.create(this.actor);
}); });
html.find('.delete-active-effect').click(async event => { html.find('.delete-active-effect').click(async event => {
let id = $(event.currentTarget).parents(".active-effect").data('id'); if (game.user.isGM) {
this.actor.enleverActiveEffectById(id); let effect = $(event.currentTarget).parents(".active-effect").data('effect');
this.actor.removeEffect(effect);
}
}); });
html.find('.enlever-tous-effets').click(async event => { html.find('.enlever-tous-effets').click(async event => {
this.actor.enleverTousLesEffets(); if (game.user.isGM) {
await this.actor.removeEffects();
}
}); });
html.find('.conteneur-name a').click(async event => { html.find('.conteneur-name a').click(async event => {
RdDUtility.toggleAfficheContenu(RdDSheetUtility.getItemId(event)); RdDUtility.toggleAfficheContenu(RdDSheetUtility.getItemId(event));
@@ -383,12 +390,10 @@ export class RdDActorSheet extends ActorSheet {
// On carac change // On carac change
html.find('.carac-value').change(async event => { html.find('.carac-value').change(async event => {
let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", ""); let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "");
//console.log("Value changed :", event, caracName);
this.actor.updateCarac(caracName, parseInt(event.target.value)); this.actor.updateCarac(caracName, parseInt(event.target.value));
}); });
html.find('.carac-xp').change(async event => { html.find('input.carac-xp').change(async event => {
let caracName = event.currentTarget.name.replace(".xp", "").replace("system.carac.", ""); let caracName = event.currentTarget.name.replace(".xp", "").replace("system.carac.", "");
//console.log("Value changed :", event, caracName);
this.actor.updateCaracXP(caracName, parseInt(event.target.value)); this.actor.updateCaracXP(caracName, parseInt(event.target.value));
}); });
// On competence change // On competence change
@@ -398,12 +403,12 @@ export class RdDActorSheet extends ActorSheet {
this.actor.updateCompetence(compName, parseInt(event.target.value)); this.actor.updateCompetence(compName, parseInt(event.target.value));
}); });
// On competence xp change // On competence xp change
html.find('.competence-xp').change(async event => { html.find('input.competence-xp').change(async event => {
let compName = event.currentTarget.attributes.compname.value; let compName = event.currentTarget.attributes.compname.value;
this.actor.updateCompetenceXP(compName, parseInt(event.target.value)); this.actor.updateCompetenceXP(compName, parseInt(event.target.value));
}); });
// On competence xp change // On competence xp change
html.find('.competence-xp-sort').change(async event => { html.find('input.competence-xp-sort').change(async event => {
let compName = event.currentTarget.attributes.compname.value; let compName = event.currentTarget.attributes.compname.value;
this.actor.updateCompetenceXPSort(compName, parseInt(event.target.value)); this.actor.updateCompetenceXPSort(compName, parseInt(event.target.value));
}); });
@@ -422,12 +427,31 @@ export class RdDActorSheet extends ActorSheet {
this.options.editCaracComp = !this.options.editCaracComp; this.options.editCaracComp = !this.options.editCaracComp;
this.render(true); this.render(true);
}); });
html.find('.cherchercompetence').change(async event => {
this.options.cherchercompetence = event.currentTarget.value; html.find('.recherche')
this.render(true); .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)
);
html.find('.vue-detaillee').click(async event => { html.find('.vue-detaillee').click(async event => {
console.log("CONTROLS", this.options.vueDetaillee)
this.options.vueDetaillee = !this.options.vueDetaillee; this.options.vueDetaillee = !this.options.vueDetaillee;
this.render(true); this.render(true);
}); });
@@ -435,7 +459,7 @@ export class RdDActorSheet extends ActorSheet {
// On pts de reve change // On pts de reve change
html.find('.pointsreve-value').change(async event => { html.find('.pointsreve-value').change(async event => {
let reveValue = event.currentTarget.value; let reveValue = event.currentTarget.value;
this.actor.update({ "data.reve.reve.value": reveValue }); this.actor.update({ "system.reve.reve.value": reveValue });
}); });
// On seuil de reve change // On seuil de reve change
@@ -513,6 +537,17 @@ export class RdDActorSheet extends ActorSheet {
}); });
} }
_optionRecherche(target) {
if (!target.value?.length){
return undefined;
}
return {
text: target.value,
start: target.selectionStart,
end: target.selectionEnd,
};
}
_getEventArmeCombat(event) { _getEventArmeCombat(event) {
const li = $(event.currentTarget)?.parents(".item"); const li = $(event.currentTarget)?.parents(".item");
let armeName = li.data("arme-name"); let armeName = li.data("arme-name");
@@ -541,7 +576,7 @@ export class RdDActorSheet extends ActorSheet {
/** @override */ /** @override */
_updateObject(event, formData) { _updateObject(event, formData) {
// Update the Actor // Update the Actor
return this.object.update(formData); return this.actor.update(formData);
} }
async splitItem(item) { async splitItem(item) {
@@ -550,11 +585,11 @@ export class RdDActorSheet extends ActorSheet {
} }
async _onSplitItem(item, split) { async _onSplitItem(item, split) {
if (split >= 1 && split < Misc.data(item).data.quantite) { if (split >= 1 && split < item.system.quantite) {
await item.diminuerQuantite(split); await item.diminuerQuantite(split);
const itemData = duplicate(Misc.data(item)); const splitItem = duplicate(item);
itemData.data.quantite = split; splitItem.system.quantite = split;
await this.actor.createEmbeddedDocuments('Item', [itemData]) await this.actor.createEmbeddedDocuments('Item', [splitItem])
} }
} }

View File

@@ -27,21 +27,20 @@ export class RdDActorVehiculeSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
const objectData = this.object
let formData = { let formData = {
title: this.title, title: this.title,
id: objectData.id, id: this.actor.id,
type: objectData.type, type: this.actor.type,
img: objectData.img, img: this.actor.img,
name: objectData.name, name: this.actor.name,
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
data: foundry.utils.deepClone(this.object.system), system: foundry.utils.deepClone(this.actor.system),
effects: this.object.effects.map(e => foundry.utils.deepClone(e)), effects: this.actor.effects.map(e => foundry.utils.deepClone(e)),
limited: this.object.limited, limited: this.actor.limited,
options: this.options, options: this.options,
owner: this.document.isOwner, owner: this.actor.isOwner,
itemsByType: Misc.classify(this.object.items.map(i => foundry.utils.deepClone(i))), itemsByType: Misc.classify(this.actor.items.map(i => foundry.utils.deepClone(i))),
}; };
RdDUtility.filterItemsPerTypeForSheet(formData); RdDUtility.filterItemsPerTypeForSheet(formData);
@@ -105,7 +104,8 @@ export class RdDActorVehiculeSheet extends ActorSheet {
// Delete Inventory Item // Delete Inventory Item
html.find('.item-delete').click(async event => { html.find('.item-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event); const li = RdDSheetUtility.getEventElement(event);
RdDUtility.confirmerSuppression(this, li); const item = this.actor.getObjet(li.data("item-id"));
RdDUtility.confirmerSuppressionItem(this, item, li);
}); });
html.find('.item-vendre').click(async event => { html.find('.item-vendre').click(async event => {
const item = RdDSheetUtility.getItem(event, this.actor); const item = RdDSheetUtility.getItem(event, this.actor);
@@ -160,6 +160,6 @@ export class RdDActorVehiculeSheet extends ActorSheet {
/** @override */ /** @override */
_updateObject(event, formData) { _updateObject(event, formData) {
// Update the Actor // Update the Actor
return this.object.update(formData); return this.actor.update(formData);
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
export const MESSAGE_DATA = 'message-data';
/** /**
* Class providing helper methods to get the list of users, and * Class providing helper methods to get the list of users, and
@@ -19,61 +18,50 @@ export class ChatUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static notifyUser(userId, level = 'info', message) { static notifyUser(userId, level = 'info', message) {
const data = { const socketData = {
userId: userId, level: level, message: message userId: userId, level: level, message: message
}; };
if (game.user.id == userId) { if (game.user.id == userId) {
ChatUtility.onNotifyUser(data); ChatUtility.onNotifyUser(socketData);
} }
else { else {
game.socket.emit(SYSTEM_SOCKET_ID, { game.socket.emit(SYSTEM_SOCKET_ID, {
msg: "msg_user_ui_notifications", data: data msg: "msg_user_ui_notifications", data: socketData
}); });
} }
} }
static onNotifyUser(data) { static onNotifyUser(socketData) {
if (game.user.id == data.userId) { if (game.user.id == socketData.userId) {
switch (data.level) { switch (socketData.level) {
case 'warn': ui.notifications.warn(data.message); break; case 'warn': ui.notifications.warn(socketData.message); break;
case 'error': ui.notifications.error(data.message); break; case 'error': ui.notifications.error(socketData.message); break;
default: ui.notifications.info(data.message); break; default: ui.notifications.info(socketData.message); break;
} }
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static onRemoveMessages(data) { static onRemoveMessages(socketData) {
if (Misc.isUniqueConnectedGM()) { if (Misc.isUniqueConnectedGM()) {
if (data.part) { if (socketData.part) {
const toDelete = game.messages.filter(it => it.data.content.includes(data.part)); const toDelete = game.messages.filter(it => it.content.includes(socketData.part));
toDelete.forEach(it => it.delete()); toDelete.forEach(it => it.delete());
} }
if (data.messageId) { if (socketData.messageId) {
game.messages.get(data.messageId)?.delete(); game.messages.get(socketData.messageId)?.delete();
} }
} }
} }
static onRemoveMessages(data) {
if (Misc.isUniqueConnectedGM()) {
if (data.part) {
const toDelete = game.messages.filter(it => it.content.includes(data.part));
toDelete.forEach(it => it.delete());
}
if (data.messageId) {
game.messages.get(data.messageId)?.delete();
}
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static removeMessages(data) { static removeMessages(socketData) {
if (Misc.isUniqueConnectedGM()) { if (Misc.isUniqueConnectedGM()) {
ChatUtility.onRemoveMessages(data); ChatUtility.onRemoveMessages(socketData);
} }
else { else {
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_delete_chat_message", data: data }); game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_delete_chat_message", data: socketData });
} }
} }
@@ -141,7 +129,7 @@ export class ChatUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static getUsers(filter) { static getUsers(filter) {
return Misc.getUsers().filter(filter).map(user => user.data._id); return Misc.getUsers().filter(filter).map(user => user.id);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -154,17 +142,17 @@ export class ChatUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static handleGMChatMessage(data) { static handleGMChatMessage(socketData) {
console.log("blindMessageToGM", data); console.log("blindMessageToGM", socketData);
if (game.user.isGM) { // message privé pour GM only if (game.user.isGM) { // message privé pour GM only
data.user = game.user.id; socketData.user = game.user.id;
ChatMessage.create(data); ChatMessage.create(socketData);
} }
} }
static async setMessageData(chatMessage, key, data) { static async setMessageData(chatMessage, key, flag) {
if (data) { if (flag) {
await chatMessage.setFlag(SYSTEM_RDD, key, JSON.stringify(data)); await chatMessage.setFlag(SYSTEM_RDD, key, JSON.stringify(flag));
} }
} }

View File

@@ -1,5 +1,6 @@
export const SYSTEM_RDD = 'foundryvtt-reve-de-dragon'; export const SYSTEM_RDD = 'foundryvtt-reve-de-dragon';
export const SYSTEM_SOCKET_ID = 'system.foundryvtt-reve-de-dragon'; export const SYSTEM_SOCKET_ID = 'system.foundryvtt-reve-de-dragon';
export const LOG_HEAD = 'RdD | ';
export const HIDE_DICE = 'hide'; export const HIDE_DICE = 'hide';
export const SHOW_DICE = 'show'; export const SHOW_DICE = 'show';

View File

@@ -1,7 +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-signedraconique.js";
import { Misc } from "./misc.js";
import { TMRUtility } from "./tmr-utility.js"; import { TMRUtility } from "./tmr-utility.js";
export class DialogCreateSigneDraconique extends Dialog { export class DialogCreateSigneDraconique extends Dialog {
@@ -10,12 +9,13 @@ export class DialogCreateSigneDraconique extends Dialog {
const signe = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true}); const signe = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});
let dialogData = { let dialogData = {
signe: signe, signe: signe,
tmrs: TMRUtility.listSelectedTMR(signe.data.typesTMR ?? []), tmrs: TMRUtility.buildSelectionTypesTMR(signe.system.typesTMR),
actors: game.actors.filter(actor => actor.isHautRevant()).map(actor => { actors: game.actors.filter(actor => actor.isPersonnage() && actor.isHautRevant())
let actorData = duplicate(actor); .map(actor => ({
actorData.selected = actor.hasPlayerOwner; id: actor.id,
return actorData; name: actor.name,
}) selected: true
}))
}; };
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-create-signedraconique.html", dialogData); const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-create-signedraconique.html", dialogData);
@@ -23,12 +23,11 @@ export class DialogCreateSigneDraconique extends Dialog {
.render(true); .render(true);
} }
constructor(dialogData, html, callback) { constructor(dialogData, html) {
let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 500, height: 650, 'z-index': 99999 }; let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 500, height: 650, 'z-index': 99999 };
let conf = { let conf = {
title: "Créer un signe", title: "Créer un signe",
content: html, content: html,
default: "Ajouter aux haut-rêvants",
buttons: { buttons: {
"Ajouter aux haut-rêvants": { label: "Ajouter aux haut-rêvants", callback: it => { this._onCreerSigneActeurs(); } } "Ajouter aux haut-rêvants": { label: "Ajouter aux haut-rêvants", callback: it => { this._onCreerSigneActeurs(); } }
} }
@@ -38,10 +37,11 @@ export class DialogCreateSigneDraconique extends Dialog {
} }
async _onCreerSigneActeurs() { async _onCreerSigneActeurs() {
await $("[name='signe.data.ephemere']").change(); await $("[name='signe.system.ephemere']").change();
await $(".signe-xp-sort").change(); await $(".signe-xp-sort").change();
this.validerSigne(); this.validerSigne();
this.dialogData.actors.filter(it => it.selected).map(it => game.actors.get(it._id)) this.dialogData.actors.filter(it => it.selected)
.map(it => game.actors.get(it.id))
.forEach(actor => this._createSigneForActor(actor, this.dialogData.signe)); .forEach(actor => this._createSigneForActor(actor, this.dialogData.signe));
} }
@@ -58,61 +58,70 @@ export class DialogCreateSigneDraconique extends Dialog {
validerSigne() { validerSigne() {
this.dialogData.signe.name = $("[name='signe.name']").val(); this.dialogData.signe.name = $("[name='signe.name']").val();
this.dialogData.signe.data.valeur.norm = $("[name='signe.data.valeur.norm']").val(); this.dialogData.signe.system.valeur.norm = $("[name='signe.system.valeur.norm']").val();
this.dialogData.signe.data.valeur.sign = $("[name='signe.data.valeur.sign']").val(); this.dialogData.signe.system.valeur.sign = $("[name='signe.system.valeur.sign']").val();
this.dialogData.signe.data.valeur.part = $("[name='signe.data.valeur.part']").val(); this.dialogData.signe.system.valeur.part = $("[name='signe.system.valeur.part']").val();
this.dialogData.signe.data.difficulte = $("[name='signe.data.difficulte']").val(); this.dialogData.signe.system.difficulte = $("[name='signe.system.difficulte']").val();
this.dialogData.signe.data.ephemere = $("[name='signe.data.ephemere']").prop("checked"); this.dialogData.signe.system.ephemere = $("[name='signe.system.ephemere']").prop("checked");
this.dialogData.signe.data.duree = $("[name='signe.data.duree']").val(); this.dialogData.signe.system.duree = $("[name='signe.system.duree']").val();
this.dialogData.signe.data.typesTMR = $(".select-tmr").val(); this.dialogData.signe.system.typesTMR = TMRUtility.buildListTypesTMRSelection(this.dialogData.tmrs);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
this.setEphemere(this.dialogData.signe.data.ephemere); this.setEphemere(this.dialogData.signe.system.ephemere);
html.find(".signe-aleatoire").click(event => this.setSigneAleatoire()); html.find(".signe-aleatoire").click(event => this.setSigneAleatoire());
html.find("[name='signe.data.ephemere']").change((event) => this.setEphemere(event.currentTarget.checked)); html.find("[name='signe.system.ephemere']").change((event) => this.setEphemere(event.currentTarget.checked));
html.find(".select-actor").change((event) => this.onSelectActor(event));
html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event)); html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event));
html.find("input.select-actor").change((event) => this.onSelectActor(event));
html.find("input.select-tmr").change((event) => this.onSelectTmr(event));
} }
async setSigneAleatoire() { async setSigneAleatoire() {
const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true}); const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});
$("[name='signe.name']").val(newSigne.name); $("[name='signe.name']").val(newSigne.name);
$("[name='signe.data.valeur.norm']").val(newSigne.data.valeur.norm); $("[name='signe.system.valeur.norm']").val(newSigne.system.valeur.norm);
$("[name='signe.data.valeur.sign']").val(newSigne.data.valeur.sign); $("[name='signe.system.valeur.sign']").val(newSigne.system.valeur.sign);
$("[name='signe.data.valeur.part']").val(newSigne.data.valeur.part); $("[name='signe.system.valeur.part']").val(newSigne.system.valeur.part);
$("[name='signe.data.difficulte']").val(newSigne.data.difficulte); $("[name='signe.system.difficulte']").val(newSigne.system.difficulte);
$("[name='signe.data.duree']").val(newSigne.data.duree); $("[name='signe.system.duree']").val(newSigne.system.duree);
$("[name='signe.data.ephemere']").prop("checked", newSigne.data.ephemere); $("[name='signe.system.ephemere']").prop("checked", newSigne.system.ephemere);
$(".select-tmr").val(newSigne.data.typesTMR); this.dialogData.tmrs = TMRUtility.buildSelectionTypesTMR(newSigne.system.typesTMR);
this.setEphemere(newSigne.data.ephemere); this.dialogData.tmrs.forEach(t => {
$(`[data-tmr-name='${t.name}']`).prop( "checked", t.selected);
})
this.setEphemere(newSigne.system.ephemere);
} }
async setEphemere(ephemere) { async setEphemere(ephemere) {
this.dialogData.signe.data.ephemere = ephemere; this.dialogData.signe.system.ephemere = ephemere;
HtmlUtility._showControlWhen($(".signe-data-duree"), ephemere); HtmlUtility._showControlWhen($(".signe-system-duree"), ephemere);
} }
async onSelectActor(event) { async onSelectActor(event) {
event.preventDefault(); const actorId = $(event.currentTarget)?.data("actor-id");
const options = event.currentTarget.options; const actor = this.dialogData.actors.find(it => it.id == actorId);
for (var i = 0; i < options.length; i++) { // looping over the options if (actor) {
const actorId = options[i].attributes["data-actor-id"].value; actor.selected = event.currentTarget.checked;
const actor = this.dialogData.actors.find(it => it._id == actorId); }
if (actor) {
actor.selected = options[i].selected;
}
};
} }
onSelectTmr(event) {
const tmrName = $(event.currentTarget)?.data("tmr-name");
const onTmr = this.tmrs.find(it => it.name == tmrName);
if (onTmr){
onTmr.selected = event.currentTarget.checked;
}
}
onValeurXpSort(event) { onValeurXpSort(event) {
const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0; const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0;
const xp = Number(event.currentTarget.value); const xp = Number(event.currentTarget.value);
const oldValeur = this.dialogData.signe.data.valeur; const oldValeur = this.dialogData.signe.system.valeur;
this.dialogData.signe.data.valeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur); this.dialogData.signe.system.valeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur);
} }
} }

View File

@@ -6,10 +6,15 @@ export class DialogFabriquerPotion extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async create(actor, item, dialogConfig) { static async create(actor, item, dialogConfig) {
const min = DialogFabriquerPotion.nombreBrinsMinimum(item);
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!`);
return;
}
let potionData = DialogFabriquerPotion.prepareData(actor, item); let potionData = DialogFabriquerPotion.prepareData(actor, item);
let conf = { let conf = {
title: `Fabriquer une potion de ${potionData.data.categorie}`, title: `Fabriquer une potion de ${potionData.system.categorie}`,
content: await renderTemplate(dialogConfig.html, potionData), content: await renderTemplate(dialogConfig.html, potionData),
default: potionData.buttonName, default: potionData.buttonName,
}; };
@@ -25,8 +30,11 @@ export class DialogFabriquerPotion extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
static prepareData(actor, item) { static prepareData(actor, item) {
let potionData = duplicate(item) let potionData = duplicate(item)
potionData.nbBrinsSelect = RdDUtility.buildListOptions(1, potionData.data.quantite); potionData.nbBrinsSelect = RdDUtility.buildListOptions(
potionData.nbBrins = Math.min(potionData.data.quantite, DialogFabriquerPotion.getNombreBrinOptimal(potionData)); DialogFabriquerPotion.nombreBrinsMinimum(item),
DialogFabriquerPotion.nombreBrinsOptimal(item));
potionData.nbBrins = Math.min(potionData.system.quantite, DialogFabriquerPotion.nombreBrinsOptimal(potionData));
potionData.herbebonus = item.system.niveau;
potionData.buttonName = "Fabriquer"; potionData.buttonName = "Fabriquer";
return potionData; return potionData;
} }
@@ -45,10 +53,18 @@ export class DialogFabriquerPotion extends Dialog {
this.potionData = potionData; this.potionData = potionData;
} }
static getNombreBrinOptimal(herbeData) { static nombreBrinsMinimum(herbeData) {
switch (herbeData.data.categorie ?? '') { switch (herbeData.system.categorie ?? '') {
case "Soin": return 12 - herbeData.data.niveau; case "Soin": return 1 + Math.max(0, 12 - 2 * herbeData.system.niveau);
case "Repos": return 7 - herbeData.data.niveau; case "Repos": return 1 + Math.max(0, 7 - 2 * herbeData.system.niveau);
}
return 1;
}
static nombreBrinsOptimal(herbeData) {
switch (herbeData.system.categorie ?? '') {
case "Soin": return 12 - herbeData.system.niveau;
case "Repos": return 7 - herbeData.system.niveau;
} }
return 1; return 1;
} }
@@ -59,6 +75,8 @@ export class DialogFabriquerPotion extends Dialog {
html.find("#nbBrins").change(event => { html.find("#nbBrins").change(event => {
this.potionData.nbBrins = Misc.toInt(event.currentTarget.value); this.potionData.nbBrins = Misc.toInt(event.currentTarget.value);
const brinsManquants = Math.max(0, DialogFabriquerPotion.nombreBrinsOptimal(this.potionData) - this.potionData.nbBrins);
this.potionData.herbebonus = Math.max(0, this.potionData.system.niveau - brinsManquants)
}); });
} }

View File

@@ -34,12 +34,12 @@ export class DialogItemAchat extends Dialog {
const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre"; const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre";
const buttons = {}; const buttons = {};
if (isConsommable) { if (isConsommable) {
buttons["consommer"] = { label: venteData.item.data.boisson ? "Boire" : "Manger", callback: it => { this.onAchatConsommer(); } } buttons["consommer"] = { label: venteData.item.system.boisson ? "Boire" : "Manger", callback: it => { this.onAchatConsommer(); } }
} }
buttons[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } }; buttons[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } };
buttons["decliner"] = { label: "Décliner", callback: it => { } }; buttons["decliner"] = { label: "Décliner", callback: it => { } };
let conf = { let conf = {
title: venteData.acheteur? venteData.acheteur.name + " - " + actionAchat : actionAchat, title: venteData.acheteur ? venteData.acheteur.name + " - " + actionAchat : actionAchat,
content: html, content: html,
default: actionAchat, default: actionAchat,
buttons: buttons buttons: buttons
@@ -56,11 +56,11 @@ export class DialogItemAchat extends Dialog {
static prepareVenteData(buttonAcheter, vendeurId, vendeur, acheteur) { static prepareVenteData(buttonAcheter, vendeurId, vendeur, acheteur) {
const jsondata = buttonAcheter.attributes['data-jsondata']?.value; const jsondata = buttonAcheter.attributes['data-jsondata']?.value;
const prixLot = parseInt(buttonAcheter.attributes['data-prixLot']?.value ?? 0); const prixLot = parseInt(buttonAcheter.attributes['data-prixLot']?.value ?? 0);
let venteData = { return {
item: JSON.parse(jsondata), item: JSON.parse(jsondata),
vendeurId: vendeurId, vendeurId: vendeurId,
vendeur: vendeur, vendeur: vendeur,
acheteur:acheteur, acheteur: acheteur,
tailleLot: parseInt(buttonAcheter.attributes['data-tailleLot']?.value ?? 1), tailleLot: parseInt(buttonAcheter.attributes['data-tailleLot']?.value ?? 1),
quantiteIllimite: buttonAcheter.attributes['data-quantiteIllimite']?.value == 'true', quantiteIllimite: buttonAcheter.attributes['data-quantiteIllimite']?.value == 'true',
quantiteNbLots: parseInt(buttonAcheter.attributes['data-quantiteNbLots']?.value), quantiteNbLots: parseInt(buttonAcheter.attributes['data-quantiteNbLots']?.value),
@@ -73,7 +73,6 @@ export class DialogItemAchat extends Dialog {
prixTotal: prixLot, prixTotal: prixLot,
isVente: prixLot > 0 isVente: prixLot > 0
}; };
return venteData;
} }
async onAchat() { async onAchat() {
@@ -87,7 +86,7 @@ export class DialogItemAchat extends Dialog {
choix: this.venteData.choix choix: this.venteData.choix
}); });
} }
async onAchatConsommer() { async onAchatConsommer() {
this.venteData.choix.consommer = true; this.venteData.choix.consommer = true;
await this.onAchat(); await this.onAchat();
@@ -106,8 +105,12 @@ export class DialogItemAchat extends Dialog {
} }
setNombreLots(nombreLots) { setNombreLots(nombreLots) {
this.venteData.choix.nombreLots = nombreLots; if (nombreLots > this.venteData.quantiteNbLots) {
ui.notifications.warn(`Seulement ${this.venteData.quantiteNbLots} lots disponibles, vous ne pouvez pas en prendre ${nombreLots}`)
}
this.venteData.choix.nombreLots = Math.min(nombreLots, this.venteData.quantiteNbLots);
this.venteData.prixTotal = (nombreLots * this.venteData.prixLot).toFixed(2); this.venteData.prixTotal = (nombreLots * this.venteData.prixLot).toFixed(2);
$(".nombreLots").val(this.venteData.choix.nombreLots);
$(".prixTotal").text(this.venteData.prixTotal); $(".prixTotal").text(this.venteData.prixTotal);
} }

View File

@@ -38,22 +38,22 @@ export class DialogConsommer extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
static prepareData(actor, item) { static prepareData(actor, item) {
const itemData = duplicate(item); item = duplicate(item);
let consommerData = { let consommerData = {
item: itemData, item: item,
cuisine: actor.getCompetence('cuisine'), cuisine: actor.getCompetence('cuisine'),
choix: { choix: {
doses: 1, doses: 1,
seForcer: false, seForcer: false,
} }
} }
switch (itemData.type) { switch (item.type) {
case 'nourritureboisson': case 'nourritureboisson':
consommerData.title = itemData.data.boisson ? `${itemData.name}: boire une dose` : `${itemData.name}: manger une portion`; consommerData.title = item.system.boisson ? `${item.name}: boire une dose` : `${item.name}: manger une portion`;
consommerData.buttonName = itemData.data.boisson ? "Boire" : "Manger"; consommerData.buttonName = item.system.boisson ? "Boire" : "Manger";
break; break;
case 'potion': case 'potion':
consommerData.title = `${itemData.name}: boire la potion`; consommerData.title = `${item.name}: boire la potion`;
consommerData.buttonName = "Boire"; consommerData.buttonName = "Boire";
break; break;
} }
@@ -61,11 +61,11 @@ export class DialogConsommer extends Dialog {
return consommerData; return consommerData;
} }
static calculDoses(consommerData) { static calculDoses(consommer) {
const doses = consommerData.choix.doses; const doses = consommer.choix.doses;
consommerData.totalSust = Misc.keepDecimals(doses * (consommerData.item.data.sust ?? 0), 2); consommer.totalSust = Misc.keepDecimals(doses * (consommer.item.system.sust ?? 0), 2);
consommerData.totalDesaltere = consommerData.item.data.boisson consommer.totalDesaltere = consommer.item.system.boisson
? Misc.keepDecimals(doses * (consommerData.item.data.desaltere ?? 0), 2) ? Misc.keepDecimals(doses * (consommer.item.system.desaltere ?? 0), 2)
: 0; : 0;
} }

View File

@@ -4,15 +4,14 @@ import { Misc } from "./misc.js";
export class DialogItemVente extends Dialog { export class DialogItemVente extends Dialog {
static async create(item, callback) { static async create(item, callback) {
const itemData = item const quantite = item.isConteneur() ? 1 : item.system.quantite;
const quantite = item.isConteneur() ? 1 : itemData.system.quantite;
const venteData = { const venteData = {
item: itemData, 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: itemData.system.cout, prixOrigine: item.system.cout,
prixUnitaire: itemData.system.cout, prixUnitaire: item.system.cout,
prixLot: itemData.system.cout, prixLot: item.system.cout,
tailleLot: 1, tailleLot: 1,
quantiteNbLots: quantite, quantiteNbLots: quantite,
quantiteMaxLots: quantite, quantiteMaxLots: quantite,

View File

@@ -3,10 +3,9 @@ import { Misc } from "./misc.js";
export class DialogSplitItem extends Dialog { export class DialogSplitItem extends Dialog {
static async create(item, callback) { static async create(item, callback) {
const itemData = item
const splitData = { const splitData = {
item: itemData, item: item,
choix: { quantite: 1, max: itemData.data.quantite - 1 } choix: { quantite: 1, max: item.system.quantite - 1 }
}; };
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-split.html`, splitData); const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-split.html`, splitData);
return new DialogSplitItem(item, splitData, html, callback) return new DialogSplitItem(item, splitData, html, callback)

View File

@@ -1,18 +1,19 @@
import { Misc } from "./misc.js"; import { RdDSheetUtility } from "./rdd-sheet-utility.js";
export class DialogStress extends Dialog { export class DialogStress extends Dialog {
static async distribuerStress() { static async distribuerStress() {
let dialogData = { const dialogData = {
motif: "Motif", motif: "Motif",
stress: 10, stress: 10,
immediat: false, immediat: false,
actors: game.actors.filter(actor => actor.hasPlayerOwner && actor.isPersonnage()) actors: game.actors.filter(actor => actor.hasPlayerOwner && actor.isPersonnage())
.map(actor => { .map(actor => ({
let actorData = duplicate(actor); id: actor.id,
actorData.selected = actor.hasPlayerOwner; name: actor.name,
return actorData; selected: true
}) })
)
}; };
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-stress.html", dialogData); const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-stress.html", dialogData);
@@ -21,52 +22,44 @@ export class DialogStress extends Dialog {
} }
constructor(dialogData, html) { constructor(dialogData, html) {
let options = { classes: ["DialogStress"], width: 400, height: 320, 'z-index': 99999 }; const options = { classes: ["DialogStress"],
let conf = { width: 400,
height: 205+dialogData.actors.length*25,
'z-index': 99999
};
const conf = {
title: "Donner du stress", title: "Donner du stress",
content: html, content: html,
buttons: { buttons: {
"Stress": { label: "Stress !", callback: it => { this._onStress(); } } stress: { label: "Stress !", callback: it => { this.onStress(); } }
} },
default: "stress"
}; };
super(conf, options); super(conf, options);
this.dialogData = dialogData; this.dialogData = dialogData;
} }
async _onStress() { async onStress() {
this.validerStress(); const motif = $("form.rdddialogstress input[name='motif']").val();
const compteur = this.dialogData.immediat ? 'experience' : 'stress'; const stress = Number($("form.rdddialogstress input[name='stress']").val());
const stress = this.dialogData.stress; const compteur = ($("form.rdddialogstress input[name='immediat']").prop("checked")) ? 'experience' : 'stress';
const motif = this.dialogData.motif;
this.dialogData.actors.filter(it => it.selected) this.dialogData.actors.filter(it => it.selected)
.map(it => game.actors.get(it._id)) .map(it => game.actors.get(it.id))
.forEach(actor => actor.distribuerStress(compteur, stress, motif)); .forEach(actor => actor.distribuerStress(compteur, stress, motif));
} }
validerStress() {
this.dialogData.motif = $("form.rdddialogstress input[name='motif']").val();
this.dialogData.stress = $("form.rdddialogstress input[name='stress']").val();
this.dialogData.immediat = $("form.rdddialogstress input[name='immediat']").prop("checked");;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
html.find(".select-actor").change((event) => this.onSelectActor(event)); html.find("input.select-actor").change((event) => this.onSelectActor(event));
} }
async onSelectActor(event) { async onSelectActor(event) {
event.preventDefault(); const actorId = $(event.currentTarget)?.data("actor-id");
const options = event.currentTarget.options; const actor = this.dialogData.actors.find(it => it.id == actorId);
for (var i = 0; i < options.length; i++) { // looping over the options if (actor) {
const actorId = options[i].attributes["data-actor-id"].value; actor.selected = event.currentTarget.checked;
const actor = this.dialogData.actors.find(it => it._id == actorId); }
if (actor) {
actor.selected = options[i].selected;
}
};
} }
} }

View File

@@ -1,9 +0,0 @@
/* -------------------------------------------- */
import { RdDUtility } from "./rdd-utility.js";
/* -------------------------------------------- */
// Activate chat listeners defined
// Hooks.on('renderChatLog', (log, html, data) => {
// RdDUtility.chatListeners(html);
// });

View File

@@ -19,18 +19,16 @@ const nomCategorieParade = {
/* -------------------------------------------- */ /* -------------------------------------------- */
export class RdDItemArme extends Item { export class RdDItemArme extends Item {
static isArme(itemData) { static isArme(item) {
itemData = itemData return (item.type == 'competencecreature' && item.system.iscombat) || item.type == 'arme';
return (itemData.type == 'competencecreature' && itemData.system.iscombat) || itemData.type == 'arme';
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getArmeData(armeData) { static getArme(arme) {
armeData = armeData switch (arme ? arme.type : '') {
switch (armeData ? armeData.type : '') { case 'arme': return arme;
case 'arme': return armeData;
case 'competencecreature': case 'competencecreature':
return RdDItemCompetenceCreature.toActionArme(armeData); return RdDItemCompetenceCreature.toActionArme(arme);
} }
return RdDItemArme.mainsNues(); return RdDItemArme.mainsNues();
} }
@@ -160,18 +158,18 @@ export class RdDItemArme extends Item {
return armeData; return armeData;
} }
static isArmeUtilisable(itemData) { static isArmeUtilisable(arme) {
return itemData.type == 'arme' && itemData.system.equipe && (itemData.system.resistance > 0 || itemData.system.portee_courte > 0); return arme.type == 'arme' && arme.system.equipe && (arme.system.resistance > 0 || arme.system.portee_courte > 0);
} }
static ajoutCorpsACorps(armes, competences, carac) { static ajoutCorpsACorps(armes, competences, carac) {
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.data.niveau, initiative: init })); //armes.push(RdDItemArme.empoignade({ niveau: corpsACorps.system.niveau, initiative: init }));
} }
static corpsACorps(actorData) { static corpsACorps(mainsNuesActor) {
const corpsACorps = { const corpsACorps = {
name: 'Corps à corps', name: 'Corps à corps',
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp', img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp',
@@ -186,20 +184,20 @@ export class RdDItemArme extends Item {
categorie_parade: 'sans-armes' categorie_parade: 'sans-armes'
} }
}; };
mergeObject(corpsACorps.system, actorData ?? {}, { overwrite: false }); mergeObject(corpsACorps.system, mainsNuesActor ?? {}, { overwrite: false });
return corpsACorps; return corpsACorps;
} }
static mainsNues(actorData) { static mainsNues(mainsNuesActor) {
const mainsNues = RdDItemArme.corpsACorps(actorData) const mainsNues = RdDItemArme.corpsACorps(mainsNuesActor)
mainsNues.name = 'Mains nues' mainsNues.name = 'Mains nues'
mainsNues.system.cac = 'pugilat' mainsNues.system.cac = 'pugilat'
mainsNues.system.baseInit = 4 mainsNues.system.baseInit = 4
return mainsNues; return mainsNues;
} }
static empoignade(actorData) { static empoignade(mainsNuesActor) {
const empoignade = RdDItemArme.corpsACorps(actorData) const empoignade = RdDItemArme.corpsACorps(mainsNuesActor)
empoignade.name = 'Empoignade' empoignade.name = 'Empoignade'
empoignade.system.cac = 'empoignade' empoignade.system.cac = 'empoignade'
empoignade.system.baseInit = 3 empoignade.system.baseInit = 3

View File

@@ -183,29 +183,29 @@ export class RdDItemCompetence extends Item {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static levelUp(itemData, stressTransforme) { static levelUp(item, stressTransforme) {
itemData.system.xpNext = RdDItemCompetence.getCompetenceNextXp(itemData.system.niveau); item.system.xpNext = RdDItemCompetence.getCompetenceNextXp(item.system.niveau);
const xpManquant = itemData.system.xpNext - itemData.system.xp; const xpManquant = item.system.xpNext - item.system.xp;
itemData.system.isLevelUp = xpManquant <= 0; item.system.isLevelUp = xpManquant <= 0;
itemData.system.isStressLevelUp = (xpManquant > 0 && stressTransforme >= xpManquant && itemData.system.niveau < itemData.system.niveau_archetype); item.system.isStressLevelUp = (xpManquant > 0 && stressTransforme >= xpManquant && item.system.niveau < item.system.niveau_archetype);
itemData.system.stressXpMax = 0; item.system.stressXpMax = 0;
if (xpManquant > 0 && stressTransforme > 0 && itemData.system.niveau < itemData.system.niveau_archetype) { if (xpManquant > 0 && stressTransforme > 0 && item.system.niveau < item.system.niveau_archetype) {
itemData.system.stressXpMax = Math.min(xpManquant , stressTransforme); item.system.stressXpMax = Math.min(xpManquant , stressTransforme);
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static isVisible(itemData) { static isVisible(item) {
return Number(itemData.data.niveau) != RdDItemCompetence.getNiveauBase(itemData.data.categorie); return Number(item.system.niveau) != RdDItemCompetence.getNiveauBase(item.system.categorie);
} }
static nomContientTexte(itemData, texte) { static nomContientTexte(item, texte) {
return Grammar.toLowerCaseNoAccent(itemData.name).includes(Grammar.toLowerCaseNoAccent(texte)) return Grammar.toLowerCaseNoAccent(item.name).includes(Grammar.toLowerCaseNoAccent(texte))
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static isNiveauBase(itemData) { static isNiveauBase(item) {
return Number(itemData.system.niveau) == RdDItemCompetence.getNiveauBase(itemData.system.categorie); return Number(item.system.niveau) == RdDItemCompetence.getNiveauBase(item.system.categorie);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@@ -1,4 +1,5 @@
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { RdDCombatManager } from "./rdd-combat.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
export class RdDItemCompetenceCreature extends Item { export class RdDItemCompetenceCreature extends Item {
@@ -16,36 +17,37 @@ export class RdDItemCompetenceCreature extends Item {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static toActionArme(item) { static toActionArme(competencecreature) {
if (RdDItemCompetenceCreature.isCompetenceAttaque(item)) { if (RdDItemCompetenceCreature.isCompetenceAttaque(competencecreature)) {
// 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 lma compétence
let arme = (item instanceof Item) ? item.clone(): item; let arme = (competencecreature instanceof Item) ? competencecreature.clone(): competencecreature;
mergeObject(arme.system, mergeObject(arme.system,
{ {
competence: arme.name, competence: arme.name,
resistance: 100, initiative: RdDCombatManager.calculInitiative(competencecreature.system.niveau, competencecreature.system.carac_value),
niveau: competencecreature.system.niveau,
equipe: true, equipe: true,
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' action: 'attaque'
}); });
return arme; return arme;
} }
console.error("RdDItemCompetenceCreature.toActionArme(", item, ") : impossible de transformer l'Item en arme"); console.error("RdDItemCompetenceCreature.toActionArme(", competencecreature, ") : impossible de transformer l'Item en arme");
return undefined; return undefined;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static isCompetenceAttaque(itemData) { static isCompetenceAttaque(item) {
itemData = itemData return item.type == 'competencecreature' && item.system.iscombat;
return itemData.type == 'competencecreature' && itemData.system.iscombat;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static isCompetenceParade(itemData) { static isCompetenceParade(item) {
itemData = itemData return item.type == 'competencecreature' && item.system.categorie_parade !== "";
return itemData.type == 'competencecreature' && itemData.system.isparade;
} }
} }

View File

@@ -1,52 +1,58 @@
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { LOG_HEAD, SYSTEM_RDD } from "./constants.js";
const monnaiesData = [ const MONNAIES_STANDARD = [
{ {
name: "Etain (1 denier)", type: 'monnaie', name: "Etain (1 denier)", type: 'monnaie',
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp", img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp",
data: { quantite: 0, valeur_deniers: 1, encombrement: 0.001, description: "" } system: { quantite: 0, valeur_deniers: 1, encombrement: 0.001, description: "" }
}, },
{ {
name: "Bronze (10 deniers)", type: 'monnaie', name: "Bronze (10 deniers)", type: 'monnaie',
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_bronze_epees.webp", img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_bronze_epees.webp",
data: { quantite: 0, valeur_deniers: 10, encombrement: 0.002, description: "" } system: { quantite: 0, valeur_deniers: 10, encombrement: 0.002, description: "" }
}, },
{ {
name: "Argent (1 sol)", type: 'monnaie', name: "Argent (1 sol)", type: 'monnaie',
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_argent_sol.webp", img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_argent_sol.webp",
data: { quantite: 0, valeur_deniers: 100, encombrement: 0.003, description: "" } system: { quantite: 0, valeur_deniers: 100, encombrement: 0.003, description: "" }
}, },
{ {
name: "Or (10 sols)", type: 'monnaie', name: "Or (10 sols)", type: 'monnaie',
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp", img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp",
data: { quantite: 0, valeur_deniers: 1000, encombrement: 0.004, description: "" } system: { quantite: 0, valeur_deniers: 1000, encombrement: 0.004, description: "" }
} }
] ]
const VALEURS_STANDARDS = MONNAIES_STANDARD.map(it =>it.system.valeur_deniers);
export class Monnaie { export class Monnaie {
static isSystemMonnaie(item) { static isSystemMonnaie(item, items) {
let present = monnaiesData.find(monnaie => monnaie.system.valeur_deniers == item?.system?.valeur_deniers); if (item.type == 'monnaie') {
return present; const valeur = item.system.valeur_deniers;
if (VALEURS_STANDARDS.includes(valeur)) {
const monnaiesDeValeur = items.filter(it => it.type == 'monnaie' && it.system.valeur_deniers == valeur)
return monnaiesDeValeur.length<=1;
}
}
return false;
} }
static monnaiesData() { static monnaiesData() {
return monnaiesData; return MONNAIES_STANDARD;
} }
static filtrerMonnaies(items) { static monnaiesManquantes(actor) {
return items.filter(it => it.type == 'monnaie'); const disponibles = actor.itemTypes['monnaie'];
const manquantes = MONNAIES_STANDARD.filter(standard => !disponibles.find(disponible => Monnaie.deValeur(disponible, standard.system?.valeur_deniers)));
if (manquantes.length > 0) {
console.error(`${LOG_HEAD} monnaiesManquantes pour ${actor.name}`, manquantes, ' avec monnaies', disponibles, MONNAIES_STANDARD);
}
return manquantes;
} }
static monnaiesManquantes(items) { static deValeur(monnaie, valeur) {
const valeurs = Monnaie.filtrerMonnaies(items) return valeur == monnaie.system.valeur_deniers
.map(it => it.system.valeur_deniers);
const manquantes = monnaiesData.filter(monnaie => !valeurs.find(v => v != monnaie.system?.valeur_deniers))
return []; //manquantes;
}
static deValeur(monnaie, v) {
return v != monnaie.system.valeur_deniers
} }
static arrondiDeniers(sols) { static arrondiDeniers(sols) {

View File

@@ -32,7 +32,7 @@ export class RdDItemSheet extends ItemSheet {
let buttons = super._getHeaderButtons(); let buttons = super._getHeaderButtons();
// Add "Post to chat" button // Add "Post to chat" button
// We previously restricted this to GM and editable items only. If you ever find this comment because it broke something: eh, sorry! // We previously restricted this to GM and editable items only. If you ever find this comment because it broke something: eh, sorry!
if ("cout" in this.object.system && this.object.isVideOuNonConteneur()) { if ("cout" in this.item.system && this.item.isVideOuNonConteneur()) {
buttons.unshift({ buttons.unshift({
class: "vendre", class: "vendre",
icon: "fas fa-comments-dollar", icon: "fas fa-comments-dollar",
@@ -61,53 +61,59 @@ export class RdDItemSheet extends ItemSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
let formData = { let formData = {
id: this.object.id, id: this.item.id,
title: this.object.name, title: this.item.name,
type: this.object.type, type: this.item.type,
img: this.object.img, img: this.item.img,
name: this.object.name, name: this.item.name,
data: this.object.system, system: this.item.system,
// TODO: v10 remove
data: this.item.system,
isGM: game.user.isGM, isGM: game.user.isGM,
actorId: this.actor?.id, actorId: this.actor?.id,
owner: this.document.isOwner, owner: this.item.isOwner,
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
isSoins: false isSoins: false
} }
if (this.actor) { if (this.actor) {
formData.isOwned = true; formData.isOwned = true;
if (this.object.type == 'conteneur') { if (this.item.type == 'conteneur') {
this.prepareConteneurData(formData); this.prepareConteneurData(formData);
} }
} }
formData.categorieCompetences = RdDItemCompetence.getCategorieCompetences() formData.categorieCompetences = RdDItemCompetence.getCategorieCompetences()
if (formData.type == 'tache' || formData.type == 'livre' || formData.type == 'meditation' || formData.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 = await RdDUtility.loadCompendium('foundryvtt-reve-de-dragon.competences') formData.competences = await RdDUtility.loadCompendium('foundryvtt-reve-de-dragon.competences')
} }
if (formData.type == 'arme') { if (this.item.type == 'arme') {
formData.competences = await RdDUtility.loadCompendium('foundryvtt-reve-de-dragon.competences', it => RdDItemCompetence.isCompetenceArme(it)); formData.competences = await RdDUtility.loadCompendium('foundryvtt-reve-de-dragon.competences', it => RdDItemCompetence.isCompetenceArme(it));
console.log(formData.competences) console.log(formData.competences)
} }
if (formData.type == 'recettealchimique') { if (this.item.type == 'recettealchimique') {
RdDAlchimie.processManipulation(objectData, this.actor && this.actor.id); RdDAlchimie.processManipulation(this.item, this.actor && this.actor.id);
} }
if (formData.type == 'gemme') { if (this.item.type == 'gemme') {
formData.gemmeTypeList = RdDGemme.getGemmeTypeOptionList(); formData.gemmeTypeList = RdDGemme.getGemmeTypeOptionList();
RdDGemme.calculDataDerivees(formData.data); RdDGemme.calculDataDerivees(this.item);
} }
if (formData.type == 'potion') { if (this.item.type == 'potion') {
if (this.dateUpdated) { if (this.dateUpdated) {
formData.data.prdate = this.dateUpdated; formData.system.prdate = this.dateUpdated;
this.dateUpdated = undefined; this.dateUpdated = undefined;
} }
RdDHerbes.updatePotionData(formData); RdDHerbes.updatePotionData(formData);
} }
if (formData.isOwned && formData.type == 'herbe' && (formData.data.categorie == 'Soin' || formData.data.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') {
const sortId = this.item.system.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);
return formData; return formData;
@@ -119,7 +125,7 @@ export class RdDItemSheet extends ItemSheet {
RdDUtility.filterEquipementParType(formData) RdDUtility.filterEquipementParType(formData)
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets); this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
formData.subItems = formData.conteneurs.find(it => it._id == this.object.id)?.subItems; formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems;
} }
@@ -128,15 +134,15 @@ export class RdDItemSheet extends ItemSheet {
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
if (this.object.type == 'conteneur') { if (this.item.type == 'conteneur') {
this.form.ondragstart = (event) => this._onDragStart(event); this.form.ondragstart = (event) => this._onDragStart(event);
this.form.ondrop = (event) => this._onDrop(event); this.form.ondrop = (event) => this._onDrop(event);
} }
let itemSheetDialog = this; let itemSheetDialog = this;
HtmlUtility._showControlWhen($(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.object.isOwned); HtmlUtility._showControlWhen($(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.item.isOwned);
HtmlUtility._showControlWhen($(".item-magique"), this.object.isMagique()); HtmlUtility._showControlWhen($(".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
if (!this.options.editable) return; if (!this.options.editable) return;
@@ -145,8 +151,8 @@ export class RdDItemSheet extends ItemSheet {
html.find(".categorie").change(event => this._onSelectCategorie(event)); html.find(".categorie").change(event => this._onSelectCategorie(event));
html.find('.sheet-competence-xp').change((event) => { html.find('.sheet-competence-xp').change((event) => {
if (this.object.data.type == 'competence') { if (this.item.type == 'competence') {
RdDUtility.checkThanatosXP(this.object.data.name); RdDUtility.checkThanatosXP(this.item.name);
} }
}); });
@@ -195,7 +201,8 @@ export class RdDItemSheet extends ItemSheet {
}); });
html.find('.item-delete').click(async event => { html.find('.item-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event); const li = RdDSheetUtility.getEventElement(event);
RdDUtility.confirmerSuppression(this, li); const item = this.actor.getObjet(li.data("item-id"));
RdDUtility.confirmerSuppressionItem(this, item, li);
}); });
html.find('.item-vendre').click(async event => { html.find('.item-vendre').click(async event => {
const item = RdDSheetUtility.getItem(event, this.actor); const item = RdDSheetUtility.getItem(event, this.actor);
@@ -219,16 +226,16 @@ export class RdDItemSheet extends ItemSheet {
async _onSelectCategorie(event) { async _onSelectCategorie(event) {
event.preventDefault(); event.preventDefault();
if (this.object.isCompetence()) { if (this.item.isCompetence()) {
let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value); let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);
this.object.system.base = level; this.item.system.base = level;
$("#base").val(level); $("#base").val(level);
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
get template() { get template() {
let type = this.object.type let type = this.item.type
return `systems/foundryvtt-reve-de-dragon/templates/item-${type}-sheet.html`; return `systems/foundryvtt-reve-de-dragon/templates/item-${type}-sheet.html`;
} }
@@ -239,7 +246,7 @@ export class RdDItemSheet extends ItemSheet {
// Données de bonus de cases ? // Données de bonus de cases ?
formData = RdDItemSort.buildBonusCaseStringFromFormData(formData); formData = RdDItemSort.buildBonusCaseStringFromFormData(formData);
return this.object.update(formData); return this.item.update(formData);
} }
async _onDragStart(event) { async _onDragStart(event) {
@@ -252,28 +259,28 @@ export class RdDItemSheet extends ItemSheet {
const dragData = { const dragData = {
actorId: this.actor.id, actorId: this.actor.id,
type: "Item", type: "Item",
data: item.data data: item.system
}; };
event.dataTransfer.setData("text/plain", JSON.stringify(dragData)); event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
} }
async _onDrop(event) { async _onDrop(event) {
// Try to extract the data // Try to extract the dragData
let data; let dragData;
try { try {
data = JSON.parse(event.dataTransfer.getData('text/plain')); dragData = JSON.parse(event.dataTransfer.getData('text/plain'));
} catch (err) { } catch (err) {
return false; return false;
} }
const allowed = Hooks.call("dropActorSheetData", this.actor, this, data); const allowed = Hooks.call("dropActorSheetData", this.actor, this, dragData);
if (allowed === false) return; if (allowed === false) return;
// Handle different data types // Handle different dragData types
switch (data.type) { switch (dragData.type) {
case "Item": case "Item":
return this._onDropItem(event, data); return this._onDropItem(event, dragData);
} }
return super._onDrop(event); return super._onDrop(event);
} }
@@ -281,7 +288,7 @@ export class RdDItemSheet extends ItemSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async _onDropItem(event, dragData) { async _onDropItem(event, dragData) {
if (this.actor) { if (this.actor) {
const dropParams = RdDSheetUtility.prepareItemDropParameters(this.object.id, this.actor.id, dragData, this.objetVersConteneur); const dropParams = RdDSheetUtility.prepareItemDropParameters(this.item.id, this.actor.id, dragData, this.objetVersConteneur);
await this.actor.processDropItem(dropParams); await this.actor.processDropItem(dropParams);
await this.render(true); await this.render(true);
} }

View File

@@ -32,25 +32,25 @@ export class RdDSigneDraconiqueItemSheet extends ItemSheet {
const position = super.setPosition(options); const position = super.setPosition(options);
const sheetHeader = this.element.find(".sheet-header"); const sheetHeader = this.element.find(".sheet-header");
const sheetBody = this.element.find(".sheet-body"); const sheetBody = this.element.find(".sheet-body");
const bodyHeight = position.height - sheetHeader[0].clientHeight; sheetBody.css("height", position.height - sheetHeader[0].clientHeight)
sheetBody.css("height", bodyHeight);
return position; return position;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
const formData = duplicate(this.object); const formData = duplicate(this.item);
this.tmrs = TMRUtility.buildSelectionTypesTMR(this.item.system.typesTMR);
mergeObject(formData, { mergeObject(formData, {
tmrs: this.tmrs,
title: formData.name, title: formData.name,
isGM: game.user.isGM, isGM: game.user.isGM,
owner: this.document.isOwner, owner: this.actor?.isOwner,
isOwned: this.actor ? true : false, isOwned: this.actor ? true : false,
actorId: this.actor?.id, actorId: this.actor?.id,
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
}); });
formData.tmrs = TMRUtility.listSelectedTMR(formData.data.typesTMR ?? []);
return formData; return formData;
} }
@@ -62,27 +62,31 @@ export class RdDSigneDraconiqueItemSheet extends ItemSheet {
if (!this.options.editable) return; if (!this.options.editable) return;
html.find(".signe-aleatoire").click(event => this.setSigneAleatoire()); html.find(".signe-aleatoire").click(event => this.setSigneAleatoire());
html.find(".select-tmr").change((event) => this.onSelectTmr(event)); html.find("input.select-tmr").change((event) => this.onSelectTmr(event));
html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event.currentTarget.attributes['data-typereussite']?.value, Number(event.currentTarget.value))); html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event.currentTarget.attributes['data-typereussite']?.value, Number(event.currentTarget.value)));
} }
async setSigneAleatoire() { async setSigneAleatoire() {
const newSigne = await RdDItemSigneDraconique.randomSigneDraconique(); const newSigne = await RdDItemSigneDraconique.randomSigneDraconique();
this.object.update(newSigne); this.item.update(newSigne);
} }
async onSelectTmr(event) { async onSelectTmr(event) {
event.preventDefault(); const tmrName = $(event.currentTarget)?.data("tmr-name");
const selectedTMR = $(".select-tmr").val(); const onTmr = this.tmrs.find(it => it.name == tmrName);
this.object.update({ 'data.typesTMR': selectedTMR }); if (onTmr){
onTmr.selected = event.currentTarget.checked;
}
this.item.update({ 'system.typesTMR': TMRUtility.buildListTypesTMRSelection(this.tmrs) });
} }
async onValeurXpSort(event) { async onValeurXpSort(event) {
const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0; const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0;
const xp = Number(event.currentTarget.value); const xp = Number(event.currentTarget.value);
const oldValeur = this.object.system.valeur; const oldValeur = this.item.system.valeur;
const newValeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur); const newValeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur);
await this.object.update({ 'data.valeur': newValeur }); await this.item.update({ 'system.valeur': newValeur });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@@ -18,13 +18,12 @@ const DIFFICULTE_LECTURE_SIGNE_MANQUE = +11;
export class RdDItemSigneDraconique { export class RdDItemSigneDraconique {
static prepareSigneDraconiqueMeditation(meditation, rolled) { static prepareSigneDraconiqueMeditation(meditation, rolled) {
meditation = meditation
return { return {
name: "de la " + meditation.name, name: "de la " + meditation.name,
type: "signedraconique", type: "signedraconique",
img: meditation.img, img: meditation.img,
data: { system: {
typesTMR: [TMRUtility.typeTmrName(meditation.data.tmr)], typesTMR: [TMRUtility.typeTmrName(meditation.system.tmr)],
difficulte: rolled.isSuccess ? RdDItemSigneDraconique.getDiffSigneMeditation(rolled.code) : DIFFICULTE_LECTURE_SIGNE_MANQUE, difficulte: rolled.isSuccess ? RdDItemSigneDraconique.getDiffSigneMeditation(rolled.code) : DIFFICULTE_LECTURE_SIGNE_MANQUE,
ephemere: true, ephemere: true,
duree: "1 round", duree: "1 round",
@@ -75,7 +74,7 @@ export class RdDItemSigneDraconique {
name: await RdDItemSigneDraconique.randomSigneDescription(), name: await RdDItemSigneDraconique.randomSigneDescription(),
type: "signedraconique", type: "signedraconique",
img: defaultItemImg.signedraconique, img: defaultItemImg.signedraconique,
data: { system: {
typesTMR: await RdDItemSigneDraconique.randomTmrs(modele.nbCases), typesTMR: await RdDItemSigneDraconique.randomTmrs(modele.nbCases),
ephemere: options?.ephemere == undefined ? RdDDice.rollTotal("1d2") == 2 : options.ephemere, ephemere: options?.ephemere == undefined ? RdDDice.rollTotal("1d2") == 2 : options.ephemere,
duree: "1 round", duree: "1 round",

View File

@@ -7,12 +7,12 @@ export class RdDItemSort extends Item {
/* -------------------------------------------- */ /* -------------------------------------------- */
static isDifficulteVariable(sort) { static isDifficulteVariable(sort) {
return sort && (sort.data.difficulte.toLowerCase() == "variable"); return sort && (sort.system.difficulte.toLowerCase() == "variable");
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static isCoutVariable(sort) { static isCoutVariable(sort) {
return sort && (sort.data.ptreve.toLowerCase() == "variable" || sort.data.ptreve.indexOf("+") >= 0); return sort && (sort.system.ptreve.toLowerCase() == "variable" || sort.system.ptreve.indexOf("+") >= 0);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -25,7 +25,7 @@ export class RdDItemSort extends Item {
/* -------------------------------------------- */ /* -------------------------------------------- */
static getDifficulte(sort, variable) { static getDifficulte(sort, variable) {
if (sort && !RdDItemSort.isDifficulteVariable(sort)) { if (sort && !RdDItemSort.isDifficulteVariable(sort)) {
return Misc.toInt(sort.data.difficulte); return Misc.toInt(sort.system.difficulte);
} }
return variable; return variable;
} }
@@ -54,40 +54,40 @@ export class RdDItemSort extends Item {
static getBonusCaseList( item, newCase = false ) { static getBonusCaseList( item, newCase = false ) {
// Gestion spéciale case bonus // Gestion spéciale case bonus
if ( item.type == 'sort') { if ( item.type == 'sort') {
return this.buildBonusCaseList(item.data.bonuscase, newCase ); return this.buildBonusCaseList(item.system.bonuscase, newCase );
} }
return undefined; return undefined;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
/** Met à jour les données de formulaire /** Met à jour les données de formulaire
* si static des bonus de cases sont présents * si static des bonus de cases sont présents
* */ * */
static buildBonusCaseStringFromFormData( formData ) { static buildBonusCaseStringFromFormData( formData ) {
if ( formData.bonusValue ) { if ( formData.bonusValue ) {
let list = []; let list = [];
let caseCheck = {}; let caseCheck = {};
for(let i=0; i<formData.bonusValue.length; i++) { for(let i=0; i<formData.bonusValue.length; i++) {
let coord = formData.caseValue[i] || 'A1'; let coord = formData.caseValue[i] || 'A1';
coord = coord.toUpperCase(); coord = coord.toUpperCase();
if ( TMRUtility.verifyTMRCoord( coord ) ) { // Sanity check if ( TMRUtility.verifyTMRCoord( coord ) ) { // Sanity check
let bonus = formData.bonusValue[i] || 0; let bonus = formData.bonusValue[i] || 0;
if ( bonus > 0 && caseCheck[coord] == undefined ) { if ( bonus > 0 && caseCheck[coord] == undefined ) {
caseCheck[coord] = bonus; caseCheck[coord] = bonus;
list.push( coord+":"+bonus ); list.push( coord+":"+bonus );
}
} }
} }
formData.bonusValue = undefined;
formData.caseValue = undefined;
formData['data.bonuscase'] = list.toString(); // Reset
} }
return formData; formData.bonusValue = undefined;
formData.caseValue = undefined;
formData.system.bonuscase = list.toString(); // Reset
}
return formData;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static incrementBonusCase( actor, sort, coord ) { static incrementBonusCase( actor, sort, coord ) {
let bonusCaseList = this.buildBonusCaseList(sort.data.bonuscase, false); let bonusCaseList = this.buildBonusCaseList(sort.system.bonuscase, false);
//console.log("ITEMSORT", sort, bonusCaseList); //console.log("ITEMSORT", sort, bonusCaseList);
let found = false; let found = false;
@@ -106,12 +106,12 @@ export class RdDItemSort extends Item {
// Sauvegarde/update // Sauvegarde/update
let bonuscase = StringList.toString(); let bonuscase = StringList.toString();
//console.log("Bonus cae :", bonuscase); //console.log("Bonus cae :", bonuscase);
actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'data.bonuscase': bonuscase }] ); actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'system.bonuscase': bonuscase }] );
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getCaseBonus( sort, coord) { static getCaseBonus( sort, coord) {
let bonusCaseList = this.buildBonusCaseList(sort.data.bonuscase, false); let bonusCaseList = this.buildBonusCaseList(sort.system.bonuscase, false);
for( let bc of bonusCaseList) { for( let bc of bonusCaseList) {
if (bc.case == coord) { // Case existante if (bc.case == coord) { // Case existante
return Number(bc.bonus); return Number(bc.bonus);

View File

@@ -1,6 +1,7 @@
import { DialogItemVente } from "./dialog-item-vente.js"; import { DialogItemVente } from "./dialog-item-vente.js";
import { Grammar } from "./grammar.js"; import { Grammar } from "./grammar.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { RdDHerbes } from "./rdd-herbes.js";
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
const typesObjetsEquipement = ["objet", "arme", "armure", "gemme", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson", "monnaie"] const typesObjetsEquipement = ["objet", "arme", "armure", "gemme", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson", "monnaie"]
@@ -35,17 +36,18 @@ export const defaultItemImg = {
nourritureboisson: "systems/foundryvtt-reve-de-dragon/icons/objets/provision_crue.webp", nourritureboisson: "systems/foundryvtt-reve-de-dragon/icons/objets/provision_crue.webp",
signedraconique: "systems/foundryvtt-reve-de-dragon/icons/tmr/signe_draconique.webp", signedraconique: "systems/foundryvtt-reve-de-dragon/icons/tmr/signe_draconique.webp",
gemme: "systems/foundryvtt-reve-de-dragon/icons/gemmes/almaze.webp", gemme: "systems/foundryvtt-reve-de-dragon/icons/gemmes/almaze.webp",
possession: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp" possession: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
sortreserve: "systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp",
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
export class RdDItem extends Item { export class RdDItem extends Item {
constructor(data, context) { constructor(itemData, context) {
if (!data.img) { if (!itemData.img) {
data.img = defaultItemImg[data.type]; itemData.img = defaultItemImg[itemData.type];
} }
super(data, context); super(itemData, context);
} }
static getTypeObjetsEquipement() { static getTypeObjetsEquipement() {
@@ -117,7 +119,7 @@ export class RdDItem extends Item {
if (this.isPotion()) { if (this.isPotion()) {
this.prepareDataPotion() this.prepareDataPotion()
} }
this.actionPrincipale = this.getActionPrincipale({ warnIfNot: false }); this.system.actionPrincipale = this.getActionPrincipale({ warnIfNot: false });
} }
} }
@@ -126,7 +128,8 @@ export class RdDItem extends Item {
this.system.magique = categorie.includes('enchante'); this.system.magique = categorie.includes('enchante');
if (this.system.magique) { if (this.system.magique) {
if (categorie.includes('soin') || categorie.includes('repos')) { if (categorie.includes('soin') || categorie.includes('repos')) {
this.system.puissance = this.system.herbebonus * this.system.pr; // TODO: utiliser calculePointsRepos / calculePointsGuerison
this.system.puissance = RdDHerbes.calculePuissancePotion(this);
} }
} }
} }
@@ -143,24 +146,28 @@ export class RdDItem extends Item {
} }
getActionPrincipale(options = { warnIfNot: true }) { getActionPrincipale(options = { warnIfNot: true }) {
if (!this.isConteneur() && (this.system.quantite ?? 0) <= 0) { const warn = options.warnIfNot;
if (options.warnIfNot) { switch (this.type) {
case 'nourritureboisson': return this._actionOrWarnQuantiteZero(this.system.boisson ? 'Boire' : 'Manger', warn);
case 'potion': return this._actionOrWarnQuantiteZero('Boire', warn);
case 'livre': return this._actionOrWarnQuantiteZero('Lire', warn);
case 'conteneur': return 'Ouvrir';
case 'herbe': return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined;
case 'queue': case 'ombre': return this.system.refoulement>0 ? 'Refouler' : undefined;
}
return undefined;
}
_actionOrWarnQuantiteZero(actionName, warn){
if ((this.system.quantite ?? 0) <= 0) {
if (warn) {
ui.notifications.warn(`Vous n'avez plus de ${this.name}.`); ui.notifications.warn(`Vous n'avez plus de ${this.name}.`);
} }
return undefined; return undefined;
} }
switch (this.type) { else {
case 'nourritureboisson': return this.boisson ? 'Boire' : 'Manger'; return actionName;
case 'potion': return 'Boire';
case 'livre': return 'Lire';
case 'conteneur': return 'Ouvrir';
} }
if (this.isHerbeAPotion()) { return 'Décoction'; }
if (options.warnIfNot) {
ui.notifications.warn(`Impossible d'utiliser un ${this.name}, aucune action associée définie.`);
}
return undefined;
} }
async diminuerQuantite(nombre, options = { diminuerQuantite: true, supprimerSiZero: false }) { async diminuerQuantite(nombre, options = { diminuerQuantite: true, supprimerSiZero: false }) {
@@ -180,38 +187,41 @@ export class RdDItem extends Item {
} }
else { else {
ui.notifications.notify(`Il ne vous reste plus de ${this.name}, vous pouvez le supprimer de votre équipement, ou trouver un moyen de vous en procurer.`); ui.notifications.notify(`Il ne vous reste plus de ${this.name}, vous pouvez le supprimer de votre équipement, ou trouver un moyen de vous en procurer.`);
await this.update({ "data.quantite": 0 }); await this.update({ "system.quantite": 0 });
} }
} }
else { else {
await this.update({ "data.quantite": reste }); await this.update({ "system.quantite": reste });
} }
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
// détermine si deux équipements sont similaires: de même type, et avec les même champs hormis la quantité // détermine si deux équipements sont similaires: de même type, et avec les même champs hormis la quantité
isEquipementSimilaire(other) { messageEquipementDifferent(other) {
const itemData = this if (!other || !this.isEquipement()) return undefined;
const otherData = other
const tplData = this
const otherTplData = other
if (!this.isEquipement()) return false;
if (itemData.type != otherData.type) return false;
if (itemData.name != otherData.name) return false;
if (tplData.quantite == undefined) return false;
const differences = Object.entries(tplData).filter(([key, value]) => !['quantite', 'encTotal', 'prixTotal', 'cout'].includes(key)) let message = undefined;
.filter(([key, value]) => value != otherTplData[key]); if (this.type != other.type) {
if (differences.length > 0) { message = `Impossible de regrouper ${this.type} avec ${other.type}`;
let message = `Impossible de regrouper les ${itemData.type} ${itemData.name}: `;
for (const [key, value] of differences) {
message += `<br>${key}: ${value} vs ${otherTplData[key]}`;
}
ui.notifications.info(message)
return false;
} }
return true; else if (this.name != other.name) {
message = `Impossible de regrouper ${this.name} avec ${other.name}`;
}
else if (this.system.quantite == undefined) {
message = `Impossible de regrouper des ${this.type}, ils ne sont pas empilables`;
}
else {
const differences = Object.entries(this.system)
.filter(([key, value]) => !['quantite', 'encTotal', 'prixTotal', 'cout'].includes(key) && value != other.system[key]);
if (differences.length > 0) {
message = `Impossible de regrouper les ${this.type} ${this.name}: `;
for (const [key, value] of differences) {
message += `<br>${key}: ${value} vs ${other.system[key]}`;
}
}
}
return message;
} }
async proposerVente() { async proposerVente() {

141
module/migrations.js Normal file
View File

@@ -0,0 +1,141 @@
import { LOG_HEAD, SYSTEM_RDD } from "./constants.js";
import { Grammar } from "./grammar.js";
class Migration {
get code() { return "sample"; }
get version() { return "0.0.0"; }
async migrate() { }
async applyItemsUpdates(computeUpdates) {
await game.actors.forEach(async (actor) => {
const actorItemUpdates = computeUpdates(actor.items);
if (actorItemUpdates.length > 0) {
console.log(
this.code,
`Applying updates on actor ${actor.name} items`,
actorItemUpdates
);
await actor.updateEmbeddedDocuments("Item", actorItemUpdates);
}
});
const itemUpdates = computeUpdates(game.items);
if (itemUpdates.length > 0) {
console.log(this.code, "Applying updates on items", itemUpdates);
await Item.updateDocuments(itemUpdates);
}
}
}
class _10_0_16_MigrationSortsReserve extends Migration {
get code() { return "creation-item-sort-reserve"; }
get version() { return "10.0.16"; }
async migrate() {
await game.actors
.filter((actor) => actor.type == "personnage")
.filter((actor) => actor.system.reve?.reserve?.list?.length ?? 0 > 0)
.forEach(async (actor) => {
const sortsReserve = actor.system.reve.reserve.list.map(this.conversionSortReserve);
console.log(`${LOG_HEAD} Migration des sorts en réserve de ${actor.name}`, sortsReserve);
await actor.createEmbeddedDocuments("Item", sortsReserve, {
renderSheet: false,
});
await actor.update({ 'system.reve.reserve.list': [] })
});
}
conversionSortReserve(it) {
return {
type: 'sortreserve',
name: it.sort.name,
img: it.sort.img,
system: {
// ATTENTION, utilisation de data / _id possibles, encore présents pour les anciens sorts en réserve
sortid: it.sort._id,
draconic: it.sort.draconic,
ptreve: (it.sort.system ?? it.sort.data).ptreve_reel,
coord: it.coord,
heurecible: 'Vaisseau',
},
};
}
}
class _10_0_17_MigrationCompetenceCreature extends Migration {
get code() { return "competences-creature-parade"; }
get version() { return "10.0.17"; }
async migrate() {
await this.applyItemsUpdates(items => items
.filter(it => it.type == "competencecreature" && it.system.isparade && it.system.categorie_parade == "")
.map(it => { return { _id: it.id, "system.categorie_parade": "armes-naturelles" } }));
await this.applyItemsUpdates(items => items
.filter(it => it.type == "competencecreature" && it.system.iscombat)
.map(it => { return { _id: it.id, "system.categorie": (Grammar.includesLowerCaseNoAccent(it.name, "lancee") ? "lancer" : "melee") } })
);
}
}
export class Migrations {
static getMigrations() {
return [
new _10_0_16_MigrationSortsReserve(),
new _10_0_17_MigrationCompetenceCreature()
];
}
constructor() {
game.settings.register(SYSTEM_RDD, "systemMigrationVersion", {
name: "System Migration Version",
scope: "world",
config: false,
type: String,
default: "0.0.0",
});
}
migrate() {
const currentVersion = game.settings.get(
SYSTEM_RDD,
"systemMigrationVersion"
);
if (isNewerVersion(game.system.version, currentVersion)) {
const migrations = Migrations.getMigrations().filter(m => isNewerVersion(m.version, currentVersion));
if (migrations.length > 0) {
migrations.sort((a, b) =>
isNewerVersion(a.version, b.version)
? 1
: isNewerVersion(b.version, a.version)
? -1
: 0
);
migrations.forEach(async (m) => {
ui.notifications.info(
`Executing migration ${m.code}: version ${currentVersion} is lower than ${m.version}`
);
await m.migrate();
});
ui.notifications.info(
`Migrations done, version will change to ${game.system.version}`
);
} else {
console.log(
LOG_HEAD +
`No migration needeed, version will change to ${game.system.version}`
);
}
game.settings.set(
SYSTEM_RDD,
"systemMigrationVersion",
game.system.version
);
} else {
console.log(LOG_HEAD + `No system version changed`);
}
}
}

View File

@@ -7,9 +7,9 @@ const matchOperationTerms = new RegExp(/@(\w*){([\w\-]+)}/i);
export class RdDAlchimie { export class RdDAlchimie {
/* -------------------------------------------- */ /* -------------------------------------------- */
static processManipulation(recetteData, actorId = undefined) { static processManipulation(recette, actorId = undefined) {
//console.log("CALLED", recette, recette.isOwned, actorId ); //console.log("CALLED", recette, recette.isOwned, actorId );
let manip = recetteData.data.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) {
@@ -17,12 +17,12 @@ export class RdDAlchimie {
//console.log("RESULT ", result); //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}`](recetteData, result[2], actorId); let replacement = this[`_alchimie${commande}`](recette, result[2], actorId);
manip = manip.replace(result[0], replacement); manip = manip.replace(result[0], replacement);
} }
} }
} }
recetteData.data.manipulation_update = manip; recette.system.manipulation_update = manip;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@@ -12,23 +12,23 @@ export class RdDAstrologieJoueur extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async create(actor, dialogConfig) { static async create(actor, dialogConfig) {
let data = { let dialogData = {
nombres: this.organizeNombres(actor), nombres: this.organizeNombres(actor),
dates: game.system.rdd.calendrier.getJoursSuivants(10), dates: game.system.rdd.calendrier.getJoursSuivants(10),
etat: actor.getEtatGeneral(), etat: actor.getEtatGeneral(),
ajustementsConditions: CONFIG.RDD.ajustementsConditions, ajustementsConditions: CONFIG.RDD.ajustementsConditions,
astrologie: RdDItemCompetence.findCompetence(actor.items, 'Astrologie') astrologie: RdDItemCompetence.findCompetence(actor.items, 'Astrologie')
} }
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-astrologie-joueur.html', data); const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-astrologie-joueur.html', dialogData);
let options = { classes: ["rdddialog"], width: 600, height: 500, 'z-index': 99999 }; let options = { classes: ["rdddialog"], width: 600, height: 500, 'z-index': 99999 };
if (dialogConfig.options) { if (dialogConfig.options) {
mergeObject(options, dialogConfig.options, { overwrite: true }); mergeObject(options, dialogConfig.options, { overwrite: true });
} }
return new RdDAstrologieJoueur(html, actor, data); return new RdDAstrologieJoueur(html, actor, dialogData);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
constructor(html, actor, data) { constructor(html, actor, dialogData) {
let myButtons = { let myButtons = {
saveButton: { label: "Fermer", callback: html => this.quitDialog() } saveButton: { label: "Fermer", callback: html => this.quitDialog() }
@@ -41,7 +41,7 @@ export class RdDAstrologieJoueur extends Dialog {
super(dialogConf, dialogOptions); super(dialogConf, dialogOptions);
this.actor = actor; this.actor = actor;
this.dataNombreAstral = duplicate(data); this.dataNombreAstral = duplicate(dialogData);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -63,7 +63,7 @@ export class RdDAstrologieJoueur extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
requestJetAstrologie() { requestJetAstrologie() {
let data = { let socketData = {
id: this.actor.id, id: this.actor.id,
carac_vue: this.actor.system.carac['vue'].value, carac_vue: this.actor.system.carac['vue'].value,
etat: this.dataNombreAstral.etat, etat: this.dataNombreAstral.etat,
@@ -73,11 +73,11 @@ export class RdDAstrologieJoueur extends Dialog {
userId: game.user.id userId: game.user.id
} }
if (Misc.isUniqueConnectedGM()) { if (Misc.isUniqueConnectedGM()) {
game.system.rdd.calendrier.requestNombreAstral(data); game.system.rdd.calendrier.requestNombreAstral(socketData);
} else { } else {
game.socket.emit(SYSTEM_SOCKET_ID, { game.socket.emit(SYSTEM_SOCKET_ID, {
msg: "msg_request_nombre_astral", msg: "msg_request_nombre_astral",
data: data data: socketData
}); });
} }
this.close(); this.close();

View File

@@ -223,9 +223,9 @@ export class RdDCalendrier extends Application {
checkMaladie( periode) { checkMaladie( periode) {
for (let actor of game.actors) { for (let actor of game.actors) {
if (actor.type == 'personnage') { if (actor.type == 'personnage') {
let maladies = actor.filterItems( item => (item.type == 'maladie' || (item.type == 'poison' && item.data.active) ) && item.data.periodicite.toLowerCase().includes(periode) ); let maladies = actor.items.filter( item => (item.type == 'maladie' || (item.type == 'poison' && item.system.active) ) && item.system.periodicite.toLowerCase().includes(periode) );
for (let maladie of maladies) { for (let maladie of maladies) {
if ( maladie.data.identifie) { if ( maladie.system.identifie) {
ChatMessage.create({ content: `${actor.name} souffre de ${maladie.name} (${maladie.type}): vérifiez que les effets ne se sont pas aggravés !` }); ChatMessage.create({ content: `${actor.name} souffre de ${maladie.name} (${maladie.type}): vérifiez que les effets ne se sont pas aggravés !` });
} else { } else {
ChatMessage.create({ content: `${actor.name} souffre d'un mal inconnu (${maladie.type}): vérifiez que les effets ne se sont pas aggravés !` }); ChatMessage.create({ content: `${actor.name} souffre d'un mal inconnu (${maladie.type}): vérifiez que les effets ne se sont pas aggravés !` });
@@ -444,9 +444,9 @@ export class RdDCalendrier extends Application {
/* -------------------------------------------- */ /* -------------------------------------------- */
updateDisplay() { updateDisplay() {
let data = this.fillCalendrierData(); let calendrier = this.fillCalendrierData();
// Rebuild data // Rebuild text du calendrier
let dateHTML = `Jour ${data.jourMois} de ${data.nomMois} (${data.nomSaison})` let dateHTML = `Jour ${calendrier.jourMois} de ${calendrier.nomMois} (${calendrier.nomSaison})`
if (game.user.isGM) { if (game.user.isGM) {
dateHTML = dateHTML + " - NA: " + (this.getCurrentNombreAstral() ?? "indéterminé"); dateHTML = dateHTML + " - NA: " + (this.getCurrentNombreAstral() ?? "indéterminé");
} }
@@ -454,13 +454,13 @@ export class RdDCalendrier extends Application {
handle.innerHTML = dateHTML; handle.innerHTML = dateHTML;
} }
for (let heure of document.getElementsByClassName("calendar-heure-texte")) { for (let heure of document.getElementsByClassName("calendar-heure-texte")) {
heure.innerHTML = data.nomHeure; heure.innerHTML = calendrier.nomHeure;
} }
for (const minute of document.getElementsByClassName("calendar-time-disp")) { for (const minute of document.getElementsByClassName("calendar-time-disp")) {
minute.innerHTML = `${data.minutesRelative} minutes`; minute.innerHTML = `${calendrier.minutesRelative} minutes`;
} }
for (const heureImg of document.getElementsByClassName("calendar-heure-img")) { for (const heureImg of document.getElementsByClassName("calendar-heure-img")) {
heureImg.src = data.iconHeure; heureImg.src = calendrier.iconHeure;
} }
} }

View File

@@ -101,35 +101,35 @@ export class RdDCarac {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static computeCarac(data) { static computeCarac(system) {
data.carac.force.value = Math.min(data.carac.force.value, parseInt(data.carac.taille.value) + 4); system.carac.force.value = Math.min(system.carac.force.value, parseInt(system.carac.taille.value) + 4);
data.carac.derobee.value = Math.floor(parseInt(((21 - data.carac.taille.value)) + parseInt(data.carac.agilite.value)) / 2); system.carac.derobee.value = Math.floor(parseInt(((21 - system.carac.taille.value)) + parseInt(system.carac.agilite.value)) / 2);
let bonusDomKey = Math.floor((parseInt(data.carac.force.value) + parseInt(data.carac.taille.value)) / 2); let bonusDomKey = Math.floor((parseInt(system.carac.force.value) + parseInt(system.carac.taille.value)) / 2);
bonusDomKey = Math.min(Math.max(bonusDomKey, 0), 32); // Clamp de securite bonusDomKey = Math.min(Math.max(bonusDomKey, 0), 32); // Clamp de securite
let tailleData = tableCaracDerivee[bonusDomKey]; let tailleData = tableCaracDerivee[bonusDomKey];
data.attributs.plusdom.value = tailleData.plusdom; system.attributs.plusdom.value = tailleData.plusdom;
data.attributs.sconst.value = RdDCarac.calculSConst(data.carac.constitution.value); system.attributs.sconst.value = RdDCarac.calculSConst(system.carac.constitution.value);
data.attributs.sust.value = tableCaracDerivee[Number(data.carac.taille.value)].sust; system.attributs.sust.value = tableCaracDerivee[Number(system.carac.taille.value)].sust;
data.attributs.encombrement.value = (parseInt(data.carac.force.value) + parseInt(data.carac.taille.value)) / 2; system.attributs.encombrement.value = (parseInt(system.carac.force.value) + parseInt(system.carac.taille.value)) / 2;
data.carac.melee.value = Math.floor((parseInt(data.carac.force.value) + parseInt(data.carac.agilite.value)) / 2); system.carac.melee.value = Math.floor((parseInt(system.carac.force.value) + parseInt(system.carac.agilite.value)) / 2);
data.carac.tir.value = Math.floor((parseInt(data.carac.vue.value) + parseInt(data.carac.dexterite.value)) / 2); system.carac.tir.value = Math.floor((parseInt(system.carac.vue.value) + parseInt(system.carac.dexterite.value)) / 2);
data.carac.lancer.value = Math.floor((parseInt(data.carac.tir.value) + parseInt(data.carac.force.value)) / 2); system.carac.lancer.value = Math.floor((parseInt(system.carac.tir.value) + parseInt(system.carac.force.value)) / 2);
data.sante.vie.max = Math.ceil((parseInt(data.carac.taille.value) + parseInt(data.carac.constitution.value)) / 2); system.sante.vie.max = Math.ceil((parseInt(system.carac.taille.value) + parseInt(system.carac.constitution.value)) / 2);
data.sante.vie.value = Math.min(data.sante.vie.value, data.sante.vie.max) system.sante.vie.value = Math.min(system.sante.vie.value, system.sante.vie.max)
data.sante.endurance.max = Math.max(parseInt(data.carac.taille.value) + parseInt(data.carac.constitution.value), parseInt(data.sante.vie.max) + parseInt(data.carac.volonte.value)); system.sante.endurance.max = Math.max(parseInt(system.carac.taille.value) + parseInt(system.carac.constitution.value), parseInt(system.sante.vie.max) + parseInt(system.carac.volonte.value));
data.sante.endurance.value = Math.min(data.sante.endurance.value, data.sante.endurance.max); system.sante.endurance.value = Math.min(system.sante.endurance.value, system.sante.endurance.max);
data.sante.fatigue.max = data.sante.endurance.max * 2; system.sante.fatigue.max = system.sante.endurance.max * 2;
data.sante.fatigue.value = Math.min(data.sante.fatigue.value, data.sante.fatigue.max); system.sante.fatigue.value = Math.min(system.sante.fatigue.value, system.sante.fatigue.max);
//Compteurs //Compteurs
data.reve.reve.max = data.carac.reve.value; system.reve.reve.max = system.carac.reve.value;
data.compteurs.chance.max = data.carac.chance.value; system.compteurs.chance.max = system.carac.chance.value;
} }

View File

@@ -10,6 +10,7 @@ import { RdDResolutionTable } from "./rdd-resolution-table.js";
import { RdDRoll } from "./rdd-roll.js"; import { RdDRoll } from "./rdd-roll.js";
import { RdDRollTables } from "./rdd-rolltables.js"; import { RdDRollTables } from "./rdd-rolltables.js";
import { ReglesOptionelles } from "./regles-optionelles.js"; import { ReglesOptionelles } from "./regles-optionelles.js";
import { STATUSES } from "./status-effects.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
const premierRoundInit = [ const premierRoundInit = [
@@ -66,7 +67,7 @@ export class RdDCombatManager extends Combat {
/* -------------------------------------------- */ /* -------------------------------------------- */
async finDeRound(options = { terminer: false }) { async finDeRound(options = { terminer: false }) {
for (let combatant of this.data.combatants) { for (let combatant of this.combatants) {
if (combatant.actor) { if (combatant.actor) {
await combatant.actor.finDeRound(options); await combatant.actor.finDeRound(options);
} }
@@ -78,8 +79,8 @@ export class RdDCombatManager extends Combat {
/************************************************************************************/ /************************************************************************************/
async rollInitiative(ids, formula = undefined, messageOptions = {}) { async rollInitiative(ids, formula = undefined, messageOptions = {}) {
console.log(`${game.data.system.data.title} | Combat.rollInitiative()`, ids, formula, messageOptions); console.log(`${game.system.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
// Structure input data
ids = typeof ids === "string" ? [ids] : ids; ids = typeof ids === "string" ? [ids] : ids;
const currentId = this.combatant._id; const currentId = this.combatant._id;
// calculate initiative // calculate initiative
@@ -93,13 +94,13 @@ export class RdDCombatManager extends Combat {
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.items.find(it => it.type == 'arme' && itemData.system.equipe) const armeCombat = combatant.actor.itemTypes['arme'].find(it => it.system.equipe)
const compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.system.competence; const compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.system.competence;
const competence = RdDItemCompetence.findCompetence(combatant.actor.items, compName); const competence = RdDItemCompetence.findCompetence(combatant.actor.items, compName);
if (competence) { 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?.data.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);
} }
} }
@@ -155,14 +156,14 @@ export class RdDCombatManager extends Combat {
// Gestion des armes 1/2 mains // Gestion des armes 1/2 mains
let actionsArme = []; let actionsArme = [];
for (const arme of armes) { for (const arme of armes) {
let action = duplicate(Misc.data(arme)); let action = duplicate(arme)
if (action.system.equipe) { if (action.system.equipe) {
let compData = competences.find(c => c.name == action.system.competence) let compData = competences.find(c => c.name == action.system.competence)
actionsArme.push(action); actionsArme.push(action);
action.action = 'attaque'; action.action = 'attaque';
action.system.dommagesReels = Number(action.system.dommages); action.system.dommagesReels = Number(action.system.dommages);
action.system.niveau = compData.data.niveau; action.system.niveau = compData.system.niveau;
action.system.initiative = RdDCombatManager.calculInitiative(compData.system.niveau, carac[compData.system.defaut_carac].value); action.system.initiative = RdDCombatManager.calculInitiative(compData.system.niveau, carac[compData.system.defaut_carac].value);
// Dupliquer les armes pouvant être à 1 main et 2 mains en patchant la compétence // Dupliquer les armes pouvant être à 1 main et 2 mains en patchant la compétence
if (action.system.unemain && !action.system.deuxmains) { if (action.system.unemain && !action.system.deuxmains) {
@@ -196,15 +197,20 @@ export class RdDCombatManager extends Combat {
return actionsArme.sort(Misc.ascending(armeData => armeData.name + (armeData.system.mainInfo ?? ''))); return actionsArme.sort(Misc.ascending(armeData => armeData.name + (armeData.system.mainInfo ?? '')));
} }
static listActionsCreature(competences) {
return competences.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
.map(it => RdDItemCompetenceCreature.toActionArme(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: 'conjurer', action: 'conjurer',
data: { system: {
competence: p.name, competence: p.name,
possessionid: p.data.data.possessionid, possessionid: p.system.possessionid,
} }
} }
})); }));
@@ -217,21 +223,19 @@ export class RdDCombatManager extends Combat {
if (actions.length>0) { if (actions.length>0) {
return actions; return actions;
} }
let items = actor.items;
if (actor.isCreature()) { if (actor.isCreature()) {
actions = actions.concat(items.filter(it => RdDItemCompetenceCreature.isCompetenceAttaque(it)) actions = actions.concat(RdDCombatManager.listActionsCreature(actor.itemTypes['competencecreature']));
.map(competence => RdDItemCompetenceCreature.toActionArme(competence)));
} else { } else {
// Recupération des items 'arme' // Recupération des items 'arme'
let armes = items.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());
let competences = items.filter(it => it.type == 'competence'); const competences = actor.itemTypes['competence'];
actions = actions.concat(RdDCombatManager.listActionsArmes(armes, competences, actor.data.data.carac)); actions = actions.concat(RdDCombatManager.listActionsArmes(armes, competences, actor.system.carac));
if (actor.data.data.attributs.hautrevant.value) { if (actor.system.attributs.hautrevant.value) {
actions.push({ name: "Draconic", action: 'haut-reve', data: { initOnly: true, competence: "Draconic" } }); actions.push({ name: "Draconic", action: 'haut-reve', system: { initOnly: true, competence: "Draconic" } });
} }
} }
@@ -249,14 +253,14 @@ export class RdDCombatManager extends Combat {
static processPremierRoundInit() { static processPremierRoundInit() {
// Check if we have the whole init ! // Check if we have the whole init !
if (Misc.isUniqueConnectedGM() && game.combat.current.round == 1) { if (Misc.isUniqueConnectedGM() && game.combat.current.round == 1) {
let initMissing = game.combat.data.combatants.find(it => !it.initiative); let initMissing = game.combat.combatants.find(it => !it.initiative);
if (!initMissing) { // Premier round ! if (!initMissing) { // Premier round !
for (let combatant of game.combat.data.combatants) { for (let combatant of game.combat.combatants) {
let action = combatant.initiativeData?.arme; let action = combatant.initiativeData?.arme;
//console.log("Parsed !!!", combatant, initDone, game.combat.current, arme); //console.log("Parsed !!!", combatant, initDone, game.combat.current, arme);
if (action && action.type == "arme") { if (action && action.type == "arme") {
for (let initData of premierRoundInit) { for (let initData of premierRoundInit) {
if (Grammar.toLowerCaseNoAccentNoSpace(action.data.initpremierround).includes(initData.pattern)) { if (Grammar.toLowerCaseNoAccentNoSpace(action.system.initpremierround).includes(initData.pattern)) {
let msg = `<h4>L'initiative de ${combatant.actor.name} a été modifiée !</h4> let msg = `<h4>L'initiative de ${combatant.actor.name} a été modifiée !</h4>
<hr> <hr>
<div> <div>
@@ -327,22 +331,16 @@ export class RdDCombatManager extends Combat {
initOffset = 9; initOffset = 9;
initInfo = "Draconic" initInfo = "Draconic"
} else { } else {
compData = RdDItemCompetence.findCompetence(combatant.actor.items, arme.system.competence); compData = RdDItemCompetence.findCompetence(combatant.actor.items, action.system.competence);
compNiveau = compData.system.niveau; compNiveau = compData.system.niveau;
initInfo = action.name + " / " + action.data.competence; initInfo = action.name + " / " + action.system.competence;
if (combatant.actor.type == 'creature' || combatant.actor.type == 'entite') { if (combatant.actor.type == 'creature' || combatant.actor.type == 'entite') {
caracForInit = compData.data.carac_value; caracForInit = compData.system.carac_value;
if (compData.system.categorie == "lancer") { } else {
initOffset = 7; caracForInit = combatant.actor.system.carac[compData.system.defaut_carac].value;
}
else {
initOffset = 5;
}
} else {
caracForInit = combatant.actor.system.carac[compData.system.defaut_carac].value;
initOffset = RdDCombatManager._baseInitOffset(compData.system.categorie, action);
} }
initOffset = RdDCombatManager._baseInitOffset(compData.system.categorie, action);
} }
let malus = combatant.actor.getEtatGeneral(); // Prise en compte état général let malus = combatant.actor.getEtatGeneral(); // Prise en compte état général
@@ -360,10 +358,12 @@ export class RdDCombatManager extends Combat {
if (categorie == "lancer") { // Offset de principe pour les armes de jet if (categorie == "lancer") { // Offset de principe pour les armes de jet
return 7; return 7;
} }
// Offset de principe pour les armes de jet switch (arme.system.cac) {
switch (arme.data.cac) { case "empoignade":
case "empoignade": return 3; return 3;
case "pugilat": return 4; case "pugilat":
case "naturelle":
return 4;
} }
return 5; return 5;
} }
@@ -384,7 +384,7 @@ export class RdDCombatManager extends Combat {
let menuItems = []; let menuItems = [];
for (let action of actions) { for (let action of actions) {
menuItems.push({ menuItems.push({
name: action.data.competence, name: action.system.competence,
icon: "<i class='fas fa-dice-d6'></i>", icon: "<i class='fas fa-dice-d6'></i>",
callback: target => { RdDCombatManager.rollInitiativeAction(combatantId, action) } callback: target => { RdDCombatManager.rollInitiativeAction(combatantId, action) }
}); });
@@ -415,7 +415,7 @@ export class RdDCombat {
/* -------------------------------------------- */ /* -------------------------------------------- */
static onUpdateCombat(combat, change, options, userId) { static onUpdateCombat(combat, change, options, userId) {
if (combat.data.round != 0 && combat.turns && combat.data.active) { if (combat.round != 0 && combat.turns && combat.active) {
RdDCombat.combatNouveauTour(combat); RdDCombat.combatNouveauTour(combat);
} }
} }
@@ -833,7 +833,7 @@ export class RdDCombat {
// # utilisation esquive // # utilisation esquive
const corpsACorps = this.defender.getCompetence("Corps à corps", { onMessage: it => console.info(it, this.defender) }); const corpsACorps = this.defender.getCompetence("Corps à corps", { onMessage: it => console.info(it, this.defender) });
const esquives = duplicate(this.defender.getCompetences("esquive", { onMessage: it => console.info(it, this.defender) })) const esquives = duplicate(this.defender.getCompetences("esquive", { onMessage: it => console.info(it, this.defender) }))
esquives.forEach(e => e.usages = e?.id ? this.defender.getItemUse(e.id) : 0); esquives.forEach(e => e.system.nbUsage = e?._id ? this.defender.getItemUse(e._id) : 0);
const paramChatDefense = { const paramChatDefense = {
passeArme: attackerRoll.passeArme, passeArme: attackerRoll.passeArme,
@@ -892,8 +892,7 @@ export class RdDCombat {
/* -------------------------------------------- */ /* -------------------------------------------- */
_filterArmesParade(defender, competence) { _filterArmesParade(defender, competence) {
let items = defender.items; let items = defender.items.filter(it => RdDItemArme.isArmeUtilisable(it) || RdDItemCompetenceCreature.isCompetenceParade(it))
items = items.filter(it => RdDItemArme.isArmeUtilisable(it) || RdDItemCompetenceCreature.isCompetenceParade(it))
for (let item of items) { for (let item of items) {
item.system.nbUsage = defender.getItemUse(item.id); // Ajout du # d'utilisation ce round item.system.nbUsage = defender.getItemUse(item.id); // Ajout du # d'utilisation ce round
} }
@@ -960,10 +959,10 @@ export class RdDCombat {
async parade(attackerRoll, armeParadeId) { async parade(attackerRoll, armeParadeId) {
const arme = this.defender.getArmeParade(armeParadeId); const arme = this.defender.getArmeParade(armeParadeId);
console.log("RdDCombat.parade >>>", attackerRoll, armeParadeId, arme); console.log("RdDCombat.parade >>>", attackerRoll, armeParadeId, arme);
const competence = this.system?.competence; const competence = arme?.system?.competence;
if (competence == undefined) if (competence == undefined)
{ {
console.error("Pas de compétence de parade associée à ", arme) ; console.error("Pas de compétence de parade associée à ", arme?.name, armeParadeId) ;
return; return;
} }
@@ -1144,7 +1143,7 @@ export class RdDCombat {
resistance -= perteResistance; resistance -= perteResistance;
defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte'; defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte';
defenderRoll.show.perteResistance = perteResistance; defenderRoll.show.perteResistance = perteResistance;
this.defender.updateEmbeddedDocuments('Item', [{ _id: defenderRoll.arme._id, 'data.resistance': resistance }]); this.defender.updateEmbeddedDocuments('Item', [{ _id: defenderRoll.arme._id, 'system.resistance': resistance }]);
} }
} }
} else { } else {
@@ -1160,7 +1159,7 @@ export class RdDCombat {
resistance -= dmg; resistance -= dmg;
defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte'; defenderRoll.show.deteriorationArme = resistance <= 0 ? 'brise' : 'perte';
defenderRoll.show.perteResistance = dmg; defenderRoll.show.perteResistance = dmg;
this.defender.updateEmbeddedDocuments('Item', [{ _id: defenderRoll.arme._id, 'data.resistance': resistance }]); this.defender.updateEmbeddedDocuments('Item', [{ _id: defenderRoll.arme._id, 'system.resistance': resistance }]);
} }
} }
// Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132) // Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132)
@@ -1186,7 +1185,7 @@ export class RdDCombat {
defenderRoll.show.recul = 'encaisse'; defenderRoll.show.recul = 'encaisse';
} else if (rollRecul.rolled.isETotal || this._isReculCauseChute(impact)) { } else if (rollRecul.rolled.isETotal || this._isReculCauseChute(impact)) {
defenderRoll.show.recul = 'chute'; defenderRoll.show.recul = 'chute';
await this.defender.setStatusEffect("EFFECT.StatusProne", true); await this.defender.setEffect(STATUSES.StatusProne, true);
} }
else { else {
defenderRoll.show.recul = 'recul'; defenderRoll.show.recul = 'recul';
@@ -1274,7 +1273,7 @@ export class RdDCombat {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async displayActorCombatStatus(combat, actor) { static async displayActorCombatStatus(combat, actor) {
let data = { let formData = {
combatId: combat._id, combatId: combat._id,
alias: actor.name, alias: actor.name,
etatGeneral: actor.getEtatGeneral(), etatGeneral: actor.getEtatGeneral(),
@@ -1286,13 +1285,13 @@ export class RdDCombat {
isCritique: false isCritique: false
} }
if (actor.countBlessuresNonSoigneeByName("critiques") > 0) { // Pour éviter le cumul grave + critique if (actor.countBlessuresNonSoigneeByName("critiques") > 0) { // Pour éviter le cumul grave + critique
data.isCritique = true; formData.isCritique = true;
} else if (actor.countBlessuresNonSoigneeByName("graves") > 0) { } else if (actor.countBlessuresNonSoigneeByName("graves") > 0) {
data.isGrave = true; formData.isGrave = true;
} }
ChatUtility.createChatWithRollMode(actor.name, { ChatUtility.createChatWithRollMode(actor.name, {
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-summary.html`, data) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-summary.html`, formData)
}); });
} }
} }

View File

@@ -358,10 +358,9 @@ export class RdDCommands {
async supprimerSignesDraconiquesEphemeres() { async supprimerSignesDraconiquesEphemeres() {
game.actors.forEach(actor => { game.actors.forEach(actor => {
const ephemeres = actor.filterItems(item => item.type = 'signedraconique' && item.system.ephemere) const ephemeres = actor.items.filter(item => item.type = 'signedraconique' && item.system.ephemere);
.map(item => item.id);
if (ephemeres.length > 0) { if (ephemeres.length > 0) {
actor.deleteEmbeddedDocuments("Item", ephemeres); actor.deleteEmbeddedDocuments("Item", ephemeres.map(item => item.id));
} }
}); });
return true; return true;

View File

@@ -3,11 +3,11 @@ import { Misc } from "./misc.js";
export class RddCompendiumOrganiser { export class RddCompendiumOrganiser {
static init() { static init() {
Hooks.on('renderCompendium', async (pack, html, data) => RddCompendiumOrganiser.onRenderCompendium(pack, html, data)) Hooks.on('renderCompendium', async (pack, html, compendiumData) => RddCompendiumOrganiser.onRenderCompendium(pack, html, compendiumData))
} }
static async onRenderCompendium(compendium, html, data) { static async onRenderCompendium(compendium, html, compendiumData) {
console.log('onRenderCompendium', compendium, html, data); console.log('onRenderCompendium', compendium, html, compendiumData);
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) => {

View File

@@ -18,18 +18,19 @@ const tableGemmes = {
export class RdDGemme extends Item { export class RdDGemme extends Item {
static getGemmeTypeOptionList() { static getGemmeTypeOptionList() {
// TODO: look how to map object key-value pairs
let options = "" let options = ""
for (let gemmeKey in tableGemmes) { for (let gemmeKey in tableGemmes) {
let gemmeData = tableGemmes[gemmeKey]; options += `<option value="${gemmeKey}">${tableGemmes[gemmeKey].label}</option>`
options += `<option value="${gemmeKey}">${gemmeData.label}</option>`
} }
return options; return options;
} }
static calculDataDerivees(data) {
data.cout = (data.taille * data.purete) + data.qualite; static calculDataDerivees(gemme) {
data.inertie = 7 - data.purete; gemme.system.cout = (gemme.system.taille * gemme.system.purete) + gemme.system.qualite;
data.enchantabilite = data.taille - data.inertie; gemme.system.inertie = 7 - gemme.system.purete;
gemme.system.enchantabilite = gemme.system.taille - gemme.system.inertie;
} }
} }

View File

@@ -1,6 +1,4 @@
/* -------------------------------------------- */
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
import { Misc } from "./misc.js";
import { RdDCalendrier } from "./rdd-calendrier.js"; import { RdDCalendrier } from "./rdd-calendrier.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -22,12 +20,11 @@ export class RdDHerbes extends Item {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static buildHerbesList(listHerbes, max) { static buildHerbesList(listeHerbes, max) {
let list = {} let list = {}
for ( let herbe of listHerbes) { for ( let herbe of listeHerbes) {
let herbeData = herbe.system let brins = max - herbe.system.niveau;
let brins = max - herbeData.niveau; list[herbe.system.name] = `${herbe.system.name} (Bonus: ${herbe.system.niveau}, Brins: ${brins})`;
list[herbe.data.name] = `${herbe.data.name} (Bonus: ${herbeData.niveau}, Brins: ${brins})`;
} }
list['Autre'] = 'Autre (Bonus: variable, Brins: variable)' list['Autre'] = 'Autre (Bonus: variable, Brins: variable)'
return list; return list;
@@ -39,36 +36,39 @@ export class RdDHerbes extends Item {
formData.herbesRepos = this.buildHerbesList(this.herbesRepos, 7); formData.herbesRepos = this.buildHerbesList(this.herbesRepos, 7);
formData.jourMoisOptions = RdDCalendrier.buildJoursMois(); formData.jourMoisOptions = RdDCalendrier.buildJoursMois();
formData.dateActuelle = game.system.rdd.calendrier.getDateFromIndex(); formData.dateActuelle = game.system.rdd.calendrier.getDateFromIndex();
formData.splitDate = game.system.rdd.calendrier.getNumericDateFromIndex(formData.data.prdate); formData.splitDate = game.system.rdd.calendrier.getNumericDateFromIndex(formData.system.prdate);
if (formData.data.categorie.includes('Soin') ) { if (formData.system.categorie.includes('Soin') ) {
formData.isHerbe = true; formData.isHerbe = true;
this.computeHerbeBonus(formData, this.herbesSoins, 12); this.computeHerbeBonus(formData, this.herbesSoins, 12);
} else if (formData.data.categorie.includes('Repos')) { } else if (formData.system.categorie.includes('Repos')) {
formData.isRepos = true; formData.isRepos = true;
this.computeHerbeBonus(formData, this.herbesRepos, 7); this.computeHerbeBonus(formData, this.herbesRepos, 7);
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static calculePointsRepos( data ) { static calculePuissancePotion( potion ) {
return data.herbebonus * data.pr; return potion.system.herbebonus * potion.system.pr;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static calculePointsGuerison( data ){ static calculePointsRepos( potion ) {
return data.herbebonus * data.pr; return potion.system.herbebonus * potion.system.pr;
}
/* -------------------------------------------- */
static calculePointsGuerison( potion ){
return potion.system.herbebonus * potion.system.pr;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static computeHerbeBonus( formData, herbesList, max) { static computeHerbeBonus( formData, herbesList, max) {
if ( Number(formData.data.herbebrins) ) { if ( Number(formData.system.herbebrins) ) {
let herbe = herbesList.find(item => item.name.toLowerCase() == formData.data.herbe.toLowerCase() ); let herbe = herbesList.find(item => item.name.toLowerCase() == formData.system.herbe.toLowerCase() );
if( herbe ) { if( herbe ) {
let herbeData = herbe.system; let brinsBase = max - herbe.system.niveau;
let brinsBase = max - herbeData.niveau; formData.system.herbebonus = Math.max(herbe.system.niveau - Math.max(brinsBase - formData.system.herbebrins, 0), 0);
//console.log(herbeData, brinsBase, formData.data.herbebrins);
formData.data.herbebonus = Math.max(herbeData.niveau - Math.max(brinsBase - formData.data.herbebrins, 0), 0);
} }
} }
} }

View File

@@ -2,64 +2,46 @@ import { Misc } from "./misc.js";
export class RdDHotbar { export class RdDHotbar {
static async addToHotbar(item, slot) {
let command = `game.system.rdd.RdDHotbar.rollMacro("${item.name}", "${item.type}");`;
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command));
if (!macro) {
macro = await Macro.create({
name: item.name,
type: "script",
img: item.img,
command: command
}, { displaySheet: false })
}
await game.user.assignHotbarMacro(macro, slot);
}
/** /**
* Create a macro when dropping an entity on the hotbar * Create a macro when dropping an entity on the hotbar
* Item - open roll dialog for item * Item - open roll dialog for item
* Actor - open actor sheet * Actor - open actor sheet
* Journal - open journal sheet * Journal - open journal sheet
*/ */
static initDropbar( ) { static initDropbar() {
Hooks.on("hotbarDrop", async (bar, documentData, slot) => { Hooks.on("hotbarDrop", (bar, documentData, slot) => {
// Create item macro if rollable item - weapon, spell, prayer, trait, or skill
if (documentData.type == "Item") { // Create item macro if rollable item - weapon, spell, prayer, trait, or skill
if (documentData.data.type != "arme" && documentData.data.type != "competence" ) if (documentData.type == "Item") {
return let item = fromUuidSync(documentData.uuid)
let item = documentData.data if (item == undefined) {
let command = `game.system.rdd.RdDHotbar.rollMacro("${item.name}", "${item.type}");`; item = this.actor.items.get(documentData.uuid)
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command)); }
if (!macro) { console.log("DROP", documentData, item)
macro = await Macro.create({ if (!item || (item.type != "arme" && item.type != "competence")) {
name: item.name, return true
type: "script", }
img: item.img, this.addToHotbar(item, slot)
command: command return false
}, { displaySheet: false })
} }
game.user.assignHotbarMacro(macro, slot);
} return true
// Create a macro to open the actor sheet of the actor dropped on the hotbar })
else if (documentData.type == "Actor") {
let actor = game.actors.get(documentData.id);
let command = `game.actors.get("${documentData.id}").sheet.render(true)`
let macro = game.macros.contents.find(m => (m.name === actor.name) && (m.command === command));
if (!macro) {
macro = await Macro.create({
name: actor.data.name,
type: "script",
img: actor.data.img,
command: command
}, { displaySheet: false })
game.user.assignHotbarMacro(macro, slot);
}
}
// Create a macro to open the journal sheet of the journal dropped on the hotbar
else if (documentData.type == "JournalEntry") {
let journal = game.journal.get(documentData.id);
let command = `game.journal.get("${documentData.id}").sheet.render(true)`
let macro = game.macros.contents.find(m => (m.name === journal.name) && (m.command === command));
if (!macro) {
macro = await Macro.create({
name: journal.data.name,
type: "script",
img: "systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp",
command: command
}, { displaySheet: false })
game.user.assignHotbarMacro(macro, slot);
}
}
return false;
});
} }
/** Roll macro */ /** Roll macro */
@@ -69,15 +51,17 @@ export class RdDHotbar {
if (speaker.token) actor = game.actors.tokens[speaker.token]; if (speaker.token) actor = game.actors.tokens[speaker.token];
if (!actor) actor = game.actors.get(speaker.actor); if (!actor) actor = game.actors.get(speaker.actor);
let item = Misc.data(actor?.items.find(it => it.name === itemName && it.type == itemType)); let item = actor?.items.find(it => it.name === itemName && it.type == itemType) ?? undefined;
if (!item) return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`); if (!item) {
return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`);
}
// Trigger the item roll // Trigger the item roll
switch (item.type) { switch (item.type) {
case "arme": case "arme":
return actor.rollArme(item); return actor.rollArme(item);
case "competence": case "competence":
return actor.rollCompetence( itemName ); return actor.rollCompetence(itemName);
} }
} }

View File

@@ -35,6 +35,7 @@ import { RdDDice } from "./rdd-dice.js";
import { RdDPossession } from "./rdd-possession.js"; import { RdDPossession } from "./rdd-possession.js";
import { RdDSigneDraconiqueItemSheet } from "./item-signedraconique-sheet.js"; import { RdDSigneDraconiqueItemSheet } from "./item-signedraconique-sheet.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { Migrations } from './migrations.js';
/* -------------------------------------------- */ /* -------------------------------------------- */
/* Foundry VTT Initialization */ /* Foundry VTT Initialization */
@@ -183,7 +184,7 @@ Hooks.once("init", async function () {
Items.registerSheet(SYSTEM_RDD, RdDItemSheet, { Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
types: ["arme", "armure", "objet", "arme", "armure", "conteneur", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition", "rencontresTMR", "queue", "ombre", "souffle", types: ["arme", "armure", "objet", "arme", "armure", "conteneur", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition", "rencontresTMR", "queue", "ombre", "souffle",
"tete", "competencecreature", "tarot", "monnaie", "nombreastral", "tache", "meditation", "casetmr", "recettealchimique", "gemme", "tete", "competencecreature", "tarot", "monnaie", "nombreastral", "tache", "meditation", "casetmr", "recettealchimique", "gemme",
"musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre", "nourritureboisson", "possession"], makeDefault: true "musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre", "nourritureboisson", "possession", "sortreserve"], makeDefault: true
}); });
CONFIG.Combat.documentClass = RdDCombatManager; CONFIG.Combat.documentClass = RdDCombatManager;
@@ -245,6 +246,9 @@ function registerUsageCount( registerKey ) {
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.once("ready", async function () { Hooks.once("ready", async function () {
await migrationPngWebp_1_5_34() await migrationPngWebp_1_5_34()
if (Misc.isUniqueConnectedGM()) {
new Migrations().migrate();
}
StatusEffects.onReady(); StatusEffects.onReady();
RdDHerbes.initializeHerbes(); RdDHerbes.initializeHerbes();
@@ -292,8 +296,8 @@ async function migrationPngWebp_1_5_34() {
await Item.updateDocuments(itemsUpdates); await Item.updateDocuments(itemsUpdates);
await Actor.updateDocuments(actorsUpdates); await Actor.updateDocuments(actorsUpdates);
game.actors.forEach(actor => { game.actors.forEach(actor => {
if (actor.data.token?.img && actor.data.token.img.match(regexOldPngJpg)) { if (actor.token?.img && actor.token.img.match(regexOldPngJpg)) {
actor.update({ "token.img": convertImgToWebp(actor.data.token.img) }); actor.update({ "token.img": convertImgToWebp(actor.token.img) });
} }
const actorItemsToUpdate = prepareDocumentsImgUpdate(actor.items); const actorItemsToUpdate = prepareDocumentsImgUpdate(actor.items);
actor.updateEmbeddedDocuments('Item', actorItemsToUpdate); actor.updateEmbeddedDocuments('Item', actorItemsToUpdate);

View File

@@ -84,7 +84,7 @@ export class RdDPossession {
attacker: attacker, attacker: attacker,
defender: defender, defender: defender,
competence: defender.getDraconicOuPossession(), competence: defender.getDraconicOuPossession(),
selectedCarac: defender.system.data.carac.reve, selectedCarac: defender.system.carac.reve,
forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: defender.getReveActuel() } } forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: defender.getReveActuel() } }
} }
rollData.competence.system.defaut_carac = 'reve-actuel' rollData.competence.system.defaut_carac = 'reve-actuel'
@@ -159,7 +159,7 @@ export class RdDPossession {
let possessionData = { let possessionData = {
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",
data: { description: "", typepossession: attacker.name, possede: false, possessionid: randomID(16), possesseurid: attacker.id, possedeid: defender.id, date: 0, compteur: 0 } system: { description: "", typepossession: attacker.name, possede: false, possessionid: randomID(16), possesseurid: attacker.id, possedeid: defender.id, date: 0, compteur: 0 }
} }
// Creates only the possession on the personnage side // Creates only the possession on the personnage side
let poss = await defender.createEmbeddedDocuments('Item', [possessionData]) let poss = await defender.createEmbeddedDocuments('Item', [possessionData])

View File

@@ -166,7 +166,7 @@ export class RdDResolutionTable {
if (rollData.selectedCarac?.label.toLowerCase().includes('chance')) { if (rollData.selectedCarac?.label.toLowerCase().includes('chance')) {
return true; return true;
} }
if (rollData.selectedSort?.data.isrituel) { if (rollData.selectedSort?.system.isrituel) {
return true; return true;
} }
return false; return false;

View File

@@ -165,8 +165,8 @@ export class RdDRoll extends Dialog {
function onLoad() { function onLoad() {
let rollData = dialog.rollData; let rollData = dialog.rollData;
console.log(rollData); console.log('Ouverture RdDRoll', rollData);
// Update html, according to data // Update html, according to rollData
if (rollData.competence) { if (rollData.competence) {
const defaut_carac = rollData.competence.system.defaut_carac const defaut_carac = rollData.competence.system.defaut_carac
// Set the default carac from the competence item // Set the default carac from the competence item
@@ -221,7 +221,7 @@ export class RdDRoll extends Dialog {
}); });
html.find('#ptreve-variable').change((event) => { html.find('#ptreve-variable').change((event) => {
let ptreve = Misc.toInt(event.currentTarget.value); let ptreve = Misc.toInt(event.currentTarget.value);
this.rollData.selectedSort.data.ptreve_reel = ptreve; this.rollData.selectedSort.system.ptreve_reel = ptreve;
console.log("RdDRollSelectDialog - Cout reve", ptreve); console.log("RdDRollSelectDialog - Cout reve", ptreve);
this.updateRollResult(); this.updateRollResult();
}); });
@@ -294,7 +294,7 @@ export class RdDRoll extends Dialog {
async setSelectedSigneDraconique(signe){ async setSelectedSigneDraconique(signe){
this.rollData.signe = signe; this.rollData.signe = signe;
this.rollData.diffLibre = Misc.data(signe).data.difficulte, this.rollData.diffLibre = signe.system.difficulte,
$(".signe-difficulte").text(Misc.toSignedString(this.rollData.diffLibre)); $(".signe-difficulte").text(Misc.toSignedString(this.rollData.diffLibre));
} }
@@ -348,10 +348,10 @@ export class RdDRoll extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
_computeDiffCompetence(rollData) { _computeDiffCompetence(rollData) {
if (rollData.competence) { if (rollData.competence) {
return Misc.toInt(rollData.competence.data.niveau); return Misc.toInt(rollData.competence.system.niveau);
} }
if (rollData.draconicList) { if (rollData.draconicList) {
return Misc.toInt(rollData.competence.data.niveau); return Misc.toInt(rollData.competence.system.niveau);
} }
return 0; return 0;
} }

View File

@@ -25,7 +25,7 @@ export class RdDRollTables {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async drawTextFromRollTable(tableName, toChat) { static async drawTextFromRollTable(tableName, toChat) {
const drawResult = await RdDRollTables.genericGetTableResult(tableName, toChat); const drawResult = await RdDRollTables.genericGetTableResult(tableName, toChat);
return drawResult.system.text; return drawResult.text;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@@ -21,17 +21,14 @@ export class RdDSheetUtility {
} }
static prepareItemDropParameters(destItemId, actorId, dragData, objetVersConteneur) { static prepareItemDropParameters(destItemId, actorId, dragData, objetVersConteneur) {
console.log("ID", dragData)
const item = fromUuidSync(dragData.uuid) const item = fromUuidSync(dragData.uuid)
let itemId = item.id
//const itemId = dragData.id || dragData.data._id
return { return {
destId: destItemId, destId: destItemId,
targetActorId: actorId, targetActorId: actorId,
itemId: itemId, itemId: item.id,
sourceActorId: dragData.actorId, sourceActorId: item.actor?.id,
srcId: objetVersConteneur[itemId], srcId: objetVersConteneur[item.id],
onEnleverConteneur: () => { delete objetVersConteneur[itemId]; }, onEnleverConteneur: () => { delete objetVersConteneur[item.id]; },
onAjouterDansConteneur: (itemId, conteneurId) => { objetVersConteneur[itemId] = conteneurId; } onAjouterDansConteneur: (itemId, conteneurId) => { objetVersConteneur[itemId] = conteneurId; }
} }
} }
@@ -47,10 +44,10 @@ export class RdDSheetUtility {
static async _onSplitItem(item, split, actor) { static async _onSplitItem(item, split, actor) {
if (split >= 1 && split < item.system.quantite) { if (split >= 1 && split < item.system.quantite) {
await item.diminuerQuantite(split); await item.diminuerQuantite(split);
const itemData = duplicate(item); const splitItem = duplicate(item);
// todo: ajouter dans le même conteneur? // todo: ajouter dans le même conteneur?
itemData.system.quantite = split; splitItem.system.quantite = split;
await actor.createEmbeddedDocuments('Item', [itemData]) await actor.createEmbeddedDocuments('Item', [splitItem])
} }
} }
} }

View File

@@ -1,4 +1,3 @@
import { SYSTEM_SOCKET_ID } from "./constants.js";
import { RollDataAjustements } from "./rolldata-ajustements.js"; import { RollDataAjustements } from "./rolldata-ajustements.js";
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
import { TMRUtility } from "./tmr-utility.js"; import { TMRUtility } from "./tmr-utility.js";
@@ -16,6 +15,7 @@ import { Misc } from "./misc.js";
import { HtmlUtility } from "./html-utility.js"; import { HtmlUtility } from "./html-utility.js";
import { ReglesOptionelles } from "./regles-optionelles.js"; import { ReglesOptionelles } from "./regles-optionelles.js";
import { RdDDice } from "./rdd-dice.js"; import { RdDDice } from "./rdd-dice.js";
import { STATUSES } from "./status-effects.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
export class RdDTMRDialog extends Dialog { export class RdDTMRDialog extends Dialog {
@@ -55,7 +55,6 @@ export class RdDTMRDialog extends Dialog {
this.fatigueParCase = this.viewOnly || !ReglesOptionelles.isUsing("appliquer-fatigue") ? 0 : this.actor.getTMRFatigue(); this.fatigueParCase = this.viewOnly || !ReglesOptionelles.isUsing("appliquer-fatigue") ? 0 : this.actor.getTMRFatigue();
this.cumulFatigue = 0; this.cumulFatigue = 0;
this.loadRencontres(); this.loadRencontres();
this.loadSortsReserve();
this.loadCasesSpeciales(); this.loadCasesSpeciales();
this.allTokens = []; this.allTokens = [];
this.rencontreState = 'aucune'; this.rencontreState = 'aucune';
@@ -81,9 +80,16 @@ export class RdDTMRDialog extends Dialog {
this.casesSpeciales = this.actor.items.filter(item => Draconique.isCaseTMR(item)); this.casesSpeciales = this.actor.items.filter(item => Draconique.isCaseTMR(item));
} }
/* -------------------------------------------- */ get sortsReserve() {
loadSortsReserve() { return this.actor.itemTypes['sortreserve'];
this.sortsReserves = this.actor.system.reve.reserve.list; }
getSortsReserve(coord) {
return this.actor.itemTypes['sortreserve'].filter(// Reserve sur une case fleuve ou normale
TMRUtility.getTMR(coord).type == 'fleuve'
? it => TMRUtility.getTMR(it.system.coord).type == 'fleuve'
: it => it.system.coord == coord
);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -97,10 +103,10 @@ export class RdDTMRDialog extends Dialog {
this.updateTokens(); this.updateTokens();
this.forceDemiRevePositionView(); this.forceDemiRevePositionView();
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_createTokens() { _createTokens() {
if (!this.isDemiReveCache()){ if (!this.isDemiReveCache()) {
this.demiReve = this._tokenDemiReve(); this.demiReve = this._tokenDemiReve();
this._trackToken(this.demiReve); this._trackToken(this.demiReve);
} }
@@ -117,7 +123,6 @@ export class RdDTMRDialog extends Dialog {
updateTokens() { updateTokens() {
this._removeTokens(t => true); this._removeTokens(t => true);
this.loadRencontres(); this.loadRencontres();
this.loadSortsReserve();
this.loadCasesSpeciales(); this.loadCasesSpeciales();
this._createTokens(); this._createTokens();
} }
@@ -136,7 +141,7 @@ export class RdDTMRDialog extends Dialog {
return this.rencontresExistantes.map(it => this._tokenRencontre(it)); return this.rencontresExistantes.map(it => this._tokenRencontre(it));
} }
_getTokensSortsReserve() { _getTokensSortsReserve() {
return this.sortsReserves.map(it => this._tokenSortEnReserve(it)); return this.actor.itemTypes['sortreserve'].map(it => this._tokenSortEnReserve(it));
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -148,8 +153,8 @@ export class RdDTMRDialog extends Dialog {
const draconique = Draconique.get(caseData.system.specific); const draconique = Draconique.get(caseData.system.specific);
return draconique?.token(this.pixiTMR, caseData, () => caseData.system.coord); return draconique?.token(this.pixiTMR, caseData, () => caseData.system.coord);
} }
_tokenSortEnReserve(sortEnReserve) { _tokenSortEnReserve(sortReserve) {
return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortEnReserve.sort, () => sortEnReserve.coord); return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortReserve, () => sortReserve.system.coord);
} }
_tokenDemiReve() { _tokenDemiReve() {
@@ -209,24 +214,12 @@ export class RdDTMRDialog extends Dialog {
this.actor.rollLireSigneDraconique(this._getActorCoord()); this.actor.rollLireSigneDraconique(this._getActorCoord());
}); });
html.find('#dir-top').click((event) => { html.find('#dir-top').click((event) => this.moveFromKey("top"));
this.moveFromKey("top"); html.find('#dir-top-left').click((event) => this.moveFromKey("top-left"));
}); html.find('#dir-top-right').click((event) => this.moveFromKey("top-right"));
html.find('#dir-top-left').click((event) => { html.find('#dir-bottom-left').click((event) => this.moveFromKey("bottom-left"));
this.moveFromKey("top-left"); html.find('#dir-bottom-right').click((event) => this.moveFromKey("bottom-right"));
}); html.find('#dir-bottom').click((event) => this.moveFromKey("bottom"));
html.find('#dir-top-right').click((event) => {
this.moveFromKey("top-right");
});
html.find('#dir-bottom-left').click((event) => {
this.moveFromKey("bottom-left");
});
html.find('#dir-bottom-right').click((event) => {
this.moveFromKey("bottom-right");
});
html.find('#dir-bottom').click((event) => {
this.moveFromKey("bottom");
});
// Gestion du cout de montée en points de rêve // Gestion du cout de montée en points de rêve
let reveCout = ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse(); let reveCout = ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse();
@@ -238,13 +231,14 @@ export class RdDTMRDialog extends Dialog {
// Le reste... // Le reste...
this.updateValuesDisplay(); this.updateValuesDisplay();
let tmr = TMRUtility.getTMR(this._getActorCoord()); let tmr = TMRUtility.getTMR(this._getActorCoord());
await this.manageRencontre(tmr, () => { await this.manageRencontre(tmr);
this.postRencontre(tmr);
});
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async updateValuesDisplay() { async updateValuesDisplay() {
if (!this.rendered) {
return;
}
const coord = this._getActorCoord(); const coord = this._getActorCoord();
HtmlUtility._showControlWhen($(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(coord)); HtmlUtility._showControlWhen($(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(coord));
@@ -254,9 +248,9 @@ export class RdDTMRDialog extends Dialog {
let tmrpos = document.getElementById("tmr-pos"); let tmrpos = document.getElementById("tmr-pos");
if (this.isDemiReveCache()) { if (this.isDemiReveCache()) {
tmrpos.innerHTML = '?? (' + TMRUtility.getTMRType(coord) + ')'; tmrpos.innerHTML = `?? ( ${ TMRUtility.getTMRType(coord)})`;
} else { } else {
tmrpos.innerHTML = coord + " (" + TMRUtility.getTMRLabel(coord) + ")"; tmrpos.innerHTML = `${coord} ( ${TMRUtility.getTMRLabel(coord)})`;
} }
let etat = document.getElementById("tmr-etatgeneral-value"); let etat = document.getElementById("tmr-etatgeneral-value");
@@ -267,21 +261,22 @@ export class RdDTMRDialog extends Dialog {
if (ReglesOptionelles.isUsing("appliquer-fatigue")) { if (ReglesOptionelles.isUsing("appliquer-fatigue")) {
let fatigueItem = document.getElementById("tmr-fatigue-table"); let fatigueItem = document.getElementById("tmr-fatigue-table");
//console.log("Refresh : ", actorData.data.sante.fatigue.value);
fatigueItem.innerHTML = "<table class='table-fatigue'>" + RdDUtility.makeHTMLfatigueMatrix(this.actor.system.sante.fatigue.value, this.actor.system.sante.endurance.max).html() + "</table>"; fatigueItem.innerHTML = "<table class='table-fatigue'>" + RdDUtility.makeHTMLfatigueMatrix(this.actor.system.sante.fatigue.value, this.actor.system.sante.endurance.max).html() + "</table>";
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
close() { async close() {
if ( this.actor.tmrApp ) { this.descenteTMR = true;
if (this.actor.tmrApp) {
this.actor.tmrApp = undefined; // Cleanup reference this.actor.tmrApp = undefined; // Cleanup reference
if ( !this.viewOnly ) { if (!this.viewOnly) {
this.actor.setStatusEffect("EFFECT.StatusDemiReve", false); await this.actor.setEffect(STATUSES.StatusDemiReve, false)
this._tellToGM(this.actor.name + " a quitté les terres médianes"); this._tellToGM(this.actor.name + " a quitté les terres médianes");
} }
this.actor.santeIncDec("fatigue", this.cumulFatigue).then(super.close()); // moving 1 cell costs 1 fatigue await this.actor.santeIncDec("fatigue", this.cumulFatigue)
} }
await super.close(); // moving 1 cell costs 1 fatigue
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -317,11 +312,11 @@ export class RdDTMRDialog extends Dialog {
this.currentRencontre.graphics = []; // Keep track of rectangles to delete it this.currentRencontre.graphics = []; // Keep track of rectangles to delete it
this.currentRencontre.locList = duplicate(listCoordTMR); // And track of allowed location this.currentRencontre.locList = duplicate(listCoordTMR); // And track of allowed location
for (let coordTMR of listCoordTMR) { for (let coordTMR of listCoordTMR) {
let rect = this._getCaseRectangleCoord(coordTMR); const rect = this._getCaseRectangleCoord(coordTMR);
var rectDraw = new PIXI.Graphics(); const rectDraw = new PIXI.Graphics();
rectDraw.beginFill(0xFFFF00, 0.3); rectDraw.beginFill(0xffff00, 0.3);
// set the line style to have a width of 5 and set the color to red // set the line style to have a width of 5 and set the color to red
rectDraw.lineStyle(5, 0xFF0000); rectDraw.lineStyle(5, 0xff0000);
// draw a rectangle // draw a rectangle
rectDraw.drawRect(rect.x, rect.y, rect.w, rect.h); rectDraw.drawRect(rect.x, rect.y, rect.w, rect.h);
this.pixiApp.stage.addChild(rectDraw); this.pixiApp.stage.addChild(rectDraw);
@@ -337,19 +332,13 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
async choisirCasePortee(coord, portee) { async choisirCasePortee(coord, portee) {
if (this.actor.isTMRCache())
{
return;
}
// Récupère la liste des cases à portées // Récupère la liste des cases à portées
let locList = TMRUtility.getTMRPortee(coord, portee); this.colorierZoneRencontre(TMRUtility.getTMRPortee(coord, portee));
this.colorierZoneRencontre(locList);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async choisirCaseType(type) { async choisirCaseType(type) {
const locList = TMRUtility.filterTMR(it => it.type == type).map(it => it.coord); this.colorierZoneRencontre(TMRUtility.filterTMR(it => it.type == type).map(it => it.coord));
this.colorierZoneRencontre(locList);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -484,12 +473,13 @@ export class RdDTMRDialog extends Dialog {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async manageRencontre(tmr, postRencontre) { async manageRencontre(tmr) {
if (this.viewOnly) { if (this.viewOnly) {
return; return;
} }
this.descenteTMR = false;
this.currentRencontre = undefined; this.currentRencontre = undefined;
if (this._presentCite(tmr, postRencontre)) { if (this._presentCite(tmr)) {
return; return;
} }
let rencontre = await this._jetDeRencontre(tmr); let rencontre = await this._jetDeRencontre(tmr);
@@ -499,27 +489,27 @@ export class RdDTMRDialog extends Dialog {
console.log("manageRencontre", rencontre); console.log("manageRencontre", rencontre);
this.currentRencontre = duplicate(rencontre); this.currentRencontre = duplicate(rencontre);
let dialog = new RdDTMRRencontreDialog("", this, this.currentRencontre, postRencontre); let dialog = new RdDTMRRencontreDialog(this, this.currentRencontre, () => this.postRencontre(tmr));
dialog.render(true); dialog.render(true);
} }
else { else {
postRencontre(); this.postRencontre(tmr);
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_presentCite(tmr, postRencontre) { _presentCite(tmr) {
const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord)); const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord));
if (presentCite) { if (presentCite) {
this.minimize(); this.minimize();
const caseData = presentCite; const caseData = presentCite;
EffetsDraconiques.presentCites.choisirUnPresent(caseData, (type => this._utiliserPresentCite(presentCite, type, tmr, postRencontre))); EffetsDraconiques.presentCites.choisirUnPresent(caseData, (type => this._utiliserPresentCite(presentCite, type, tmr)));
} }
return presentCite; return presentCite;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async _utiliserPresentCite(presentCite, typeRencontre, tmr, postRencontre) { async _utiliserPresentCite(presentCite, typeRencontre, tmr) {
this.currentRencontre = TMRRencontres.getRencontre(typeRencontre); this.currentRencontre = TMRRencontres.getRencontre(typeRencontre);
await TMRRencontres.evaluerForceRencontre(this.currentRencontre); await TMRRencontres.evaluerForceRencontre(this.currentRencontre);
await EffetsDraconiques.presentCites.ouvrirLePresent(this.actor, presentCite); await EffetsDraconiques.presentCites.ouvrirLePresent(this.actor, presentCite);
@@ -538,7 +528,7 @@ export class RdDTMRDialog extends Dialog {
await this._tentativeMaitrise(rencontreData); await this._tentativeMaitrise(rencontreData);
this.maximize(); this.maximize();
postRencontre(); this.postRencontre(tmr);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -574,6 +564,9 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
async manageTmrInnaccessible(tmr) { async manageTmrInnaccessible(tmr) {
if (!tmr) {
return await this.actor.reinsertionAleatoire('Sortie de carte');
}
const caseTmrInnaccessible = this.casesSpeciales.find(c => EffetsDraconiques.isInnaccessible(c, tmr.coord)); const caseTmrInnaccessible = this.casesSpeciales.find(c => EffetsDraconiques.isInnaccessible(c, tmr.coord));
if (caseTmrInnaccessible) { if (caseTmrInnaccessible) {
return await this.actor.reinsertionAleatoire(caseTmrInnaccessible.name); return await this.actor.reinsertionAleatoire(caseTmrInnaccessible.name);
@@ -606,7 +599,6 @@ export class RdDTMRDialog extends Dialog {
async _resultatMaitriseCaseHumide(rollData) { async _resultatMaitriseCaseHumide(rollData) {
await this.souffleSiEchecTotal(rollData); await this.souffleSiEchecTotal(rollData);
this.toclose = rollData.rolled.isEchec;
if (rollData.rolled.isSuccess && rollData.double) { if (rollData.rolled.isSuccess && rollData.double) {
rollData.previous = { rolled: rollData.rolled, ajustements: rollData.ajustements }; rollData.previous = { rolled: rollData.rolled, ajustements: rollData.ajustements };
rollData.double = undefined; rollData.double = undefined;
@@ -619,7 +611,7 @@ export class RdDTMRDialog extends Dialog {
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.html`, rollData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.html`, rollData)
}); });
if (rollData.rolled.isEchec) { if (rollData.rolled.isEchec) {
this.close(); await this.close();
} }
} }
@@ -729,8 +721,6 @@ export class RdDTMRDialog extends Dialog {
if (rollData.rolled.isETotal) { if (rollData.rolled.isETotal) {
rollData.souffle = await this.actor.ajouterSouffle({ chat: false }); rollData.souffle = await this.actor.ajouterSouffle({ chat: false });
} }
this.toclose = rollData.rolled.isEchec;
rollData.poesie = await Poetique.getExtrait(); rollData.poesie = await Poetique.getExtrait();
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
@@ -775,9 +765,8 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
async declencheSortEnReserve(coord) { async declencheSortEnReserve(coord) {
let sorts = this.getSortsReserve(coord);
let sortsEnCoord = TMRUtility.getSortsReserve(this.sortsReserves, coord); if (sorts.length > 0) {
if (sortsEnCoord.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;
@@ -785,8 +774,8 @@ export class RdDTMRDialog extends Dialog {
if (!EffetsDraconiques.isUrgenceDraconique(this.actor) && if (!EffetsDraconiques.isUrgenceDraconique(this.actor) &&
(EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord))) { (EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord))) {
let msg = "Vous êtes sur une case avec un Sort en Réserve. Grâce à votre Tête <strong>Reserve en Sécurité</strong> ou <strong>Réserve Exensible</strong>, vous pouvez contrôler le déclenchement. Cliquez si vous souhaitez le déclencher : <ul>"; 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>";
for (let sortReserve of sortsEnCoord) { for (let sort of sorts) {
msg += "<li><a class='chat-card-button' id='sort-reserve' data-actor-id='" + this.actor._id + "' data-tmr-coord='" + coord + "' data-sort-id='" + sortReserve.sort._id + "'>" + sortReserve.sort.name + "</a></li>"; 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>`;
} }
msg += "</ol>"; msg += "</ol>";
ChatMessage.create({ ChatMessage.create({
@@ -795,33 +784,35 @@ export class RdDTMRDialog extends Dialog {
}); });
return; return;
} }
await this.processSortReserve(sortsEnCoord[0]); await this.processSortReserve(sorts[0]);
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
lancerSortEnReserve(coord, sortId) { lancerSortEnReserve(coord, sortId) {
let sortEnCoord = TMRUtility.getSortsReserve(this.sortsReserves, coord); let sorts = this.getSortsReserve(coord);
let sortReserve = sortEnCoord.find(sortReserve => sortReserve.sort._id == sortId); let sort = sorts.find(it => it.id == sortId);
if (sortReserve) { if (sort) {
this.processSortReserve(sortReserve); this.processSortReserve(sort);
} else { } else {
ChatMessage.create({ ChatMessage.create({
content: "Une erreur est survenue : impossible de récupérer le sort en réserve demandé.", content:
whisper: ChatMessage.getWhisperRecipients(game.user.name) "Une erreur est survenue : impossible de récupérer le sort en réserve demandé.",
whisper: ChatMessage.getWhisperRecipients(game.user.name),
}); });
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async processSortReserve(sortReserve) { async processSortReserve(sortReserve) {
await this.actor.deleteSortReserve(sortReserve); await this.actor.deleteEmbeddedDocuments('Item', [sortReserve.id]);
//this.updateSortReserve(); console.log("declencheSortEnReserve", sortReserve);
console.log("declencheSortEnReserve", sortReserve) this._tellToUserAndGM(`Vous avez déclenché
this._tellToUserAndGM(`Vous avez déclenché le sort en réserve <strong> ${sortReserve.sort.name}</strong> ${sortReserve.system.echectotal ? "<strong>l'échec total!</strong>" : "le sort"}
avec ${sortReserve.sort.system.ptreve_reel} points de Rêve en réserve <strong>${sortReserve.name}</strong>
en ${sortReserve.coord} (${TMRUtility.getTMRLabel(sortReserve.coord)}) avec ${sortReserve.system.ptreve} points de Rêve
`); en ${sortReserve.system.coord} (${TMRUtility.getTMRLabel(sortReserve.system.coord)}).
L'heure ciblée est ${sortReserve.system.heurecible}`);
this.close(); this.close();
} }
@@ -873,7 +864,6 @@ export class RdDTMRDialog extends Dialog {
if (this.viewOnly) { if (this.viewOnly) {
return; return;
} }
let clickOddq = RdDTMRDialog._computeEventOddq(event.data.originalEvent); let clickOddq = RdDTMRDialog._computeEventOddq(event.data.originalEvent);
await this._onClickTMRPos(clickOddq); // Vérifier l'état des compteurs reve/fatigue/vie await this._onClickTMRPos(clickOddq); // Vérifier l'état des compteurs reve/fatigue/vie
} }
@@ -928,7 +918,7 @@ export class RdDTMRDialog extends Dialog {
const isInArea = this.rencontreState == 'aucune' const isInArea = this.rencontreState == 'aucune'
? (this.isTerreAttache(targetCoord) || this.isConnaissanceFleuve(currentCoord, targetCoord) || TMRUtility.distanceOddq(fromOddq, toOddq) <= 1) ? (this.isTerreAttache(targetCoord) || this.isConnaissanceFleuve(currentCoord, targetCoord) || TMRUtility.distanceOddq(fromOddq, toOddq) <= 1)
: this.currentRencontre?.locList.find(coord => coord == targetCoord) ?? false : this.currentRencontre?.locList?.find(coord => coord == targetCoord) ?? false
if (isInArea) { if (isInArea) {
switch (this.rencontreState) { switch (this.rencontreState) {
case 'aucune': return 'normal'; case 'aucune': return 'normal';
@@ -977,7 +967,7 @@ export class RdDTMRDialog extends Dialog {
this.actor.notifyRefreshTMR(); this.actor.notifyRefreshTMR();
if (deplacementType == 'normal') { // Pas de rencontres après un saut de type passeur/changeur/... if (deplacementType == 'normal') { // Pas de rencontres après un saut de type passeur/changeur/...
await this.manageRencontre(tmr, () => this.postRencontre(tmr)); await this.manageRencontre(tmr);
} }
else { else {
await this.postRencontre(tmr); await this.postRencontre(tmr);
@@ -996,13 +986,14 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
async postRencontre(tmr) { async postRencontre(tmr) {
if (!(this.viewOnly || this.currentRencontre)) { if (!(this.viewOnly || this.currentRencontre)) {
await this.manageCaseHumide(tmr); // TODO: vérifier que la méthode s'arrête en cas de non-maîtrise
await this.conquerirCiteFermee(tmr); if (!this.descenteTMR) await this.manageCaseHumide(tmr);
await this.purifierPeriple(tmr); if (!this.descenteTMR) await this.conquerirCiteFermee(tmr);
await this.conquerirTMR(tmr); if (!this.descenteTMR) await this.purifierPeriple(tmr);
await this.validerVisite(tmr); if (!this.descenteTMR) await this.conquerirTMR(tmr);
await this.declencheSortEnReserve(tmr.coord); if (!this.descenteTMR) await this.validerVisite(tmr);
await this.actor.checkSoufflePeage(tmr); if (!this.descenteTMR) await this.declencheSortEnReserve(tmr.coord);
if (!this.descenteTMR) await this.actor.checkSoufflePeage(tmr);
} }
} }
@@ -1021,7 +1012,7 @@ export class RdDTMRDialog extends Dialog {
let x = origEvent.clientX - canvasRect.left; let x = origEvent.clientX - canvasRect.left;
let y = origEvent.clientY - canvasRect.top; let y = origEvent.clientY - canvasRect.top;
let col = Math.floor(x / tmrConstants.cellw); // [From 0 -> 12] let col = Math.floor(x / tmrConstants.cellw); // [From 0 -> 12]
y -= (col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y; y -= col % 2 == 0 ? tmrConstants.col1_y : tmrConstants.col2_y;
let row = Math.floor(y / tmrConstants.cellh); // [From 0 -> 14] let row = Math.floor(y / tmrConstants.cellh); // [From 0 -> 14]
return { col: col, row: row }; return { col: col, row: row };
} }
@@ -1031,7 +1022,7 @@ export class RdDTMRDialog extends Dialog {
_getCaseRectangleCoord(coord) { _getCaseRectangleCoord(coord) {
return this.pixiTMR.getCaseRectangle(TMRUtility.coordTMRToOddq(coord)); return this.pixiTMR.getCaseRectangle(TMRUtility.coordTMRToOddq(coord));
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_removeTokens(filter) { _removeTokens(filter) {
const tokensToRemove = this.allTokens.filter(filter); const tokensToRemove = this.allTokens.filter(filter);
@@ -1039,7 +1030,7 @@ export class RdDTMRDialog extends Dialog {
this.pixiApp.stage.removeChild(token.sprite); this.pixiApp.stage.removeChild(token.sprite);
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_trackToken(token) { _trackToken(token) {
if (this.demiReve === token && this.isDemiReveCache()) { if (this.demiReve === token && this.isDemiReveCache()) {

View File

@@ -2,7 +2,7 @@
export class RdDTMRRencontreDialog extends Dialog { export class RdDTMRRencontreDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
constructor(html, tmrApp, rencontre, postRencontre) { constructor(tmrApp, rencontre, postRencontre) {
const dialogConf = { const dialogConf = {
title: "Rencontre en TMR!", title: "Rencontre en TMR!",
content: "Vous rencontrez un " + rencontre.name + " de force " + rencontre.force + "<br>", content: "Vous rencontrez un " + rencontre.name + " de force " + rencontre.force + "<br>",

View File

@@ -8,7 +8,7 @@ export class RdDTokenHud {
static init() { static init() {
// Integration du TokenHUD // Integration du TokenHUD
Hooks.on('renderTokenHUD', (app, html, data) => { RdDTokenHud.addTokenHudExtensions(app, html, data._id) }); Hooks.on('renderTokenHUD', (app, html, token) => { RdDTokenHud.addTokenHudExtensions(app, html, token._id) });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -63,7 +63,7 @@ export class RdDTokenHud {
const actionIndex = event.currentTarget.attributes['data-action-index']?.value; const actionIndex = event.currentTarget.attributes['data-action-index']?.value;
const action = actionsCombat[actionIndex]; const action = actionsCombat[actionIndex];
if (action.action == 'conjurer') { if (action.action == 'conjurer') {
actor.conjurerPossession(actor.getPossession(action.data.possessionid)); actor.conjurerPossession(actor.getPossession(action.system.possessionid));
} }
else { else {
actor.rollArme(action); actor.rollArme(action);
@@ -76,7 +76,7 @@ export class RdDTokenHud {
case 'inc': return RdDCombatManager.incDecInit(combatantId, 0.01); case 'inc': return RdDCombatManager.incDecInit(combatantId, 0.01);
case 'dec': return RdDCombatManager.incDecInit(combatantId, -0.01); case 'dec': return RdDCombatManager.incDecInit(combatantId, -0.01);
case 'autre': return RdDCombatManager.rollInitiativeAction(combatantId, case 'autre': return RdDCombatManager.rollInitiativeAction(combatantId,
{ name: "Autre action", action: 'autre', data: { initOnly: true, competence: "Autre action" } }); { name: "Autre action", action: 'autre', system: { initOnly: true, competence: "Autre action" } });
} }
} }

View File

@@ -104,7 +104,7 @@ export class RdDUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async init() { static async init() {
Hooks.on("renderChatMessage", async (app, html, msg) => RdDUtility.onRenderChatMessage(app, html, msg)); Hooks.on("renderChatMessage", async (app, html, msg) => RdDUtility.onRenderChatMessage(app, html, msg));
Hooks.on('renderChatLog', (log, html, data) => RdDUtility.chatListeners(html)); Hooks.on('renderChatLog', (log, html, chatLog) => RdDUtility.chatListeners(html));
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -121,11 +121,18 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-oeuvre-partial.html', 'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-oeuvre-partial.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-liste-blessures-partial.html', 'systems/foundryvtt-reve-de-dragon/templates/actor-liste-blessures-partial.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html', 'systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-queues.html',
// Conteneur/item in Actor sheet // Conteneur/item in Actor sheet
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-conteneur.html', 'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-item-queue.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-item.html',
"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html", "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html",
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-animaux.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-suivants.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-vehicules.html',
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html', 'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html',
//Items //Items
'systems/foundryvtt-reve-de-dragon/templates/header-item.html',
'systems/foundryvtt-reve-de-dragon/templates/item-competence-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-competence-sheet.html',
'systems/foundryvtt-reve-de-dragon/templates/item-competencecreature-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-competencecreature-sheet.html',
'systems/foundryvtt-reve-de-dragon/templates/item-arme-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-arme-sheet.html',
@@ -235,36 +242,38 @@ export class RdDUtility {
Handlebars.registerHelper('typeTmr-name', coord => TMRUtility.typeTmrName(coord)); Handlebars.registerHelper('typeTmr-name', coord => TMRUtility.typeTmrName(coord));
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1))); Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
Handlebars.registerHelper('sortCompetence', competences => competences.sort((a, b) => { Handlebars.registerHelper('filtreTriCompetences', competences => competences.filter(it => it.system.isVisible)
if (a.name.startsWith("Survie") && b.name.startsWith("Survie")) { .sort((a, b) => {
if (a.name.includes("Cité")) return -1; if (a.name.startsWith("Survie") && b.name.startsWith("Survie")) {
if (b.name.includes("Cité")) return 1; if (a.name.includes("Cité")) return -1;
if (a.name.includes("Extérieur")) return -1; if (b.name.includes("Cité")) return 1;
if (b.name.includes("Extérieur")) return 1; if (a.name.includes("Extérieur")) return -1;
if (b.name.includes("Extérieur")) return 1;
return a.name.localeCompare(b.name);
}
if (a.system.categorie.startsWith("melee") && b.system.categorie.startsWith("melee")) {
if (a.name.includes("Corps")) return -1;
if (b.name.includes("Corps")) return 1;
if (a.name.includes("Dague")) return -1;
if (b.name.includes("Dague")) return 1;
if (a.name.includes("Esquive")) return -1;
if (b.name.includes("Esquive")) return 1;
return a.name.localeCompare(b.name);
}
if (a.name.startsWith("Voie") && b.name.startsWith("Voie")) {
if (a.name.includes("Oniros")) return -1;
if (b.name.includes("Oniros")) return 1;
if (a.name.includes("Hypnos")) return -1;
if (b.name.includes("Hypnos")) return 1;
if (a.name.includes("Narcos")) return -1;
if (b.name.includes("Narcos")) return 1;
if (a.name.includes("Thanatos")) return -1;
if (b.name.includes("Thanatos")) return 1;
return a.name.localeCompare(b.name);
}
return a.name.localeCompare(b.name); return a.name.localeCompare(b.name);
} })
if (a.system.categorie.startsWith("melee") && b.system.categorie.startsWith("melee")) { );
if (a.name.includes("Corps")) return -1;
if (b.name.includes("Corps")) return 1;
if (a.name.includes("Dague")) return -1;
if (b.name.includes("Dague")) return 1;
if (a.name.includes("Esquive")) return -1;
if (b.name.includes("Esquive")) return 1;
return a.name.localeCompare(b.name);
}
if (a.name.startsWith("Voie") && b.name.startsWith("Voie")) {
if (a.name.includes("Oniros")) return -1;
if (b.name.includes("Oniros")) return 1;
if (a.name.includes("Hypnos")) return -1;
if (b.name.includes("Hypnos")) return 1;
if (a.name.includes("Narcos")) return -1;
if (b.name.includes("Narcos")) return 1;
if (a.name.includes("Thanatos")) return -1;
if (b.name.includes("Thanatos")) return 1;
return a.name.localeCompare(b.name);
}
return a.name.localeCompare(b.name);
}));
return loadTemplates(templatePaths); return loadTemplates(templatePaths);
} }
@@ -384,6 +393,7 @@ export class RdDUtility {
formData.possessions = this.arrayOrEmpty(formData.itemsByType['possession']); formData.possessions = this.arrayOrEmpty(formData.itemsByType['possession']);
formData.maladiesPoisons = formData.maladies.concat(formData.poisons); formData.maladiesPoisons = formData.maladies.concat(formData.poisons);
formData.competences = (formData.itemsByType.competence ?? []).concat(formData.itemsByType.competencecreature ?? []); formData.competences = (formData.itemsByType.competence ?? []).concat(formData.itemsByType.competencecreature ?? []);
formData.sortsReserve = this.arrayOrEmpty(formData.itemsByType['sortreserve']);
} }
static filterEquipementParType(formData) { static filterEquipementParType(formData) {
@@ -439,16 +449,16 @@ export class RdDUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static calculEncContenu(conteneur, objets) { static calculEncContenu(conteneur, objets) {
const contenuDatas = (conteneur.system.contenu ?? []).filter(id => id != undefined) const contenus = (conteneur.system.contenu ?? []).filter(id => id != undefined)
.map(id => objets.find(it => (id == it._id))) .map(id => 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 itemData of contenuDatas) { for (let contenu of contenus) {
if (itemData.type == 'conteneur') { if (contenu.type == 'conteneur') {
enc += RdDUtility.calculEncContenu(itemData, objets); enc += RdDUtility.calculEncContenu(contenu, objets);
} }
else { else {
enc += Number(itemData.system.encombrement ?? 0) * Number(itemData.system.quantite ?? 1) enc += Number(contenu.system.encombrement ?? 0) * Number(contenu.system.quantite ?? 1)
} }
} }
return enc return enc
@@ -464,34 +474,32 @@ export class RdDUtility {
/** Construit la structure récursive des conteneurs, avec imbrication potentielle /** Construit la structure récursive des conteneurs, avec imbrication potentielle
* *
*/ */
static buildConteneur(objet, niveau) { static buildConteneur(objet, profondeur) {
if (!niveau) niveau = 1; if (!profondeur) profondeur = 1;
objet.niveau = niveau; objet.niveau = profondeur;
//console.log("OBJ:", objet); const isConteneur = objet.type == 'conteneur';
let str = Handlebars.partials['systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-conteneur.html']({ item: objet }); const isOuvert = isConteneur && this.getAfficheContenu(objet._id);
if (objet.type == 'conteneur') { const isVide = isConteneur && objet.system.contenu.length == 0;
const afficherContenu = this.getAfficheContenu(objet._id); const conteneur = Handlebars.partials['systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-item.html']({
str = str + RdDUtility.buildContenu(objet, niveau, afficherContenu); item: objet,
} vide: isVide,
return str; ouvert: isOuvert
});
const contenu = isConteneur ? RdDUtility.buildContenu(objet, profondeur, isOuvert) : '';
return conteneur + contenu;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static buildContenu(objet, niveau, afficherContenu) { static buildContenu(objet, profondeur, afficherContenu) {
if (!niveau) niveau = 1; if (!profondeur) profondeur = 1;
objet.niveau = niveau; objet.niveau = profondeur;
let strContenu = ""; const display = afficherContenu ? 'item-display-show' : 'item-display-hide';
//console.log("ITEM DISPLAYED", objet ); //console.log("ITEM DISPLAYED", objet );
if (afficherContenu) { let strContenu = `<ul class='item-list alterne-list ${display} list-item-margin${profondeur}'>`;
strContenu = "<ul class='item-list alterne-list item-display-show list-item-margin" + niveau + "'>";
} else {
strContenu = "<ul class='item-list alterne-list item-display-hide list-item-margin" + niveau + "'>";
}
for (let subItem of objet.subItems) { for (let subItem of objet.subItems) {
strContenu = strContenu + this.buildConteneur(subItem, niveau + 1); strContenu += this.buildConteneur(subItem, profondeur + 1);
} }
strContenu = strContenu + "</ul>"; return strContenu + "</ul>";
return strContenu;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -649,9 +657,9 @@ export class RdDUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async responseNombreAstral(data) { static async responseNombreAstral(callData) {
let actor = game.actors.get(data.id); let actor = game.actors.get(callData.id);
actor.ajouteNombreAstral(data); actor.ajouteNombreAstral(callData);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -686,12 +694,13 @@ export class RdDUtility {
actor.tmrApp.positionnerDemiReve(coord); actor.tmrApp.positionnerDemiReve(coord);
}); });
// Gestion spécifique des sorts en réserve multiples (ie têtes) // Gestion spécifique des sorts en réserve multiples (ie têtes)
html.on("click", '#sort-reserve', event => { html.on("click", '.declencher-sort-reserve', event => {
let coord = event.currentTarget.attributes['data-tmr-coord'].value; let coord = event.currentTarget.attributes['data-tmr-coord'].value;
let sortId = event.currentTarget.attributes['data-sort-id'].value; let sortId = event.currentTarget.attributes['data-sort-id'].value;
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);
actor.tmrApp.lancerSortEnReserve(coord, sortId); actor.tmrApp.lancerSortEnReserve(coord, sortId);
// TODO: supprimer le message?
}); });
// gestion bouton tchat Possession // gestion bouton tchat Possession
@@ -749,7 +758,7 @@ export class RdDUtility {
static getSelectedActor(msgPlayer = undefined) { static getSelectedActor(msgPlayer = undefined) {
if (canvas.tokens.controlled.length == 1) { if (canvas.tokens.controlled.length == 1) {
let token = canvas.tokens.controlled[0]; let token = canvas.tokens.controlled[0];
if (token.actor && token.data.actorLink) { if (token.actor) {
return token.actor; return token.actor;
} }
if (msgPlayer != undefined) { if (msgPlayer != undefined) {
@@ -772,7 +781,7 @@ export class RdDUtility {
static createMonnaie(name, valeur_deniers, img = "", enc = 0.01) { static createMonnaie(name, valeur_deniers, img = "", enc = 0.01) {
let piece = { let piece = {
name: name, type: 'monnaie', img: img, _id: randomID(16), name: name, type: 'monnaie', img: img, _id: randomID(16),
data: { dasystemta: {
quantite: 0, quantite: 0,
valeur_deniers: valeur_deniers, valeur_deniers: valeur_deniers,
encombrement: enc, encombrement: enc,
@@ -824,21 +833,17 @@ export class RdDUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static confirmerSuppressionSubacteur(actorSheet, li) { static confirmerSuppression(sheet, htmlToDelete, options) {
let actorId = li.data("actor-id"); const d = new Dialog({
let actor = game.actors.get(actorId); title: options.title ?? 'Confirmer la suppression',
let msgTxt = "<p>Etes vous certain de vouloir supprimer le lien vers ce véhicule/monture/suivant : " + actor.data.name + " ?</p>"; content: `<p>Etes vous certain de vouloir supprimer ${options.supprimer ?? 'cet objet'} ?</p>`,
let d = new Dialog({
title: "Confirmer la suppression du lien",
content: msgTxt,
buttons: { buttons: {
delete: { delete: {
icon: '<i class="fas fa-check"></i>', icon: '<i class="fas fa-check"></i>',
label: "Supprimer le lien", label: options.deleteLabel ?? 'Supprimer',
callback: () => { callback: () => {
console.log("Delete : ", actorId); options.onDelete();
actorSheet.actor.removeSubacteur(actorId); RdDUtility.slideOnDelete(sheet, htmlToDelete);
li.slideUp(200, () => actorSheet.render(false));
} }
}, },
cancel: { cancel: {
@@ -852,11 +857,21 @@ export class RdDUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async confirmerSuppression(actorSheet, li) { static confirmerSuppressionSubacteur(sheet, subActor, htmlToDelete) {
let itemId = li.data("item-id"); RdDUtility.confirmerSuppression(sheet, htmlToDelete,{
let objet = actorSheet.actor.getObjet(itemId); supprimer: "le lien vers le véhicule/monture/suivant : " + subActor.name,
deleteLabel: "Supprimer le lien",
onDelete: () => {
console.log("Delete : ", subActor.id);
sheet.actor.removeSubacteur(subActor.id);
}
})
}
if (objet.type == 'monnaie' && Monnaie.isSystemMonnaie(objet)) { /* -------------------------------------------- */
static async confirmerSuppressionItem(sheet, item, htmlToDelete) {
const itemId = item.id;
if (Monnaie.isSystemMonnaie(item, sheet.actor.items)) {
ui.notifications.warn("Suppression des monnaies de base impossible"); ui.notifications.warn("Suppression des monnaies de base impossible");
return; return;
} }
@@ -868,8 +883,8 @@ export class RdDUtility {
label: "Supprimer l'objet", label: "Supprimer l'objet",
callback: () => { callback: () => {
console.log("Delete : ", itemId); console.log("Delete : ", itemId);
actorSheet.actor.deleteEmbeddedDocuments('Item', [itemId]); sheet.actor.deleteEmbeddedDocuments('Item', [itemId], { renderSheet: false });
li.slideUp(200, () => actorSheet.render(false)); RdDUtility.slideOnDelete(sheet, htmlToDelete);
} }
}, },
cancel: { cancel: {
@@ -877,16 +892,15 @@ export class RdDUtility {
label: "Annuler" label: "Annuler"
} }
} }
const docData = objet if (item.type == 'conteneur' && item.system.contenu.length > 0) {
if (docData.type == 'conteneur' && docData.data.contenu.length > 0) {
msgTxt += "<br>Ce conteneur n'est pas vide. Choisissez l'option de suppression"; msgTxt += "<br>Ce conteneur n'est pas vide. Choisissez l'option de suppression";
buttons['deleteall'] = { buttons['deleteall'] = {
icon: '<i class="fas fa-check"></i>', icon: '<i class="fas fa-check"></i>',
label: "Supprimer le conteneur et tout son contenu", label: "Supprimer le conteneur et tout son contenu",
callback: () => { callback: () => {
console.log("Delete : ", itemId); console.log("Delete : ", itemId);
actorSheet.actor.deleteAllConteneur(itemId); sheet.actor.deleteAllConteneur(itemId, { renderSheet: false });
li.slideUp(200, () => actorSheet.render(false)); RdDUtility.slideOnDelete(sheet, htmlToDelete);
} }
} }
} }
@@ -900,6 +914,10 @@ export class RdDUtility {
d.render(true); d.render(true);
} }
static slideOnDelete(sheet, htmlToDelete) {
return htmlToDelete.slideUp(200, () => sheet.render(false));
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static afficherHeuresChanceMalchance(heureNaissance) { static afficherHeuresChanceMalchance(heureNaissance) {
if (game.user.isGM) { if (game.user.isGM) {

View File

@@ -33,7 +33,7 @@ export const referenceAjustements = {
getLabel: (rollData, actor) => rollData.selectedSort?.name ?? rollData.attackerRoll ? '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?.data.default_diffLibre ?? 0 : rollData.diffLibre ?? rollData.competence?.system.default_diffLibre ?? 0
}, },
diffConditions: { diffConditions: {
isUsed: (rollData, actor) => rollData.diffConditions != undefined, isUsed: (rollData, actor) => rollData.diffConditions != undefined,

View File

@@ -1,26 +1,41 @@
import { SYSTEM_RDD } from "./constants.js"; import { SYSTEM_RDD } from "./constants.js";
const rddStatusEffects = [ export const STATUSES = {
{ rdd: true, id: 'stun', label: 'EFFECT.StatusStunned', icon: 'icons/svg/stoned.svg', "duration.rounds": 1 }, StatusStunned : 'stun',
{ rdd: true, id: 'bleeding', label: 'EFFECT.StatusBleeding', icon: 'icons/svg/blood.svg' }, StatusBleeding: 'bleeding',
{ rdd: true, id: 'prone', label: 'EFFECT.StatusProne', icon: 'icons/svg/falling.svg' }, StatusProne: 'prone',
{ rdd: true, id: 'grappling', tint: '#33cc33', label: 'EFFECT.StatusGrappling', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' }, StatusGrappling: 'grappling',
{ rdd: true, id: 'grappled', tint: '#ff9900', label: 'EFFECT.StatusGrappled', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' }, StatusGrappled: 'grappled',
{ rdd: true, id: 'restrain', label: 'EFFECT.StatusRestrained', icon: 'icons/svg/net.svg' }, StatusRestrained: 'restrain',
{ rdd: true, id: 'unconscious', label: 'EFFECT.StatusUnconscious', icon: 'icons/svg/unconscious.svg' }, StatusUnconscious: 'unconscious',
{ rdd: true, id: 'blind', label: 'EFFECT.StatusBlind', icon: 'icons/svg/blind.svg' }, StatusBlind: 'blind',
{ rdd: true, id: 'comma', label: 'EFFECT.StatusComma', icon: 'icons/svg/skull.svg' }, StatusComma: 'comma',
{ rdd: true, id: 'dead', label: 'EFFECT.StatusDead', icon: 'icons/svg/skull.svg' }, StatusDead: 'dead',
{ rdd: true, id: 'demi-reve', label: 'EFFECT.StatusDemiReve', icon: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg' } StatusDemiReve: 'demi-reve',
]; }
const demiReveStatusEffect = rddStatusEffects.find(it => it.label == 'EFFECT.StatusDemiReve');
const statusDemiSurprise = new Set(['EFFECT.StatusStunned', 'EFFECT.StatusProne', 'EFFECT.StatusRestrain']); const rddStatusEffects = [
const statusSurpriseTotale = new Set(['EFFECT.StatusUnconscious', 'EFFECT.StatusBlind', 'EFFECT.StatusComma']); { rdd: true, id: STATUSES.StatusStunned, label: 'EFFECT.StatusStunned', icon: 'icons/svg/stoned.svg', "duration.rounds": 1 },
{ rdd: true, id: STATUSES.StatusBleeding, label: 'EFFECT.StatusBleeding', icon: 'icons/svg/blood.svg' },
{ rdd: true, id: STATUSES.StatusProne, label: 'EFFECT.StatusProne', icon: 'icons/svg/falling.svg' },
{ rdd: true, id: STATUSES.StatusGrappling, tint: '#33cc33', label: 'EFFECT.StatusGrappling', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' },
{ rdd: true, id: STATUSES.StatusGrappled, tint: '#ff9900', label: 'EFFECT.StatusGrappled', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' },
{ rdd: true, id: STATUSES.StatusRestrained, label: 'EFFECT.StatusRestrained', icon: 'icons/svg/net.svg' },
{ rdd: true, id: STATUSES.StatusUnconscious, label: 'EFFECT.StatusUnconscious', icon: 'icons/svg/unconscious.svg' },
{ rdd: true, id: STATUSES.StatusBlind, label: 'EFFECT.StatusBlind', icon: 'icons/svg/blind.svg' },
{ rdd: true, id: STATUSES.StatusComma, label: 'EFFECT.StatusComma', icon: 'icons/svg/skull.svg' },
{ rdd: true, id: STATUSES.StatusDead, label: 'EFFECT.StatusDead', icon: 'icons/svg/skull.svg' },
{ rdd: true, id: STATUSES.StatusDemiReve, label: 'EFFECT.StatusDemiReve', icon: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg' }
];
const demiReveStatusEffect = rddStatusEffects.find(it => it.id == STATUSES.StatusDemiReve);
const statusDemiSurprise = [STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained];
const statusSurpriseTotale = [STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma];
export class StatusEffects { export class StatusEffects {
static onReady() { static onReady() {
const rddStatusIds = rddStatusEffects.map(it => it.id); const rddStatusIds = rddStatusEffects.map(it => it.id);
rddStatusEffects.forEach(it => it.flags = { core: { statusId: it.id } });
const defaultStatusEffectIds = CONFIG.statusEffects.map(it => it.id); const defaultStatusEffectIds = CONFIG.statusEffects.map(it => it.id);
game.settings.register(SYSTEM_RDD, "use-status-effects", { game.settings.register(SYSTEM_RDD, "use-status-effects", {
name: "use-status-effects", name: "use-status-effects",
@@ -47,40 +62,36 @@ export class StatusEffects {
static valeurSurprise(effect, isCombat) { static valeurSurprise(effect, isCombat) {
// const id = StatusEffects.statusId(effect); // const id = StatusEffects.statusId(effect);
if (statusSurpriseTotale.has(effect.label)) { if (statusSurpriseTotale.includes(effect.flags?.core?.statusId)) {
return 2; return 2;
} }
return statusDemiSurprise.has(effect.label) || (isCombat && effect.label == demiReveStatusEffect.label) ? 1 : 0; return statusDemiSurprise.includes(effect.flags?.core?.statusId) || (isCombat && effect.flags?.core?.statusId == STATUSES.StatusDemiReve) ? 1 : 0;
}
static setMandatoryRdd() {
CONFIG.statusEffects.filter(it => statusDemiSurprise.has(it.id) || statusSurpriseTotale.has(it.id))
.forEach(it => it.rdd = true);
} }
static _getUseStatusEffects() { static _getUseStatusEffects() {
const setting = game.settings.get(SYSTEM_RDD, "use-status-effects"); const setting = game.settings.get(SYSTEM_RDD, "use-status-effects");
return setting ? new Set(setting.split(',')) : new Set(); return setting ? setting.split(',') : [];
} }
static _setUseStatusEffects(useStatusEffects) { static _setUseStatusEffects(statusIds) {
if (game.user.isGM) { if (game.user.isGM) {
game.settings.set(SYSTEM_RDD, "use-status-effects", StatusEffects._toSetting(useStatusEffects)); game.settings.set(SYSTEM_RDD, "use-status-effects", StatusEffects._toSetting(statusIds));
} }
for (let effect of CONFIG.RDD.allEffects) { for (let effect of CONFIG.RDD.allEffects) {
effect.active = effect.rdd || useStatusEffects.has(effect.id); effect.active = effect.rdd || statusIds.includes(effect.flags?.core?.statusId);
} }
CONFIG.statusEffects = CONFIG.RDD.allEffects.filter(it => it.active); CONFIG.statusEffects = CONFIG.RDD.allEffects.filter(it => it.active);
} }
static _toSetting(useStatusEffects) { static _toSetting(statusIds) {
return Array.from(useStatusEffects).join(); return statusIds.join();
} }
static status(label) { static status(statusId) {
return rddStatusEffects.find(it => it.label == label) ?? { label: label }; return rddStatusEffects.find(it => it.flags?.core?.statusId == statusId);
} }
static demiReve() { static demiReve() {
return demiReveStatusEffect; return demiReveStatusEffect;
} }
@@ -106,8 +117,10 @@ class StatusEffectsSettings extends FormApplication {
} }
getData() { getData() {
const used = StatusEffects._getUseStatusEffects();
let formData = super.getData(); let formData = super.getData();
formData.effects = CONFIG.RDD.allEffects; formData.effects = duplicate(CONFIG.RDD.allEffects);
formData.effects.forEach(it => it.active = used.includes(it.id))
return formData; return formData;
} }
@@ -118,10 +131,10 @@ class StatusEffectsSettings extends FormApplication {
let selected = StatusEffects._getUseStatusEffects(); let selected = StatusEffects._getUseStatusEffects();
let isChecked = event.currentTarget.checked; let isChecked = event.currentTarget.checked;
if (isChecked) { if (isChecked) {
selected.add(id); selected.push(id);
} }
else { else {
selected.delete(id); selected = selected.filter(it => it != id)
} }
StatusEffects._setUseStatusEffects(selected); StatusEffects._setUseStatusEffects(selected);
} }

View File

@@ -433,9 +433,9 @@ export class TMRRencontres {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async msgEchecPasseurFou(tmrData) { static async msgEchecPasseurFou(tmrData) {
tmrData.sortReserve = tmrData.actor.system.reve.reserve.list[0]; tmrData.sortReserve = RdDDice.rollOneOf(tmrData.actor.itemTypes['sortreserve']);
if (tmrData.sortReserve) { if (tmrData.sortReserve) {
// Passeur fou positionne sur la case d'un ort en réserve // TODO : Choisir le sort le plus loin ou au hasard // Passeur fou positionne sur la case d'un sort en réserve
tmrData.newTMR = TMRUtility.getTMR(tmrData.sortReserve.coord); tmrData.newTMR = TMRUtility.getTMR(tmrData.sortReserve.coord);
} else { } else {
// Déplacement aléatoire de la force du Passeur Fou // Déplacement aléatoire de la force du Passeur Fou
@@ -468,10 +468,10 @@ export class TMRRencontres {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async onPostEchecTourbillonRouge(tmrDialog, data) { static async onPostEchecTourbillonRouge(tmrDialog, rencontre) {
await data.actor.reveActuelIncDec(-2); // -2 pts de Reve a chaque itération await rencontre.actor.reveActuelIncDec(-2); // -2 pts de Reve a chaque itération
TMRRencontres._toubillonner(tmrDialog, data.actor, 4); TMRRencontres._toubillonner(tmrDialog, rencontre.actor, 4);
await data.actor.santeIncDec("vie", -1); // Et -1 PV await rencontre.actor.santeIncDec("vie", -1); // Et -1 PV
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -486,7 +486,7 @@ export class TMRRencontres {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async onPostSuccessReveDeDragon(tmrDialog, tmrData) { static async onPostSuccessReveDeDragon(tmrDialog, tmrData) {
if (tmrData.rolled.isPart) { if (tmrData.rolled.isPart) {
await tmrData.actor.appliquerAjoutExperience(tmrData, true); await tmrData.actor.appliquerAjoutExperience(tmrData);
} }
await tmrData.actor.resultCombatReveDeDragon(tmrData); await tmrData.actor.resultCombatReveDeDragon(tmrData);
} }

View File

@@ -291,12 +291,18 @@ export class TMRUtility {
static typeTmrName(type) { static typeTmrName(type) {
return Misc.upperFirst(TMRType[Grammar.toLowerCaseNoAccent(type)].name); return Misc.upperFirst(TMRType[Grammar.toLowerCaseNoAccent(type)].name);
} }
static listSelectedTMR(typesTMR) {
static buildSelectionTypesTMR(typesTMR) {
typesTMR= typesTMR?? [];
return Object.values(TMRType).map(value => Misc.upperFirst(value.name)) return Object.values(TMRType).map(value => Misc.upperFirst(value.name))
.sort() .sort()
.map(name => { return { name: name, selected: typesTMR.includes(name) } }); .map(name => { return { name: name, selected: typesTMR.includes(name) } });
} }
static buildListTypesTMRSelection(selectionTMRs) {
return selectionTMRs.filter(it => it.selected).map(it => it.name).join(" ");
}
static isCaseHumide(tmr) { static isCaseHumide(tmr) {
return tmr.type == 'fleuve' || tmr.type == 'lac' || tmr.type == 'marais'; return tmr.type == 'fleuve' || tmr.type == 'lac' || tmr.type == 'marais';
} }
@@ -379,18 +385,6 @@ export class TMRUtility {
return await RdDDice.rollOneOf(TMRUtility.filterTMR(filter)) return await RdDDice.rollOneOf(TMRUtility.filterTMR(filter))
} }
/* -------------------------------------------- */
static getSortsReserve(reserveList, coord) {
// TODO : Gérer les têtes spéciales réserve!
let tmrDescr = this.getTMR(coord);
//console.log("Sort réserve : ", tmrDescr);
if (tmrDescr.type == 'fleuve') { // Gestion de la reserve en Fleuve
return reserveList.filter(it => TMRUtility.getTMR(it.coord).type == 'fleuve');
}
// Reserve sur un case "normale"
return reserveList.filter(it => it.coord == coord);
}
/* -------------------------------------------- */ /* -------------------------------------------- */
/** Returns a list of case inside a given distance /** Returns a list of case inside a given distance
* *

View File

@@ -1,5 +1,4 @@
import { Grammar } from "../grammar.js"; import { Grammar } from "../grammar.js";
import { Misc } from "../misc.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";
import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js";

View File

@@ -9,11 +9,11 @@ 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(itemData) { return itemData.type == 'casetmr'; } static isCaseTMR(item) { return item.type == 'casetmr'; }
static isQueueDragon(itemData) { return itemData.type == 'queue' || itemData.type == 'ombre'; } static isQueueDragon(item) { return item.type == 'queue' || item.type == 'ombre'; }
static isSouffleDragon(itemData) { return itemData.type == 'souffle'; } static isSouffleDragon(item) { return item.type == 'souffle'; }
static isTeteDragon(itemData) { return itemData.type == 'tete'; } static isTeteDragon(item) { return item.type == 'tete'; }
static isQueueSouffle(itemData) { return Draconique.isQueueDragon(itemData) || Draconique.isSouffleDragon(itemData); } 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); }
@@ -38,8 +38,7 @@ export class Draconique {
* @returns true si l'item correspond * @returns true si l'item correspond
*/ */
match(item) { match(item) {
const itemData = item; return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item) || Draconique.isTeteDragon(item);
return Draconique.isQueueDragon(itemData) || Draconique.isSouffleDragon(itemData) || Draconique.isTeteDragon(itemData);
} }
/** /**

View File

@@ -112,7 +112,7 @@ export class EffetsDraconiques {
} }
static filterItems(actor, filter, name) { static filterItems(actor, filter, name) {
return actor.filter(filter) return actor.filterItems(filter)
.filter(it => Grammar.includesLowerCaseNoAccent(it.name, name)); .filter(it => Grammar.includesLowerCaseNoAccent(it.name, name));
} }

View File

@@ -25,7 +25,7 @@ export class PixiTMR {
for (const [name, img] of Object.entries(PixiTMR.textures)) { for (const [name, img] of Object.entries(PixiTMR.textures)) {
loader = loader.add(name, img); loader = loader.add(name, img);
} }
loader.onLoad.add((error, reason) => { console.log("ERROR", error, reason) }); loader.onError.add((error, reason) => { console.log("ERROR", error, reason) });
loader.load( (loader, resources) => { loader.load( (loader, resources) => {
onLoad(loader, resources); onLoad(loader, resources);
for (let onAnimate of this.callbacksOnAnimate) { for (let onAnimate of this.callbacksOnAnimate) {

View File

@@ -12,8 +12,8 @@ export class SortReserve extends Draconique {
manualMessage() { return false } manualMessage() { return false }
async onActorCreateOwned(actor, item) { } async onActorCreateOwned(actor, item) { }
code() { return 'sort' } code() { return 'sortreserve' }
tooltip(sort) { return `${sort.name}, r${sort.data.ptreve_reel}` } tooltip(sort) { return `${sort.name}, r${sort.system.ptreve}` }
img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/scroll.webp' } img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/scroll.webp' }
createSprite(pixiTMR) { createSprite(pixiTMR) {

View File

@@ -37,7 +37,7 @@ export class UrgenceDraconique extends Draconique {
} }
async onActorDeleteCaseTmr(actor, casetmr) { async onActorDeleteCaseTmr(actor, casetmr) {
await actor.deleteEmbeddedDocuments('Item', [casetmr.data.sourceid]); await actor.deleteEmbeddedDocuments('Item', [casetmr.system.sourceid]);
} }
code() { return 'urgence' } code() { return 'urgence' }

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,27 +1,29 @@
{"_id":"0zRL8bOpCXNQnIR4","name":"Ruade","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":4,"description":null,"categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pietinement.webp","effects":[]} {"_id":"0zRL8bOpCXNQnIR4","name":"Ruade","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.0zRL8bOpCXNQnIR4"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pietinement.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":4,"description":null,"descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702692,"modifiedTime":1663625011172,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"4GmpkphbsmQjvVVK","name":"Escalade","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_escalade.webp","effects":[]} {"_id":"4GmpkphbsmQjvVVK","name":"Escalade","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.4GmpkphbsmQjvVVK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_escalade.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702692,"modifiedTime":1663625011172,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"6DK46pyO0hzEuuUg","name":"Morsure","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":1,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.webp","effects":[]} {"_id":"6DK46pyO0hzEuuUg","name":"Morsure","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.6DK46pyO0hzEuuUg"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":1,"description":"","descriptionmj":"","categorie":"generale","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702692,"modifiedTime":1663625011172,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"BjqRrGtHtTzuNpZB","name":"Griffes et Crocs","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":1,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[]} {"name":"Possession","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-entites.c0I93Q53i4ZmxpyT"}},"img":"systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp","effects":[],"system":{"categorie_parade":"","niveau":2,"default_diffLibre":0,"carac_value":14,"iscombat":true,"isparade":false,"ispossession":true,"dommages":0,"description":"<p>L'entit&eacute; tente de prendre possession du corps de sa victime.</p>","descriptionmj":"","categorie":"melee"},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624948267,"modifiedTime":1663625011162,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"9u16zxXRurCtxuOX","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
{"_id":"CYpxxf1uTa78NWR9","name":"Esquive","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"dommages":0,"iscombat":false,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.webp","effects":[]} {"_id":"BjqRrGtHtTzuNpZB","name":"Griffes et Crocs","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.BjqRrGtHtTzuNpZB"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":1,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702692,"modifiedTime":1663625011172,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"JTuBQCPdumw3DfxH","name":"Crête","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"dommages":3,"iscombat":true,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-crete.webp","effects":[]} {"_id":"CYpxxf1uTa78NWR9","name":"Esquive","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.CYpxxf1uTa78NWR9"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_esquive.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702692,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"Kt7WlB5Ui97X211z","name":"Vol","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"dommages":0,"iscombat":false,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-vol.webp","effects":[]} {"_id":"JTuBQCPdumw3DfxH","name":"Crête","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.JTuBQCPdumw3DfxH"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-crete.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":3,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"LWQHz5ymNBzh6ZEr","name":"Cornes","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":2,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-corne.webp","effects":[]} {"_id":"Kt7WlB5Ui97X211z","name":"Vol","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.Kt7WlB5Ui97X211z"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-vol.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"NctG7suzvGE7ZZzj","name":"Bras-bouches","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":2,"description":"","categorie_parade":"epees-lourdes","isparade":true,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-brasbouche.webp","effects":[]} {"_id":"LWQHz5ymNBzh6ZEr","name":"Cornes","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.LWQHz5ymNBzh6ZEr"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-corne.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"OzHBowOMADRwcVXR","name":"Pierre Tenue","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":2,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pierretenue.webp","effects":[]} {"_id":"NctG7suzvGE7ZZzj","name":"Bras-bouches","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.NctG7suzvGE7ZZzj"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-brasbouche.webp","effects":[],"system":{"categorie_parade":"epees-lourdes","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":true,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"PCwbR6lghjydTj93","name":"Grande morsure","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"categorie_parade":"","niveau":0,"carac_value":0,"iscombat":true,"isparade":false,"dommages":2,"description":"","default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.webp","effects":[]} {"_id":"OzHBowOMADRwcVXR","name":"Pierre Tenue","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.OzHBowOMADRwcVXR"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pierretenue.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":false},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"PrVuVpwuYaZtwRUi","name":"Piétinement","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":4,"description":null,"categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pietinement.webp","effects":[]} {"_id":"PCwbR6lghjydTj93","name":"Grande morsure","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.PCwbR6lghjydTj93"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-morsure.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"RAnasKnoA3OQgwfv","name":"Pinces","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":3,"description":"","categorie_parade":"epees-lourdes","isparade":true,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pinces.webp","effects":[]} {"_id":"PrVuVpwuYaZtwRUi","name":"Piétinement","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.PrVuVpwuYaZtwRUi"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pietinement.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":4,"description":null,"descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702693,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"XgfRxSj8Ty1d3JFM","name":"Mandibules","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":2,"description":"","carac-value":null,"categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-mandibules.webp","effects":[]} {"_id":"RAnasKnoA3OQgwfv","name":"Pinces","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.RAnasKnoA3OQgwfv"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pinces.webp","effects":[],"system":{"categorie_parade":"epees-lourdes","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":true,"ispossession":false,"dommages":3,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"Zpl2Bi451vB3r91W","name":"Coup de pied","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":3,"description":null,"categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-coup_de_pied.webp","effects":[]} {"_id":"XgfRxSj8Ty1d3JFM","name":"Mandibules","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.XgfRxSj8Ty1d3JFM"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-mandibules.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","carac-value":null,"categorie":"generale","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"efl1HdDSKpBfImQ1","name":"Pierre Lancée","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":1,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pierrelancee.webp","effects":[]} {"_id":"Zpl2Bi451vB3r91W","name":"Coup de pied","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.Zpl2Bi451vB3r91W"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-coup_de_pied.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":3,"description":null,"descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"h9ASt4vrvEgxfj7j","name":"Tronçonneuse","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":10,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-tronconneuse.webp","effects":[]} {"name":"Possession","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-entites.c0I93Q53i4ZmxpyT"}},"img":"systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp","effects":[],"system":{"categorie_parade":"","niveau":2,"default_diffLibre":0,"carac_value":14,"iscombat":true,"isparade":false,"ispossession":true,"dommages":0,"description":"<p>L'entit&eacute; tente de prendre possession du corps de sa victime.</p>","descriptionmj":"","categorie":"draconic"},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624976822,"modifiedTime":1663625011162,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"duVgxI3Cdko0KzAj","folder":null,"sort":0,"ownership":{"default":0,"Hp9ImM4o9YRTSdfu":3}}
{"_id":"jhua9kkCs55OV7Yl","name":"Grandes griffes","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"categorie_parade":"sans-armes","niveau":0,"carac_value":0,"iscombat":true,"isparade":true,"dommages":2,"description":"","default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[]} {"_id":"efl1HdDSKpBfImQ1","name":"Pierre Lancée","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.efl1HdDSKpBfImQ1"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-pierrelancee.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":1,"description":"","descriptionmj":"","categorie":"lancer","isnaturelle":false},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"lzEdMrKXbOYrWG5S","name":"Vigilance","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[]} {"_id":"h9ASt4vrvEgxfj7j","name":"Tronçonneuse","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.h9ASt4vrvEgxfj7j"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-tronconneuse.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":10,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"ndNshntOYb1JFNqi","name":"Serres","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":2,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-serres.webp","effects":[]} {"_id":"jhua9kkCs55OV7Yl","name":"Grandes griffes","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.jhua9kkCs55OV7Yl"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[],"system":{"categorie_parade":"sans-armes","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":true,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"os88Rsp7mBkahqmh","name":"Bec","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-beak.webp","effects":[]} {"_id":"lzEdMrKXbOYrWG5S","name":"Vigilance","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.lzEdMrKXbOYrWG5S"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"qilRzXpVaGceNmQp","name":"Dague","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":true,"dommages":1,"description":"","categorie_parade":"dagues","isparade":true,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_dague.webp","effects":[]} {"_id":"ndNshntOYb1JFNqi","name":"Serres","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.ndNshntOYb1JFNqi"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-serres.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":2,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702694,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"qrd9AoZzFgyzFBxz","name":"Griffes","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"categorie_parade":"sans-armes","niveau":0,"carac_value":0,"iscombat":true,"isparade":true,"dommages":1,"description":"","default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[]} {"_id":"os88Rsp7mBkahqmh","name":"Bec","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.os88Rsp7mBkahqmh"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-beak.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"sUdXhpuVVOAlcVpo","name":"Pickpocket","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_pickpocket.webp","effects":[]} {"_id":"qilRzXpVaGceNmQp","name":"Dague","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.qilRzXpVaGceNmQp"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_dague.webp","effects":[],"system":{"categorie_parade":"dagues","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":true,"ispossession":false,"dommages":1,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":false},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"shsUV8UpU18c0RJK","name":"Course","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_course.webp","effects":[]} {"_id":"qrd9AoZzFgyzFBxz","name":"Griffes","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.qrd9AoZzFgyzFBxz"}},"img":"systems/foundryvtt-reve-de-dragon/icons/compcreature-griffes.webp","effects":[],"system":{"categorie_parade":"sans-armes","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":true,"isparade":true,"ispossession":false,"dommages":1,"description":"","descriptionmj":"","categorie":"melee","isnaturelle":true},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011173,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"yBUVTjTXYfwvzusb","name":"Saut","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_saut.webp","effects":[]} {"_id":"sUdXhpuVVOAlcVpo","name":"Pickpocket","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.sUdXhpuVVOAlcVpo"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_pickpocket.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011174,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"yDHZfK4RmwQW4YaW","name":"Discrétion","permission":{"default":0,"Q4cUvqxCxMoTJXDL":3},"type":"competencecreature","data":{"niveau":0,"carac_value":0,"iscombat":false,"dommages":0,"description":"","categorie_parade":"","isparade":false,"default_diffLibre":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_discretion.webp","effects":[]} {"_id":"shsUV8UpU18c0RJK","name":"Course","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.shsUV8UpU18c0RJK"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_course.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011174,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"yBUVTjTXYfwvzusb","name":"Saut","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.yBUVTjTXYfwvzusb"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_saut.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":"","categorie":"generale"},"ownership":{"default":0,"Q2G6GTdrotKzYGUC":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011174,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}
{"_id":"yDHZfK4RmwQW4YaW","name":"Discrétion","type":"competencecreature","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.competences-creatures.yDHZfK4RmwQW4YaW"}},"img":"systems/foundryvtt-reve-de-dragon/icons/competence_discretion.webp","effects":[],"system":{"categorie_parade":"","niveau":0,"default_diffLibre":0,"carac_value":0,"iscombat":false,"isparade":false,"ispossession":false,"dommages":0,"description":"","descriptionmj":""},"ownership":{"default":0,"Q4cUvqxCxMoTJXDL":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.0.16","coreVersion":"10.285","createdTime":1663624702695,"modifiedTime":1663625011174,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}}

View File

@@ -1,40 +1,40 @@
{"name":"Idée fixe : Anorexie. Ne rien avaler, ni solide, ni liquide, pas même une potion","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"anorexie.webp","effects":[],"_id":"0uc2pMIGL03Hq2Hn"} {"name":"Idée fixe : Anorexie. Ne rien avaler, ni solide, ni liquide, pas même une potion","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"0uc2pMIGL03Hq2Hn"}
{"name":"Désir lancinant : Briser un objet de verre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"briser_verre.webp","effects":[],"_id":"1l59lWbtvYp74OTb"} {"name":"Désir lancinant : Briser un objet de verre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"1l59lWbtvYp74OTb"}
{"name":"Idée fixe : Cracher dans toute nourriture ou boisson aperçue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"cracher_nourriture.webp","effects":[],"_id":"22EQLBJfHVYs96iC"} {"name":"Idée fixe : Cracher dans toute nourriture ou boisson aperçue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"22EQLBJfHVYs96iC"}
{"name":"Idée fixe : Éteindre tout feu rencontré (feu de camp, torche, lanterne, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"eteindre_feu.webp","effects":[],"_id":"2Rtm78bMKPy8eG4q"} {"name":"Idée fixe : Éteindre tout feu rencontré (feu de camp, torche, lanterne, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"2Rtm78bMKPy8eG4q"}
{"name":"Désir lancinant : Danser avec un(e) partenaire inconnu(e) (Beauté 13 minimum)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"danser_inconnu.webp","effects":[],"_id":"2i3PndTKG1n3hEUU"} {"name":"Désir lancinant : Danser avec un(e) partenaire inconnu(e) (Beauté 13 minimum)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"2i3PndTKG1n3hEUU"}
{"name":"Idée fixe : Traîner son épée en laisse (ou sa meilleure arme)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"trainer_laisse.webp","effects":[],"_id":"2j1q9e07ZLlIQDYl"} {"name":"Idée fixe : Traîner son épée en laisse (ou sa meilleure arme)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"2j1q9e07ZLlIQDYl"}
{"name":"Désir lancinant : Gagner de largent (minimum 10 deniers)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"gagner_argent.webp","effects":[],"_id":"3BcC8lSsP5WIyva7"} {"name":"Désir lancinant : Gagner de largent (minimum 10 deniers)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"3BcC8lSsP5WIyva7"}
{"name":"Désir lancinant : Mégalomanie. Être acclamé par un minimum de 10 personnes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"megalomanie.webp","effects":[],"_id":"3ZjwYyQRatCMnBCi"} {"name":"Désir lancinant : Mégalomanie. Être acclamé par un minimum de 10 personnes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"3ZjwYyQRatCMnBCi"}
{"name":"Idée fixe : Avoir le visage noirci à la cendre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"avoir_visage.webp","effects":[],"_id":"6G0lF06jSryTduAt"} {"name":"Idée fixe : Avoir le visage noirci à la cendre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"6G0lF06jSryTduAt"}
{"name":"Idée fixe : Ne marcher quà quatre pattes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"marcher_quatre_pattes.webp","effects":[],"_id":"7TKsit2Mv9mWGq3C"} {"name":"Idée fixe : Ne marcher quà quatre pattes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"7TKsit2Mv9mWGq3C"}
{"name":"Désir lancinant : Acquérir une chèvre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"acqu%C3%A9rir_chevre.webp","effects":[],"_id":"8sLXQBqo8XwjAFG0"} {"name":"Désir lancinant : Acquérir une chèvre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"8sLXQBqo8XwjAFG0"}
{"name":"Idée fixe : Garder les yeux bandés","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"garder_yeux.webp","effects":[],"_id":"E902EEYZHg3zFKq6"} {"name":"Idée fixe : Garder les yeux bandés","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"E902EEYZHg3zFKq6"}
{"name":"Désir lancinant : Danser nu sous la pluie","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"danser_pluie.webp","effects":[],"_id":"F6qL4d4g3qjh045R"} {"name":"Désir lancinant : Danser nu sous la pluie","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"F6qL4d4g3qjh045R"}
{"name":"Idée fixe : Garder sur soi 3d6 kilos de cailloux","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"garder_cailloux.webp","effects":[],"_id":"F8G3rdU1nfJzYwYR"} {"name":"Idée fixe : Garder sur soi 3d6 kilos de cailloux","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"F8G3rdU1nfJzYwYR"}
{"name":"Désir lancinant : Se faire raser la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"raser_tete.webp","effects":[],"_id":"HSNOvBR890dsEDw2"} {"name":"Désir lancinant : Se faire raser la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"HSNOvBR890dsEDw2"}
{"name":"Idée fixe : Aller tout nu, sans porter le moindre paquet ni objet","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"aller_nu.webp","effects":[],"_id":"I0CtQ05xFW6ghcdP"} {"name":"Idée fixe : Aller tout nu, sans porter le moindre paquet ni objet","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"I0CtQ05xFW6ghcdP"}
{"name":"Idée fixe : Boulimie. Manger au moins un point de sust. par heure","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"boulimie.webp","effects":[],"_id":"JcTX8qMS0z8bmdVt"} {"name":"Idée fixe : Boulimie. Manger au moins un point de sust. par heure","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"JcTX8qMS0z8bmdVt"}
{"name":"Désir lancinant : Passer une nuit sur une échelle","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"nuit_echelle.webp","effects":[],"_id":"LlELEB0FhymLx6VM"} {"name":"Désir lancinant : Passer une nuit sur une échelle","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"LlELEB0FhymLx6VM"}
{"name":"Idée fixe : Refuser de monter dans les TMR","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"refuser_tmr.webp","effects":[],"_id":"NpTDqICR7ZuToQrg"} {"name":"Idée fixe : Refuser de monter dans les TMR","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"NpTDqICR7ZuToQrg"}
{"name":"Désir lancinant : Masochisme. Perdre 3 points dendurance minimum en 1 round","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"masochisme.webp","effects":[],"_id":"NzJJNK0YMAbobu0p"} {"name":"Désir lancinant : Masochisme. Perdre 3 points dendurance minimum en 1 round","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"NzJJNK0YMAbobu0p"}
{"name":"Désir lancinant : Casser 3d6 oeufs en les jetant à terre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"casser_oeufs.webp","effects":[],"_id":"OjG8XRbeYtq2jcgB"} {"name":"Désir lancinant : Casser 3d6 oeufs en les jetant à terre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"OjG8XRbeYtq2jcgB"}
{"name":"Désir lancinant : Traire une vache","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"traire_vache.webp","effects":[],"_id":"QHUOwjMR6AvepGPm"} {"name":"Désir lancinant : Traire une vache","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"QHUOwjMR6AvepGPm"}
{"name":"Désir lancinant : Pisser dans un violon (luth, mandoline, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"pisser_violon.webp","effects":[],"_id":"S8PVNgxb7TcFXq9g"} {"name":"Désir lancinant : Pisser dans un violon (luth, mandoline, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"S8PVNgxb7TcFXq9g"}
{"name":"Désir lancinant : Manger du poisson","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"manger_poisson.webp","effects":[],"_id":"SY0SsWtZdxSodMcl"} {"name":"Désir lancinant : Manger du poisson","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"SY0SsWtZdxSodMcl"}
{"name":"Idée fixe : Ne pas franchir de porte. (On peut franchir une fenêtre)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"pas-franchir.webp","effects":[],"_id":"UUTbsktTcxsIe5L5"} {"name":"Idée fixe : Ne pas franchir de porte. (On peut franchir une fenêtre)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"UUTbsktTcxsIe5L5"}
{"name":"Idée fixe : Refuser de se délester du moindre objet, ni donner ni prêter","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"refuser_delester.webp","effects":[],"_id":"VChJbtGFtWoiFNky"} {"name":"Idée fixe : Refuser de se délester du moindre objet, ni donner ni prêter","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"VChJbtGFtWoiFNky"}
{"name":"Idée fixe : Ne sexprimer que par des cris danimaux (meuh ! coin-coin ! etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"exprimer_cris.webp","effects":[],"_id":"YCHBbRLiMzTH7IBj"} {"name":"Idée fixe : Ne sexprimer que par des cris danimaux (meuh ! coin-coin ! etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"YCHBbRLiMzTH7IBj"}
{"name":"Idée fixe : Vider sur sa tête toute fiole ou flacon aperçu","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"verser_flacon.webp","effects":[],"_id":"afGp9CewfyJKecEE"} {"name":"Idée fixe : Vider sur sa tête toute fiole ou flacon aperçu","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"afGp9CewfyJKecEE"}
{"name":"Désir lancinant : Faire des bulles de savon","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"bulles_savon.webp","effects":[],"_id":"df5oN8Ub3dWTVxNj"} {"name":"Désir lancinant : Faire des bulles de savon","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"df5oN8Ub3dWTVxNj"}
{"name":"Désir lancinant : Entendre braire un âne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"entendre_ane.webp","effects":[],"_id":"diCCimukdNM6bPub"} {"name":"Désir lancinant : Entendre braire un âne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"diCCimukdNM6bPub"}
{"name":"Désir lancinant : Se rouler dans la boue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"se_rouler_boue.webp","effects":[],"_id":"el4lofhhSucMv5xv"} {"name":"Désir lancinant : Se rouler dans la boue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"el4lofhhSucMv5xv"}
{"name":"Idée fixe : Ne dire que «non» ou négation analogue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"dire_non.webp","effects":[],"_id":"gMmqdJ9I7Mt8Tg3f"} {"name":"Idée fixe : Ne dire que «non» ou négation analogue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"gMmqdJ9I7Mt8Tg3f"}
{"name":"Désir lancinant : Manger des champignons","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"manger_champignons.webp","effects":[],"_id":"gadh6aI5iCM82qpP"} {"name":"Désir lancinant : Manger des champignons","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"gadh6aI5iCM82qpP"}
{"name":"Idée fixe : Refuser de se déplacer autrement que porté","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"refuser_deplacer.webp","effects":[],"_id":"hghw6Cldrad1CIiJ"} {"name":"Idée fixe : Refuser de se déplacer autrement que porté","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"hghw6Cldrad1CIiJ"}
{"name":"Idée fixe : Garder une main sur la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"garder_main.webp","effects":[],"_id":"iPYPgxL2uUnphStc"} {"name":"Idée fixe : Garder une main sur la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"iPYPgxL2uUnphStc"}
{"name":"Idée fixe : Appeler les hommes «madame» et les femmes «messire»","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"appeler_hommes_femmes.webp","effects":[],"_id":"j2xIrFWYqhDM4TcN"} {"name":"Idée fixe : Appeler les hommes «madame» et les femmes «messire»","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"j2xIrFWYqhDM4TcN"}
{"name":"Désir lancinant : Se soûler (minimum pas frais)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"se_souler.webp","effects":[],"_id":"jShpKV8mVcqWmYvp"} {"name":"Désir lancinant : Se soûler (minimum pas frais)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},""img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"jShpKV8mVcqWmYvp"}
{"name":"Désir lancinant : Construire une cabane","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"construire_cabane.webp","effects":[],"_id":"mN0yghXkFfj2YctJ"} {"name":"Désir lancinant : Construire une cabane","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"mN0yghXkFfj2YctJ"}
{"name":"Désir lancinant : Embrasser un cochon sur le groin","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"embrasser_cochon.webp","effects":[],"_id":"sjXBBr85OBk4Yg4t"} {"name":"Désir lancinant : Embrasser un cochon sur le groin","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Tant que satisfaction n'est pas obtenue, aucun point d'exp&eacute;rience ne peut plus &ecirc;tre gagn&eacute; par l'exercice en cas de particuli&egrave;re et d'ajustement final n&eacute;gatif.<br />Les points d'exp&eacute;rience dus au stress ne sont pas affect&eacute;s.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/desir_lancinant.webp","effects":[],"_id":"sjXBBr85OBk4Yg4t"}
{"name":"Idée fixe : Faire le mort","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"faire_mort.webp","effects":[],"_id":"xa4t9Lbt6uLEjap6"} {"name":"Idée fixe : Faire le mort","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"<p>Prend effet imm&eacute;diatement et dure jusqu'&agrave; la <strong>fin de l'heure du Ch&acirc;teau Dormant </strong>du <strong>lendemain.<br /></strong>Si pass&eacute; ce d&eacute;lai, l'occasion de la manifester ne s'est pas pr&eacute;sent&eacute;e, la queue prend fin.</p>\n<p>Si elle entre en contradiction avec une autre queue, retirer.</p>","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queues/idee_fixe.webp","effects":[],"_id":"xa4t9Lbt6uLEjap6"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -65,7 +65,11 @@
--debug-box-shadow-blue: inset 0 0 2px blue; --debug-box-shadow-blue: inset 0 0 2px blue;
--debug-box-shadow-green: inset 0 0 2px green; --debug-box-shadow-green: inset 0 0 2px green;
/* =================== 3. some constants ============ */ /* =================== 3. some constants ============ */
--color-controls:rgba(0, 0, 0, 0.9);
--color-controls-hover:rgba(255, 255, 128, 0.7);
--color-control-border-hover:rgba(255, 128, 0, 0.8);
--color-gold: rgba(191, 149, 63, 0.8);
--gradient-gold: linear-gradient(30deg, rgba(191, 149, 63, 0.3), rgba(252, 246, 186, 0.3), rgba(179, 135, 40, 0.3), rgba(251, 245, 183, 0.3), rgba(170, 119, 28, 0.3)); --gradient-gold: linear-gradient(30deg, rgba(191, 149, 63, 0.3), rgba(252, 246, 186, 0.3), rgba(179, 135, 40, 0.3), rgba(251, 245, 183, 0.3), rgba(170, 119, 28, 0.3));
--gradient-silver: linear-gradient(30deg, rgba(61, 55, 93, 0.3), rgba(178, 179, 196, 0.3), rgba(59, 62, 63, 0.6), rgba(206, 204, 199, 0.3), rgba(61, 46, 49, 0.3)); --gradient-silver: linear-gradient(30deg, rgba(61, 55, 93, 0.3), rgba(178, 179, 196, 0.3), rgba(59, 62, 63, 0.6), rgba(206, 204, 199, 0.3), rgba(61, 46, 49, 0.3));
--gradient-green: linear-gradient(30deg, rgba(7, 76, 0, 0.3), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.1), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.3)); --gradient-green: linear-gradient(30deg, rgba(7, 76, 0, 0.3), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.1), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.3));
@@ -104,6 +108,9 @@
.strong-text{ .strong-text{
font-weight: bold; font-weight: bold;
} }
i:is(.fas, .far) {
font-size: smaller;
}
.tabs .item.active, .blessures-list li ul li:first-child:hover, a:hover { .tabs .item.active, .blessures-list li ul li:first-child:hover, a:hover {
text-shadow: 1px 0px 0px #ff6600; text-shadow: 1px 0px 0px #ff6600;
@@ -225,6 +232,26 @@ table {border: 1px solid #7a7971;}
flex-grow : 3; flex-grow : 3;
} }
/* Styles limited to foundryvtt-reve-de-dragon sheets */ /* Styles limited to foundryvtt-reve-de-dragon sheets */
.equipement-nom {
flex-grow : 4;
margin: 0;
justify-content: center;
text-align: left;
}
.equipement-detail {
margin: 0;
flex: 'flex-shrink' ;
align-items: center;
justify-content: center;
text-align: center;
}
.equipement-actions {
margin: 0;
flex-grow: 2;
align-items: center;
justify-content: center;
text-align: left;
}
.foundryvtt-reve-de-dragon .sheet-header { .foundryvtt-reve-de-dragon .sheet-header {
-webkit-box-flex: 0; -webkit-box-flex: 0;
@@ -266,14 +293,8 @@ table {border: 1px solid #7a7971;}
height: 8%; height: 8%;
max-height: 48px; max-height: 48px;
border-width: 0; border-width: 0;
border: 1px solid rgba(0, 0, 0, 0); border: 1px solid rgba(0, 0, 0, 0);
} }
.button-img:hover {
color: rgba(255, 255, 128, 0.7);
border: 1px solid rgba(255, 128, 0, 0.8);
cursor: pointer;
}
.button-effect-img { .button-effect-img {
vertical-align: baseline; vertical-align: baseline;
width: 16px; width: 16px;
@@ -281,9 +302,16 @@ table {border: 1px solid #7a7971;}
height: 16; height: 16;
border-width: 0; border-width: 0;
} }
.button-effect-img:hover { .small-button-direction {
color: rgba(255, 255, 128, 0.7); height: 32px;
border: 1px solid rgba(255, 128, 0, 0.8); width: 32px;
border: 0;
vertical-align: bottom;
}
:is(.button-img,.button-effect-img:hover,.small-button-direction):hover {
color: var(--color-controls-hover);
border: 1px solid var(--color-control-border-hover);
text-shadow: 1px 0px 0px #ff6600;
cursor: pointer; cursor: pointer;
} }
@@ -294,18 +322,6 @@ table {border: 1px solid #7a7971;}
vertical-align: bottom; vertical-align: bottom;
} }
.small-button-direction {
height: 32px;
width: 32px;
border: 0;
vertical-align: bottom;
}
.small-button-direction:hover {
color: rgba(255, 255, 128, 0.7);
border: 1px solid rgba(255, 128, 0, 0.8);
cursor: pointer;
}
.foundryvtt-reve-de-dragon .sheet-header .header-fields { .foundryvtt-reve-de-dragon .sheet-header .header-fields {
-webkit-box-flex: 1; -webkit-box-flex: 1;
-ms-flex: 1; -ms-flex: 1;
@@ -346,25 +362,25 @@ table {border: 1px solid #7a7971;}
flex-grow: 0; flex-grow: 0;
} }
.rdd.sheet .window-content .sheet-body .carac-list .competence { .rdd.sheet .window-content .sheet-body .carac-list .caracteristique {
flex-wrap: nowrap; flex-wrap: nowrap;
justify-content: stretch; justify-content: stretch;
} }
.rdd.sheet .window-content .sheet-body .carac-list .competence > .carac-label { .rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .carac-label {
flex-basis: 50%; flex-basis: 50%;
} }
.rdd.sheet .window-content .sheet-body .carac-list .competence > .attribut-label { .rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .attribut-label {
flex-basis: 50%; flex-basis: 50%;
} }
.rdd.sheet .window-content .sheet-body .carac-list .competence > .competence-value.total { .rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .competence-value.total {
flex-grow: 1; flex-grow: 1;
text-align: right; text-align: right;
} }
.rdd.sheet .window-content .sheet-body .carac-list .competence > .utiliser-attribut { .rdd.sheet .window-content .sheet-body .carac-list .caracteristique > .utiliser-attribut {
flex-basis: available; flex-basis: available;
flex-grow: 1; flex-grow: 1;
} }
.rdd.sheet .window-content .sheet-body .carac-list .competence > * { .rdd.sheet .window-content .sheet-body .carac-list .caracteristique > * {
flex-basis: 13%; flex-basis: 13%;
flex-grow: 0; flex-grow: 0;
} }
@@ -469,13 +485,18 @@ table {border: 1px solid #7a7971;}
flex: 0 0 86px; flex: 0 0 86px;
text-align: right; text-align: right;
} }
.competence-list .item-controls { .competence-list .item-controls {
display: contents !important; display: contents !important;
} }
.competence-list .item-controls.hidden-controls { .competence-list .item-controls.hidden-controls {
display: none !important; display: none !important;
} }
.item-controls i:is(.fas,.far) {
color: var(--color-controls);
}
.item-controls i:is(.fas,.far):hover {
opacity: 0.7 ;
}
.rdddialog .dialog-roll-sort s{ .rdddialog .dialog-roll-sort s{
width: 600px; width: 600px;
@@ -567,7 +588,7 @@ table {border: 1px solid #7a7971;}
color: rgba(255, 255, 255, 0.75); color: rgba(255, 255, 255, 0.75);
background: rgba(255, 255, 255, 0.05); background: rgba(255, 255, 255, 0.05);
border: 0 none; border: 0 none;
margin-bottom: 0.25rem; margin-bottom: 0.2rem;
} }
.window-app .window-content, .window-app.sheet .window-content .sheet-body{ .window-app .window-content, .window-app.sheet .window-content .sheet-body{
@@ -601,7 +622,7 @@ section.sheet-body{padding: 0.25rem 0.5rem;}
nav.sheet-tabs .item { nav.sheet-tabs .item {
position: relative; position: relative;
padding: 0 0.25rem; padding: 0 0.2rem;
} }
nav.sheet-tabs .item:after { nav.sheet-tabs .item:after {
@@ -627,11 +648,15 @@ section.sheet-body:after {
.sheet header.sheet-header .flex-compteurs {text-align: right;} .sheet header.sheet-header .flex-compteurs {text-align: right;}
.sheet header.sheet-header .resource-content {width: 2rem;} .sheet header.sheet-header .resource-content {width: 2rem;}
.ctn-vie span, .ctn-endu span, .ctn-fatigue span, .ctn-reve span { .compteur span {
display: inline-block; display: inline-block;
text-align: left; text-align: left;
width: 2rem; width: 2rem;
} }
.compteur a i:is(.fas,.far):hover {
opacity: 0.7 ;
}
.select-diff { .select-diff {
display: inline-block; display: inline-block;
text-align: left; text-align: left;
@@ -644,17 +669,6 @@ section.sheet-body:after {
max-width: 90%; max-width: 90%;
} }
.plus-moins {
display: inline-block;
width: 1.25rem;
background: rgba(30, 25, 20, 1);
text-align: center;
border: 1px solid rgba(72, 46, 28, 1);
border-radius: 0.25rem;
line-height: 1.25rem;
color: rgba(255, 255, 255, 0.5);
}
.alchimie-tache { .alchimie-tache {
font-weight: bold; font-weight: bold;
background: rgb(182, 180, 179); background: rgb(182, 180, 179);
@@ -711,10 +725,13 @@ ul, ol {
ul, li { ul, li {
list-style-type: none; list-style-type: none;
} }
.sheet .caracteristique li {
margin: 0.1rem;
padding: 0.2rem;
}
.sheet li { .sheet li {
margin: 0.125rem; margin: 0.1rem;
padding: 0.25rem; padding: 0.1rem;
} }
.header-fields li { .header-fields li {
margin: 0; margin: 0;
@@ -731,23 +748,19 @@ ul, li {
background: rgb(160, 130, 100, 0.05); background: rgb(160, 130, 100, 0.05);
} }
.xp-level-up { .xp-level-up {
margin: 0.125rem; margin: 0.1rem;
box-shadow: inset 0px 0px 1px #00000096; box-shadow: inset 0px 0px 1px #00000096;
border-radius: 0.25rem; border-radius: 0.25rem;
padding: 0.125rem; padding: 0.1rem;
flex: 1 1 5rem; flex: 1 1 5rem;
background: var(--gradient-gold) !important; background: var(--gradient-gold) !important;
} }
.niveau-archetype { .niveau-archetype {
background: var(--gradient-silver-light) !important; background: var(--gradient-silver-light) !important;
} }
.fa-arrow-alt-circle-up.allouer-stress { .item-controls i.fas.allouer-stress.level-up {
color: rgba(83, 60, 14, 0.8); color: var(--color-gold);
} }
.fa-arrow-alt-circle-up.allouer-stress-level-up {
color: rgba(191, 149, 63, 0.8);
}
.blessures-list ul { .blessures-list ul {
display: flex; display: flex;
} }
@@ -766,18 +779,18 @@ ul, li {
font-weight: bold; font-weight: bold;
} }
.list-item { .list-item {
margin: 0.125rem; margin: 0.1rem;
box-shadow: inset 0px 0px 1px #00000096; box-shadow: inset 0px 0px 1px #00000096;
border-radius: 0.25rem; border-radius: 0.25rem;
padding: 0.125rem; padding: 0.1rem;
flex: 1 1 5rem; flex: 1 1 5rem;
display: flex !important; display: flex !important;
align-items: baseline !important; align-items: center !important;
} }
.table-row { .table-row {
margin: 0.125rem; margin: 0.1rem;
padding: 0.125rem; padding: 0.1rem;
flex: 1 1 5rem; flex: 1 1 5rem;
} }
@@ -801,28 +814,54 @@ ul, li {
background: rgb(200, 10, 100, 0.25); background: rgb(200, 10, 100, 0.25);
} }
.item-quantite { .item-column {
margin-left: 0.5rem; margin-left: 0.2rem;
margin-right: 0.2rem;
justify-content: center;
text-align: center;
} }
.list-item-margin1 { .list-item-margin1 {
margin-left: 1rem; margin-left: 0.5rem;
} }
.list-item-margin2 { .list-item-margin2 {
margin-left: 2rem; margin-left: 1rem;
} }
.list-item-margin3 { .list-item-margin3 {
margin-left: 3rem; margin-left: 1.5rem;
} }
.list-item-margin4 { .list-item-margin4 {
margin-left: 4rem; margin-left: 2rem;
}
.list-item-margin5 {
margin-left: 2.5rem;
}
.list-item-margin6 {
margin-left: 3rem;
}
.grid-select-type-tmr {
display: grid;
grid-column: span 4 / span 4;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 0.1rem;
margin: 0.1rem;
padding: 0;
}
.grid-select-actor {
display: grid;
grid-column: span 2 / span 2;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.1rem;
margin: 0.1rem;
padding: 0;
} }
.sheet-competence-img { .sheet-competence-img {
width: 24px; width: 24px;
height: 24px; height: 24px;
flex-grow: 0; flex-grow: 0;
margin-right: 0.25rem; margin-right: 0.2rem;
vertical-align: bottom; vertical-align: bottom;
} }
.competence-column { .competence-column {
@@ -866,20 +905,20 @@ ul, li {
.competence-value { .competence-value {
flex-grow: 0; flex-grow: 0;
flex-basis: 2rem; flex-basis: 2rem;
margin-right: 0.25rem; margin-right: 0.2rem;
margin-left: 0.25rem; margin-left: 0.2rem;
} }
.description-value { .description-value {
flex-grow: 0; flex-grow: 0;
flex-basis: 4rem; flex-basis: 4rem;
margin-right: 0.25rem; margin-right: 0.2rem;
margin-left: 0.25rem; margin-left: 0.2rem;
} }
.competence-xp { .competence-xp {
flex-grow: 0; flex-grow: 0;
flex-basis: 2rem; flex-basis: 2rem;
margin-right: 0.25rem; margin-right: 0.2rem;
margin-left: 0.25rem; margin-left: 0.2rem;
} }
.blessures-title { .blessures-title {
font-weight: bold; font-weight: bold;
@@ -957,7 +996,7 @@ ul, li {
flex-basis: auto; flex-basis: auto;
padding: 0; padding: 0;
line-height: 1rem; line-height: 1rem;
margin: 0.25rem; margin: 0.2rem;
} }
.control-icon.tokenhudicon.right { .control-icon.tokenhudicon.right {
margin-left: 8px; margin-left: 8px;
@@ -975,7 +1014,7 @@ ul, li {
border-left: none; border-left: none;
font-weight: 500; font-weight: 500;
font-size: 1rem; font-size: 1rem;
color: black; color: var(--color-controls);
padding-top: 5px; padding-top: 5px;
margin-right: 0px; margin-right: 0px;
width: 45px; width: 45px;
@@ -1075,7 +1114,7 @@ ul, li {
.sidebar-tab .directory-list .entity { .sidebar-tab .directory-list .entity {
border-top: 1px dashed rgba(0,0,0,0.25); border-top: 1px dashed rgba(0,0,0,0.25);
border-bottom: 0 none; border-bottom: 0 none;
padding: 0.25rem 0; padding: 0.2rem 0;
} }
.sidebar-tab .directory-list .entity:hover { .sidebar-tab .directory-list .entity:hover {
@@ -1124,9 +1163,16 @@ ul, li {
} }
#sidebar #sidebar-tabs i.fa-comments:before, #sidebar #sidebar-tabs i.fa-fist-raised:before, #sidebar #sidebar-tabs i.fa-users:before, #sidebar #sidebar-tabs i.fa-map:before, #sidebar #sidebar-tabs i.fa-suitcase:before, #sidebar #sidebar-tabs i.fa-book-open:before, #sidebar #sidebar-tabs i.fa-th-list:before, #sidebar #sidebar-tabs i.fa-music:before, #sidebar #sidebar-tabs i.fa-atlas:before, #sidebar #sidebar-tabs i.fa-cogs:before {content: "";} #sidebar #sidebar-tabs i:is(
.fa-comments, .fa-fist-raised, .fa-swords,
.fa-users, .fa-user, .fa-map, .fa-suitcase,
.fa-book-open, .fa-th-list, .fa-music,
.fa-atlas,.fa-cogs
):before {content: "";}
#sidebar #sidebar-tabs i.fa-comments {background: url("img/ui/icon_sidebar_chat.svg") no-repeat;} #sidebar #sidebar-tabs i.fa-comments {background: url("img/ui/icon_sidebar_chat.svg") no-repeat;}
#sidebar #sidebar-tabs i.fa-fist-raised {background: url("img/ui/icon_sidebar_fight.svg") no-repeat;} #sidebar #sidebar-tabs i.fa-fist-raised {background: url("img/ui/icon_sidebar_fight.svg") no-repeat;}
#sidebar #sidebar-tabs i.fa-swords {background: url("img/ui/icon_sidebar_fight.svg") no-repeat;}
#sidebar #sidebar-tabs i.fa-user {background: url("img/ui/icon_sidebar_actor.svg") no-repeat;}
#sidebar #sidebar-tabs i.fa-users {background: url("img/ui/icon_sidebar_actor.svg") no-repeat;} #sidebar #sidebar-tabs i.fa-users {background: url("img/ui/icon_sidebar_actor.svg") no-repeat;}
#sidebar #sidebar-tabs i.fa-map {background: url("img/ui/icon_sidebar_scene.svg") no-repeat;} #sidebar #sidebar-tabs i.fa-map {background: url("img/ui/icon_sidebar_scene.svg") no-repeat;}
#sidebar #sidebar-tabs i.fa-suitcase {background: url("img/ui/icon_sidebar_item.svg") no-repeat;} #sidebar #sidebar-tabs i.fa-suitcase {background: url("img/ui/icon_sidebar_item.svg") no-repeat;}
@@ -1153,11 +1199,11 @@ ul, li {
border-image-width: 4px; border-image-width: 4px;
border-image-outset: 0px; border-image-outset: 0px;
} }
#controls .control-tools { #controls .control-tools {
max-height: calc(100vh - 156px); max-height: calc(100vh - 156px);
height: auto; height: auto;
} }
#controls .scene-control.active, #controls .control-tool.active, #controls .scene-control:hover, #controls .control-tool:hover { #controls :is(.scene-control.active,.control-tool.active, .scene-control:hover, .control-tool:hover) {
background: rgba(72, 46, 28, 1); background: rgba(72, 46, 28, 1);
background-origin: padding-box; background-origin: padding-box;
border-image: url(img/ui/footer-button.webp) 10 repeat; border-image: url(img/ui/footer-button.webp) 10 repeat;
@@ -1343,8 +1389,8 @@ ul, li {
color: rgba(255, 255, 255, 0.5); color: rgba(255, 255, 255, 0.5);
} }
.calendar-btn:hover { .calendar-btn:hover {
color: rgba(255, 255, 128, 0.7); color: var(--color-controls-hover);
border: 1px solid rgba(255, 128, 0, 0.8); border: 1px solid var(--color-control-border-hover);
cursor: pointer; cursor: pointer;
} }

View File

@@ -34,9 +34,10 @@
], ],
"url": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/", "url": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/",
"license": "LICENSE.txt", "license": "LICENSE.txt",
"version": "10.0.6", "version": "10.0.20",
"compatibility": { "compatibility": {
"minimum": "10" "minimum": "10",
"verified": "10.286"
}, },
"esmodules": [ "esmodules": [
"module/rdd-main.js" "module/rdd-main.js"
@@ -332,7 +333,7 @@
], ],
"socket": true, "socket": true,
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v10/system.json", "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v10/system.json",
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.0.6.zip", "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.0.20.zip",
"gridDistance": 1, "gridDistance": 1,
"gridUnits": "m", "gridUnits": "m",
"primaryTokenAttribute": "sante.vie", "primaryTokenAttribute": "sante.vie",

View File

@@ -576,7 +576,7 @@
"types": ["objet", "arme", "armure", "conteneur", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition", "rencontresTMR", "queue", "ombre", "souffle", "types": ["objet", "arme", "armure", "conteneur", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition", "rencontresTMR", "queue", "ombre", "souffle",
"tete", "competencecreature", "tarot", "monnaie", "nombreastral", "tache", "meditation", "casetmr", "recettealchimique", "tete", "competencecreature", "tarot", "monnaie", "nombreastral", "tache", "meditation", "casetmr", "recettealchimique",
"musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre", "nourritureboisson", "signedraconique", "gemme", "musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre", "nourritureboisson", "signedraconique", "gemme",
"possession" ], "possession", "sortreserve" ],
"possession": { "possession": {
"typepossession": "", "typepossession": "",
"possede": false, "possede": false,
@@ -679,9 +679,10 @@
"categorie_parade": "", "categorie_parade": "",
"niveau": 0, "niveau": 0,
"default_diffLibre": 0, "default_diffLibre": 0,
"categorie": "",
"carac_value": 0, "carac_value": 0,
"iscombat": false, "iscombat": false,
"isparade": false, "isnaturelle": true,
"ispossession": false, "ispossession": false,
"dommages": 0, "dommages": 0,
"description": "Compétence : ...", "description": "Compétence : ...",
@@ -889,7 +890,7 @@
"descriptionmj": "" "descriptionmj": ""
}, },
"oeuvre": { "oeuvre": {
"default_carac": "", "default_carac": "",
"competence": "", "competence": "",
"niveau": 0, "niveau": 0,
"reference": "", "reference": "",
@@ -943,6 +944,14 @@
}, },
"description": "", "description": "",
"descriptionmj": "" "descriptionmj": ""
},
"sortreserve": {
"sortid" : "",
"draconic": "",
"coord": "",
"ptreve": 0,
"heurecible": "",
"echectotal": false
} }
} }
} }

View File

@@ -1,5 +1,5 @@
<tr class="table-row alterne-row item" data-blessure-type="{{gravite}}" data-attribute={{key}} data-blessure-index="{{key}}" > <tr class="table-row alterne-row item" data-blessure-type="{{gravite}}" data-attribute={{key}} data-blessure-index="{{key}}" >
<td class="item-control blessure-control" title="Blessure {{title}}" data-blessure-active="{{bless.active}}"> <td class="blessure-control" title="Blessure {{title}}" data-blessure-active="{{bless.active}}">
{{#if bless.active}} {{#if bless.active}}
<i class="fas fa-skull-crossbones blessure-active-{{gravite}}" name="blessure-{{gravite}}-{{key}}-active"></i> <i class="fas fa-skull-crossbones blessure-active-{{gravite}}" name="blessure-{{gravite}}-{{key}}-active"></i>
{{else}} {{else}}

View File

@@ -41,7 +41,7 @@
<div class="grid grid-2col"> <div class="grid grid-2col">
<div class="flex-group-left flexcol"> <div class="flex-group-left flexcol">
<ol class="carac-list alterne-list"> <ol class="carac-list alterne-list">
{{#each data.carac as |carac key|}} {{#each system.carac as |carac key|}}
<li class="flexrow list-item" data-attribute="{{key}}"> <li class="flexrow list-item" data-attribute="{{key}}">
{{#if (eq key 'taille')}} {{#if (eq key 'taille')}}
<span class="carac-label flexrow" name="system.carac.{{key}}.label">{{carac.label}}</span> <span class="carac-label flexrow" name="system.carac.{{key}}.label">{{carac.label}}</span>
@@ -61,29 +61,29 @@
</div> </div>
<div class="flex-group-left flexcol"> <div class="flex-group-left flexcol">
<ol class="carac-list alterne-list"> <ol class="carac-list alterne-list">
{{#each data.attributs as |attr key|}} {{#each system.attributs as |attr key|}}
<li class="flexrow list-item" data-attribute="{{key}}"> <li class="flexrow list-item" data-attribute="{{key}}">
<span class="carac-label" name="system.attributs.{{key}}.label">{{attr.label}}</span> <span class="carac-label" name="system.attributs.{{key}}.label">{{attr.label}}</span>
<input type="text" name="system.attributs.{{key}}.value" value="{{attr.value}}" data-dtype="{{attr.type}}" /> <input type="text" name="system.attributs.{{key}}.value" value="{{attr.value}}" data-dtype="{{attr.type}}" />
</li> </li>
{{/each}} {{/each}}
<li class="flexrow list-item" data-attribute="vie"> <li class="flexrow list-item" data-attribute="vie">
<span class="competence-label" name="data.sante.vie.label">Vie</span> <span class="competence-label" name="system.sante.vie.label">Vie</span>
<span class="flexrow" > <span class="flexrow" >
<input type="text" name="system.sante.vie.value" value="{{data.sante.vie.value}}" data-dtype="Number" /> / <input type="text" name="system.sante.vie.value" value="{{system.sante.vie.value}}" data-dtype="Number" /> /
<input type="text" name="system.sante.vie.max" value="{{data.sante.vie.max}}" data-dtype="Number" /> <input type="text" name="system.sante.vie.max" value="{{system.sante.vie.max}}" data-dtype="Number" />
</span> </span>
</li> </li>
<li class="flexrow list-item" data-attribute="endurance"> <li class="flexrow list-item" data-attribute="endurance">
<span class="competence-label" name="system.sante.endurance.label">Endurance</span> <span class="competence-label" name="system.sante.endurance.label">Endurance</span>
<span class="flexrow" > <span class="flexrow" >
<input type="text" name="system.sante.endurance.value" value="{{data.sante.endurance.value}}" data-dtype="Number" /> / <input type="text" name="system.sante.endurance.value" value="{{system.sante.endurance.value}}" data-dtype="Number" /> /
<input type="text" name="system.sante.endurance.max" value="{{data.sante.endurance.max}}" data-dtype="Number" /> <input type="text" name="system.sante.endurance.max" value="{{system.sante.endurance.max}}" data-dtype="Number" />
</span> </span>
</li> </li>
<li class="flexrow list-item" data-attribute="etat"> <li class="flexrow list-item" data-attribute="etat">
<span class="competence-label" name="system.compteurs.etat.label">Etat Général</span> <span class="competence-label" name="system.compteurs.etat.label">Etat Général</span>
<input type="text" value="{{data.compteurs.etat.value}}" disabled /> <input type="text" value="{{system.compteurs.etat.value}}" disabled />
</li> </li>
</ol> </ol>
</div> </div>
@@ -108,8 +108,8 @@
<input class="competence-value creature-dommages" type="text" compname="{{comp.name}}" <input class="competence-value creature-dommages" type="text" compname="{{comp.name}}"
value="{{numberFormat comp.system.dommages decimals=0 sign=true}}" data-dtype="number" /> value="{{numberFormat comp.system.dommages decimals=0 sign=true}}" data-dtype="number" />
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -126,35 +126,7 @@
{{!-- Equipment Tab --}} {{!-- Equipment Tab --}}
<div class="tab items" data-group="primary" data-tab="items"> <div class="tab items" data-group="primary" data-tab="items">
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html"}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html" monnaie=monnaie}}
<span class="item-name"><h4>Equipement porté</h4></span>
<span class="item-name">Encombrement total/max : {{numberFormat calc.encTotal decimals=2}} / {{data.attributs.encombrement.value}} <b>{{calc.surEncombrementMessage}}</b></span> -
<span class="item-name"><a class="creer-un-objet">Créer un objet</a></span>
{{#if options.isGM}}
<span class="item-name"> - <a id="nettoyer-conteneurs">Vider tout les conteneurs</a></span>
{{/if}}
<ul class="item-list alterne-list">
<li class="competence-header flexrow">
<img class="sheet-competence-img" src="{{img}}" title="Equipement"/>
<span class="competence-title flex-grow">Nom</span>
<span class="competence-title">Q.</span>
<span class="competence-title">Enc.</span>
<span class="competence-title flex-grow">Equiper/Editer/Suppr.</span>
</li>
{{#each objets as |item id|}}
{{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-conteneur.html" item=item }}
{{/if}}
{{/unless}}
{{/each}}
{{#each conteneurs as |conteneur id|}}
{{buildConteneur this}}
{{/each}}
</ul>
</div> </div>
{{!-- Biography Tab --}} {{!-- Biography Tab --}}
@@ -162,12 +134,12 @@
<div class="form-group"> <div class="form-group">
<span class="item-name"><h4>Race</h4></span> <span class="item-name"><h4>Race</h4></span>
<input type="text" name="system.race" value="{{data.race}}" data-dtype="String" /> <input type="text" name="system.race" value="{{system.race}}" data-dtype="String" />
</div> </div>
<div class="form-group editor"> <div class="form-group editor">
<span class="item-name"><h4>Description</h4> <span class="item-name"><h4>Description</h4>
{{editor data.description target="system.description" button=true owner=owner editable=true}} {{editor system.description target="system.description" button=true owner=owner editable=true}}
</div> </div>
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}}

View File

@@ -32,15 +32,15 @@
<div class="grid grid-2col"> <div class="grid grid-2col">
<div class="flex-group-left flexcol"> <div class="flex-group-left flexcol">
<ol class="carac-list alterne-list"> <ol class="carac-list alterne-list">
{{#each data.carac as |carac key|}} {{#each system.carac as |carac key|}}
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
{{#if (eq key 'taille')}} {{#if (eq key 'taille')}}
<span class="carac-label flexrow" name="data.carac.{{key}}.label">{{carac.label}}</span> <span class="carac-label flexrow" name="system.carac.{{key}}.label">{{carac.label}}</span>
{{else}} {{else}}
<span class="carac-label flexrow" name="data.carac.{{key}}.label"><a <span class="carac-label flexrow" name="system.carac.{{key}}.label"><a
name={{key}}>{{carac.label}}</a></span> name={{key}}>{{carac.label}}</a></span>
{{/if}} {{/if}}
<input class="competence-value flexrow" type="text" name="data.carac.{{key}}.value" <input class="competence-value flexrow" type="text" name="system.carac.{{key}}.value"
value="{{carac.value}}" data-dtype="{{carac.type}}" /> value="{{carac.value}}" data-dtype="{{carac.type}}" />
</li> </li>
{{/each}} {{/each}}
@@ -50,38 +50,38 @@
<div class="flex-group-left flexcol"> <div class="flex-group-left flexcol">
<ol class="carac-list alterne-list"> <ol class="carac-list alterne-list">
<li class="competence flexrow list-item"> <li class="caracteristique flexrow list-item">
<span class="carac-label flexrow" name="catEntite">Catégorie : </span> <span class="carac-label flexrow" name="catEntite">Catégorie : </span>
<select name="data.definition.categorieentite" value="{{data.definition.categorieentite}}" data-dtype="String"> <select name="system.definition.categorieentite" value="{{system.definition.categorieentite}}" data-dtype="String">
{{#select data.definition.categorieentite}} {{#select system.definition.categorieentite}}
<option value="cauchemar">Cauchemar</option> <option value="cauchemar">Cauchemar</option>
<option value="reve">Rêve</option> <option value="reve">Rêve</option>
{{/select}} {{/select}}
</select> </select>
</li> </li>
<li class="competence flexrow list-item"> <li class="caracteristique flexrow list-item">
<span class="carac-label flexrow" name="typeEntite">Type d'entité : </span> <span class="carac-label flexrow" name="typeEntite">Type d'entité : </span>
<select name="data.definition.typeentite" value="{{data.definition.typeentite}}" data-dtype="String"> <select name="system.definition.typeentite" value="{{system.definition.typeentite}}" data-dtype="String">
{{#select data.definition.typeentite}} {{#select system.definition.typeentite}}
<option value="incarne">Incarnée</option> <option value="incarne">Incarnée</option>
<option value="nonincarne">Non Incarnée</option> <option value="nonincarne">Non Incarnée</option>
<option value="blurette">Blurete</option> <option value="blurette">Blurette</option>
{{/select}} {{/select}}
</select> </select>
</li> </li>
{{#each data.attributs as |attr key|}} {{#each system.attributs as |attr key|}}
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label flexrow" name="data.attributs.{{key}}.label">{{attr.label}} : </span> <span class="carac-label flexrow" name="system.attributs.{{key}}.label">{{attr.label}} : </span>
<span><input class="attribut-value flexrow" type="text" name="data.attributs.{{key}}.value" <span><input class="attribut-value flexrow" type="text" name="system.attributs.{{key}}.value"
value="{{attr.value}}" data-dtype="{{attr.type}}" /></span> value="{{attr.value}}" data-dtype="{{attr.type}}" /></span>
</li> </li>
{{/each}} {{/each}}
<li class="competence flexrow list-item" data-attribute="endurance"> <li class="caracteristique flexrow list-item" data-attribute="endurance">
<span class="competence-label flexrow" name="data.sante.endurance.label">Endurance : </span> <span class="competence-label flexrow" name="system.sante.endurance.label">Endurance : </span>
<span><input class="sante-value flexrow" type="text" name="data.sante.endurance.value" <span><input class="sante-value flexrow" type="text" name="system.sante.endurance.value"
value="{{data.sante.endurance.value}}" data-dtype="Number" /></span><span>/ </span> value="{{system.sante.endurance.value}}" data-dtype="Number" /></span><span>/ </span>
<span><input class="sante-value flexrow" type="text" name="data.sante.endurance.max" <span><input class="sante-value flexrow" type="text" name="system.sante.endurance.max"
value="{{data.sante.endurance.max}}" data-dtype="Number" /></span> value="{{system.sante.endurance.max}}" data-dtype="Number" /></span>
</li> </li>
</ol> </ol>
</div> </div>
@@ -98,14 +98,14 @@
<img class="sheet-competence-img" src="{{comp.img}}" /> <img class="sheet-competence-img" src="{{comp.img}}" />
<span class="competence-label"><a>{{comp.name}}</a></span> <span class="competence-label"><a>{{comp.name}}</a></span>
<input class="competence-value creature-carac" type="text" compname="{{comp.name}}" <input class="competence-value creature-carac" type="text" compname="{{comp.name}}"
value="{{comp.data.carac_value}}" data-dtype="number" /> value="{{comp.system.carac_value}}" data-dtype="number" />
<input class="competence-value creature-niveau" type="text" compname="{{comp.name}}" <input class="competence-value creature-niveau" type="text" compname="{{comp.name}}"
value="{{numberFormat comp.data.niveau decimals=0 sign=true}}" data-dtype="number" /> value="{{numberFormat comp.system.niveau decimals=0 sign=true}}" data-dtype="number" />
<input class="competence-value creature-dommages" type="text" compname="{{comp.name}}" <input class="competence-value creature-dommages" type="text" compname="{{comp.name}}"
value="{{numberFormat comp.data.dommages decimals=0 sign=true}}" data-dtype="number" /> value="{{numberFormat comp.system.dommages decimals=0 sign=true}}" data-dtype="number" />
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -118,8 +118,8 @@
<img class="sheet-competence-img" src="{{possession.img}}" /> <img class="sheet-competence-img" src="{{possession.img}}" />
<span class="competence-label">{{possession.name}}</span> <span class="competence-label">{{possession.name}}</span>
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -131,7 +131,7 @@
{{!-- Biography Tab --}} {{!-- Biography Tab --}}
<div class="tab description" data-group="primary" data-tab="description"> <div class="tab description" data-group="primary" data-tab="description">
<div class="form-group editor"> <div class="form-group editor">
{{editor data.description target="system.description" button=true owner=owner editable=true}} {{editor system.description target="system.description" button=true owner=owner editable=true}}
</div> </div>
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}}
</div> </div>

View File

@@ -13,15 +13,15 @@
</thead> </thead>
<tbody> <tbody>
<tr class="table-row alterne-row" ><td/><td colspan="4">Légères</td></tr> <tr class="table-row alterne-row" ><td/><td colspan="4">Légères</td></tr>
{{#each data.blessures.legeres.liste as |bless key|}} {{#each system.blessures.legeres.liste as |bless key|}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html" bless=bless key=key gravite="legere" title="Légère"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html" bless=bless key=key gravite="legere" title="Légère"}}
{{/each}} {{/each}}
<tr class="table-row alterne-row"><td/><td colspan="4">Graves</td></tr> <tr class="table-row alterne-row"><td/><td colspan="4">Graves</td></tr>
{{#each data.blessures.graves.liste as |bless key|}} {{#each system.blessures.graves.liste as |bless key|}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html" bless=bless key=key gravite="grave" title="Grave"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html" bless=bless key=key gravite="grave" title="Grave"}}
{{/each}} {{/each}}
<tr class="table-row alterne-row"><td/><td colspan="4">Critiques</td></tr> <tr class="table-row alterne-row"><td/><td colspan="4">Critiques</td></tr>
{{#each data.blessures.critiques.liste as |bless key|}} {{#each system.blessures.critiques.liste as |bless key|}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html" bless=bless key=key gravite="critique" title="Critique"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-blessure-partial.html" bless=bless key=key gravite="critique" title="Critique"}}
{{/each}} {{/each}}
</tbody> </tbody>

View File

@@ -1,27 +1,31 @@
<header class="competence-header flexrow"> {{#if competences}}
<span class="competence-title">{{categorie}}</span> <div class="flex-shrink">
</header> <header class="competence-header flexrow">
<ul class="item-list alterne-list competence-list"> <span class="competence-title">{{categorie}}</span>
{{#if @root.options.vueDetaillee}} </header>
<li class="item flexrow list-item "> <ul class="item-list alterne-list competence-list">
{{#if @root.options.vueDetaillee}}
<span class="competence-label"></span> <li class="item flexrow list-item ">
<span class="competence-value" >Niv.</span>
<span class="competence-xp">xp</span> <span class="competence-label"></span>
{{#if (eq categorie 'Draconic')}} <span class="competence-value" >Niv.</span>
<span class="competence-xp-sort">sort</span> <span class="competence-xp">xp</span>
{{/if}} {{#if (eq categorie 'Draconic')}}
<div class="item-controls"> <span class="competence-xp-sort">sort</span>
<i class="far fa-arrow-alt-circle-up"></i>
<span class="competence-archetype">Arch</span>
<i class="far fa-edit"></i>
{{#if @root.options.isGM}}
<i class="far fa-trash"></i>
{{/if}} {{/if}}
</div> <div class="item-controls">
</li> <i class="far fa-arrow-alt-circle-up"></i>
{{/if}} <span class="competence-archetype">Arch</span>
{{#each competences as |comp key|}} <i class="far fa-edit"></i>
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-competence-partial.html" comp}} {{#if @root.options.isGM}}
{{/each}} <i class="far fa-trash"></i>
</ul> {{/if}}
</div>
</li>
{{/if}}
{{#each competences as |comp key|}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-competence-partial.html" comp}}
{{/each}}
</ul>
</div>
{{/if}}

View File

@@ -1,4 +1,4 @@
{{#if visible}} {{#if system.isVisible}}
<li class="item flexrow list-item {{#if system.isLevelUp}}xp-level-up tooltip{{/if}}" data-item-id="{{_id}}"> <li class="item flexrow list-item {{#if system.isLevelUp}}xp-level-up tooltip{{/if}}" data-item-id="{{_id}}">
<a class="competence-label" name="{{name}}"> <a class="competence-label" name="{{name}}">
<img class="sheet-competence-img" src="{{img}}"/> <img class="sheet-competence-img" src="{{img}}"/>
@@ -7,7 +7,7 @@
{{#if system.isLevelUp}} {{#if system.isLevelUp}}
<span class="tooltiptext ttt-xp">Vous pouvez dépenser {{system.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}}</span> <span class="tooltiptext ttt-xp">Vous pouvez dépenser {{system.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}}</span>
<a class="item-control competence-xp-augmenter" compname="{{name}}" title="Augmenter"> <a class="competence-xp-augmenter" compname="{{name}}" title="Augmenter">
<i class="fas fa-arrow-alt-circle-up"></i> <i class="fas fa-arrow-alt-circle-up"></i>
</a> </a>
{{/if}} {{/if}}
@@ -31,7 +31,7 @@
{{#if @root.options.vueDetaillee}} {{#if @root.options.vueDetaillee}}
<div class="item-controls"> <div class="item-controls">
{{#if system.stressXpMax}} {{#if system.stressXpMax}}
<a class="item-control competence-stress-augmenter" compname="{{name}}" <a class="competence-stress-augmenter" compname="{{name}}"
title="Dépenser {{system.stressXpMax}} points de stress {{#if system.isStressLevelUp}} pour augmenter d'un niveau {{/if}}"> title="Dépenser {{system.stressXpMax}} points de stress {{#if system.isStressLevelUp}} pour augmenter d'un niveau {{/if}}">
<i class="fas fa-arrow-alt-circle-up allouer-stress{{#if system.isStressLevelUp}}-level-up{{/if}}"></i> <i class="fas fa-arrow-alt-circle-up allouer-stress{{#if system.isStressLevelUp}}-level-up{{/if}}"></i>
</a> </a>
@@ -41,9 +41,9 @@
<input class="competence-archetype niveau-archetype" type="text" compname="{{name}}" name="comp-archetype-{{name}}" <input class="competence-archetype niveau-archetype" type="text" compname="{{name}}" name="comp-archetype-{{name}}"
value="{{numberFormat system.niveau_archetype decimals=0 sign=true}}" data-dtype="number" value="{{numberFormat system.niveau_archetype decimals=0 sign=true}}" data-dtype="number"
{{#unless @root.options.editCaracComp}}disabled{{/unless}} /> {{#unless @root.options.editCaracComp}}disabled{{/unless}} />
<a class="item-control item-edit" title="Modifier"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
{{#if @root.options.isGM}} {{#if @root.options.isGM}}
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
{{/if}} {{/if}}
</div> </div>
{{/if}} {{/if}}

View File

@@ -1,7 +1,7 @@
{{#if calc.surprise}}{{calc.surprise}}! {{/if}} {{#if calc.surprise}}{{calc.surprise}}! {{/if}}
{{#if effects}} {{#if effects}}
{{#each effects as |effect key|}} {{#each effects as |effect key|}}
<span class="active-effect" data-id="{{effect._id}}"> <span class="active-effect" data-effect="{{effect.flags.core.statusId}}">
<img class="button-effect-img delete-active-effect" src="{{effect.icon}}" alt="{{localize effect.label}}" width="24" height="24" /> <img class="button-effect-img delete-active-effect" src="{{effect.icon}}" alt="{{localize effect.label}}" width="24" height="24" />
</span> </span>
{{/each}} {{/each}}

View File

@@ -1,32 +0,0 @@
<li class="item flexrow list-item" data-item-id="{{item._id}}" draggable="true">
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
{{#if (eq item.type 'conteneur')}}
<span class="item-name conteneur-name flex-grow"><a data-item-id="{{item._id}}">+{{item.name}}</a></span>
{{else}}
<span class="item-name flex-grow">{{item.name}}</span>
{{/if}}
<span class="item-quantite">{{item.system.quantite}}
{{#if (gt item.system.quantite 1)}}
<a class="item-control item-split" title="Séparer"><i class="fas fa-unlink"></i></a>
{{/if}}
</span>
<span class="item-quantite">{{numberFormat item.system.encTotal decimals=2}}</span>
<div class="item-controls flex-grow">
{{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}}
<a class="item-control item-equip" title="Equiper">{{#if item.system.equipe}}<i class="fas fa-hand-rock"></i>{{else}}<i class="far fa-hand-paper"></i>{{/if}}</a>
{{/if}}
{{/unless}}
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
{{#if (or (eq item.type 'arme') (eq item.type 'conteneur') item.system.quantite)}}
&nbsp;
<a class="item-control item-vendre" title="Vendre ou donner"><i class="fas fa-comments-dollar"></i></a>
{{/if}}
<a class="item-control item-montrer" title="Montrer"><i class="fas fa-comment"></i></a>
{{#if item.system.actionPrincipale}}
<a class="item-name item-action">{{item.system.actionPrincipale}}</a>
{{/if}}
</div>
</li>

View File

@@ -0,0 +1,40 @@
<li class="item flexrow list-item" data-item-id="{{item._id}}" draggable="true">
<span class="equipement-nom {{#if (eq item.type 'conteneur')}}conteneur-name{{/if}} ">
{{#if (eq item.type 'conteneur')}}
<a>
<i class="{{~#if vide}}far fa-square
{{else if ouvert}}far fa-minus-square
{{else}}far fa-plus-square
{{/if~}}"></i>
{{/if}}
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
<span>{{item.name}}</span>
{{#if (eq item.type 'conteneur')}}
</a>
{{/if}}
</span>
<span class="equipement-detail">{{item.system.quantite}}
{{#if (gt item.system.quantite 1)}}
<a class="item-split" title="Séparer"><i class="fas fa-unlink"></i></a>
{{/if}}
</span>
<span class="equipement-detail">{{numberFormat item.system.encTotal decimals=2}}</span>
<span class="equipement-actions item-controls">
{{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}}
<a class="item-equip" title="Equiper">{{#if item.system.equipe}}<i class="fas fa-hand-rock"></i>{{else}}<i class="far fa-hand-paper"></i>{{/if}}</a>
{{/if}}
{{/unless}}
<a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
&nbsp;
{{#if (or (eq item.type 'arme') (eq item.type 'conteneur') item.system.quantite)}}
<a class="item-vendre" title="Vendre ou donner"><i class="fas fa-comments-dollar"></i></a>
{{/if}}
<a class="item-montrer" title="Montrer"><i class="fas fa-comment"></i></a>
{{#if item.system.actionPrincipale}}
<a class="item-action">{{item.system.actionPrincipale}}</a>
{{/if}}
</span>
</li>

View File

@@ -3,16 +3,20 @@
{{#each monnaie as |piece id|}} {{#each monnaie as |piece id|}}
<li class="item flexrow list-item" data-item-id="{{piece._id}}"> <li class="item flexrow list-item" data-item-id="{{piece._id}}">
<img class="sheet-competence-img" src="{{piece.img}}" title="{{piece.name}}"/> <img class="sheet-competence-img" src="{{piece.img}}" title="{{piece.name}}"/>
<span class="competence-title competence-label">{{piece.name}}</span> <span class="equipement-nom">{{piece.name}}</span>
<span class="competence-title competence-label">{{piece.system.quantite}}</span> <span class="equipement-detail item-controls">
<span class="competence-title"> <a class="monnaie-moins"><i class="fas fa-minus-square"></i></a>
<a class="monnaie-plus plus-moins">+</a> </span>
<a class="monnaie-moins plus-moins">-</a> <span class="equipement-detail">
<span>{{piece.system.quantite}}</span>
</span>
<span class="equipement-detail item-controls">
<a class="monnaie-plus"><i class="fas fa-plus-square"></i></a>
</span>
<span class="equipement-actions item-controls">
<a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</span> </span>
<div class="item-controls flex-shrink">
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li> </li>
{{/each}} {{/each}}
</ul> </ul>

View File

@@ -0,0 +1,26 @@
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html" monnaie=monnaie}}
<span class="item-name"><h4>Equipement</h4></span>
<span class="item-name">Encombrement total/max : {{numberFormat calc.encTotal decimals=2}} / {{system.attributs.encombrement.value}} <b>{{calc.surEncombrementMessage}}</b></span> -
<span class="item-name"><a class="creer-un-objet">Créer un objet</a></span>
{{#if options.isGM}}
<span class="item-name"> - <a id="nettoyer-conteneurs">Vider tout les conteneurs</a></span>
{{/if}}
<ul class="item-list alterne-list">
<li class="competence-header flexrow">
<span class="equipement-nom">Nom</span>
<span class="equipement-detail">Q.</span>
<span class="equipement-detail">Enc.</span>
<span class="equipement-actions">Actions</span>
</li>
{{#each objets as |item id|}}
{{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-item.html" item=item vide=true ouvert=true }}
{{/if}}
{{/unless}}
{{/each}}
{{#each conteneurs as |conteneur id|}}
{{buildConteneur this}}
{{/each}}
</ul>

View File

@@ -0,0 +1,15 @@
<li class="item flexrow" data-attribute={{key}} data-item-id="{{queue._id}}">
<img class="sheet-competence-img" src="{{queue.img}}" />
<span class="display-label flex-grow">
{{#if (eq queue.type 'ombre')}}
<img class="sheet-competence-img" src="systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp" />
{{/if}}
<a>{{queue.name}}</a>
</span>
<div class="item-controls">
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
{{#if queue.system.refoulement}}
<a class="item-action">Refouler</a>
{{/if}}
</div>
</li>

View File

@@ -0,0 +1,12 @@
<span class="item-name"><h4>Compagnons animaux</h4></span>
<ul class="item-list alterne-list">
{{#each subacteurs.montures as |monture id|}}
<li class="item flexrow list-item" data-actor-id="{{monture.id}}">
<img class="sheet-competence-img" src="{{monture.img}}" title="{{monture.name}}"/>
<span class="subacteur-label"><a>{{monture.name}}</a></span>
<div class="flex-shrink">
<a class="subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>

View File

@@ -0,0 +1,12 @@
<span class="item-name"><h4>Suivants</h4></span>
<ul class="item-list alterne-list">
{{#each subacteurs.suivants as |suivant id|}}
<li class="item flexrow list-item" data-actor-id="{{suivant.id}}">
<img class="sheet-competence-img" src="{{suivant.img}}" title="{{suivant.name}}"/>
<span class="competence-title subacteur-label"><a>{{suivant.name}}</a></span>
<div class="item-controls flex-shrink">
<a class="subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>

View File

@@ -0,0 +1,15 @@
<span class="item-name"><h4>Véhicules</h4></span>
<ul class="item-list alterne-list">
{{#each subacteurs.vehicules as |vehicule id|}}
<li class="item flexrow list-item" data-actor-id="{{vehicule.id}}">
<img class="sheet-competence-img" src="{{vehicule.img}}" title="{{vehicule.name}}"/>
<span class="flex-grow subacteur-label"><a>{{vehicule.name}}</a></span>
<span>{{vehicule.categorie}}</span>
<span>{{vehicule.structure}}</span>
<div class="flex-shrink">
<a class="subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>

View File

@@ -1,11 +1,12 @@
<li class="item flexrow list-item" data-item-id="{{oeuvre._id}}"> <li class="item flexrow list-item" data-item-id="{{oeuvre._id}}">
<img class="sheet-competence-img" src="{{oeuvre.img}}" />
<span>{{upperFirst typeOeuvre}}</span> <span>{{upperFirst typeOeuvre}}</span>
<span class="competence-title {{classOeuvre}}"> <span class="competence-title {{classOeuvre}}">
<a>{{oeuvre.name}} (niveau {{oeuvre.system.niveau}})</a> <a>{{oeuvre.name}} (niveau {{oeuvre.system.niveau}})</a>
</span> </span>
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>

View File

@@ -0,0 +1,15 @@
{{#if (or queues.length ombres.length)}}
<h3>
{{#if queues.length}}Queues de Dragon{{/if}}
{{#if (and queues.length ombres.length)}} et {{/if}}
{{#if ombres.length}}Ombres de Thanatos{{/if}}
:</h3>
<ul class="flex-group-left">
{{#each queues as |queue key|}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-item-queue.html" queue=queue key=key}}
{{/each}}
{{#each ombres as |ombre key|}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-item-queue.html" queue=ombre key=key}}
{{/each}}
</ul>
{{/if}}

View File

@@ -10,40 +10,40 @@
<div class="flexrow"> <div class="flexrow">
<ul class="flex-group-center flex-compteurs"> <ul class="flex-group-center flex-compteurs">
<li> <li>
<label class="ctn-vie"> <label class="compteur">
<a class="jet-vie">Vie</a> <a class="jet-vie">Vie</a>
<a class="vie-moins plus-moins">-</a> <a class="vie-moins"><i class="fas fa-minus-square"></i></a>
<input class="resource-content" type="text" name="data.sante.vie.value" value="{{data.sante.vie.value}}" data-dtype="Number"/> <input class="resource-content" type="text" name="system.sante.vie.value" value="{{system.sante.vie.value}}" data-dtype="Number"/>
<span>/ {{data.sante.vie.max}}</span> <span>/ {{system.sante.vie.max}}</span>
<a class="vie-plus plus-moins">+</a> <a class="vie-plus"><i class="fas fa-plus-square"></i></a>
</label> </label>
</li> </li>
<li> <li>
<label class="ctn-endu"> <label class="compteur">
<a class="jet-endurance">Endurance</a> <a class="jet-endurance">Endurance</a>
<a class="endurance-moins plus-moins">-</a> <a class="endurance-moins"><i class="fas fa-minus-square"></i></a>
<input class="resource-content" type="text" name="data.sante.endurance.value" value="{{data.sante.endurance.value}}" data-dtype="Number"/> <input class="resource-content" type="text" name="system.sante.endurance.value" value="{{system.sante.endurance.value}}" data-dtype="Number"/>
<span>/ {{data.sante.endurance.max}}</span> <span>/ {{system.sante.endurance.max}}</span>
<a class="endurance-plus plus-moins">+</a> <a class="endurance-plus"><i class="fas fa-plus-square"></i></a>
</label> </label>
</li> </li>
<li> <li>
<label class="appliquerFatigue ctn-fatigue tooltip"> <label class="appliquerFatigue compteur tooltip">
<span class="tooltiptext ttt-fatigue">{{{calc.fatigue.html}}}</span> <span class="tooltiptext ttt-fatigue">{{{calc.fatigue.html}}}</span>
Fatigue Fatigue
<a class="fatigue-moins plus-moins">-</a> <a class="fatigue-moins"><i class="fas fa-minus-square"></i></a>
<input class="resource-content" id="fatigue-value" type="text" name="data.sante.fatigue.value" value="{{data.sante.fatigue.value}}" data-dtype="Number" /> <input class="resource-content" id="fatigue-value" type="text" name="system.sante.fatigue.value" value="{{system.sante.fatigue.value}}" data-dtype="Number" />
<span>/ {{data.sante.fatigue.max}}</span> <span>/ {{system.sante.fatigue.max}}</span>
<a class="fatigue-plus plus-moins">+</a> <a class="fatigue-plus"><i class="fas fa-plus-square"></i></a>
</label> </label>
</li> </li>
<li> <li>
<label class="ctn-reve"> <label class="compteur">
<span class="ptreve-actuel"><a>Rêve</a></span> <span class="ptreve-actuel"><a>Rêve</a></span>
<a class="ptreve-actuel-moins plus-moins">-</a> <a class="ptreve-actuel-moins"><i class="fas fa-minus-square"></i></a>
<input class="resource-content" id="pointsreve-value" type="text" name="data.reve.reve.value" value="{{data.reve.reve.value}}" data-dtype="Number" /> <input class="resource-content" id="pointsreve-value" type="text" name="system.reve.reve.value" value="{{system.reve.reve.value}}" data-dtype="Number" />
<span>/ {{data.reve.seuil.value}}</span> <span>/ {{system.reve.seuil.value}}</span>
<a class="ptreve-actuel-plus plus-moins">+</a> <a class="ptreve-actuel-plus"><i class="fas fa-plus-square"></i></a>
</label> </label>
</li> </li>
</ul> </ul>
@@ -52,7 +52,7 @@
<span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span> <span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span>
<span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span> <span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span>
<span class="repos"><a title="Repos"><img class="button-img" src="icons/svg/sleep.svg" alt="Se reposer"/></a></span> <span class="repos"><a title="Repos"><img class="button-img" src="icons/svg/sleep.svg" alt="Se reposer"/></a></span>
{{#if data.attributs.hautrevant.value}} {{#if system.attributs.hautrevant.value}}
<span class="monte-tmr"><a title="Montée dans les Terres M&eacute;dianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres M&eacute;dianes !"/></a></span> <span class="monte-tmr"><a title="Montée dans les Terres M&eacute;dianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres M&eacute;dianes !"/></a></span>
<span class="monte-tmr-rapide"><a title="Montée accélérée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres M&eacute;dianes !"/></a></span> <span class="monte-tmr-rapide"><a title="Montée accélérée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres M&eacute;dianes !"/></a></span>
<span class="visu-tmr"><a title="Regarder les Terres M&eacute;dianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres M&eacute;dianes"/></a></span> <span class="visu-tmr"><a title="Regarder les Terres M&eacute;dianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres M&eacute;dianes"/></a></span>
@@ -65,8 +65,8 @@
<span>{{calc.resumeBlessures}}</span> <span>{{calc.resumeBlessures}}</span>
</div> </div>
<div class="flexrow"> <div class="flexrow">
<span>{{data.compteurs.etat.label}}: {{data.compteurs.etat.value}}</span> <span>{{system.compteurs.etat.label}}: {{system.compteurs.etat.value}}</span>
<span>{{data.compteurs.surenc.label}}: {{data.compteurs.surenc.value}}</span> <span>{{system.compteurs.surenc.label}}: {{system.compteurs.surenc.value}}</span>
</div> </div>
<div class="flexrow"> <div class="flexrow">
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-effects-partial.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-effects-partial.html"}}
@@ -100,38 +100,38 @@
<div class="grid grid-2col"> <div class="grid grid-2col">
<div class="flex-group-left flexcol"> <div class="flex-group-left flexcol">
<ul class="carac-list alterne-list"> <ul class="carac-list alterne-list">
{{#each data.carac as |carac key|}} {{#each system.carac as |carac key|}}
{{#if carac.isLevelUp}} {{#if carac.isLevelUp}}
<li class="competence flexrow item-list xp-level-up" data-attribute="{{key}}"> <li class="caracteristique flexrow item-list xp-level-up" data-attribute="{{key}}">
{{else}} {{else}}
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
{{/if}} {{/if}}
{{#if (eq key 'taille')}} {{#if (eq key 'taille')}}
<span class="carac-label" name="data.carac.{{key}}.label">{{carac.label}}</span> <span class="carac-label" name="system.carac.{{key}}.label">{{carac.label}}</span>
<input class="carac-value" type="text" name="data.carac.{{key}}.value" value="{{carac.value}}" data-dtype="{{carac.type}}" {{#unless @root.options.editCaracComp}}disabled{{/unless}} /> <input class="carac-value" type="text" name="system.carac.{{key}}.value" value="{{carac.value}}" data-dtype="{{carac.type}}" {{#unless @root.options.editCaracComp}}disabled{{/unless}} />
<label class="carac-xp"/> <label class="carac-xp"/>
{{else}} {{else}}
{{#if carac.derivee}} {{#if carac.derivee}}
<span class="carac-label" name="data.carac.{{key}}.label"> <a name={{key}}>{{carac.label}}</a></span> <span class="carac-label" name="system.carac.{{key}}.label"> <a name={{key}}>{{carac.label}}</a></span>
<label class="competence-value">{{carac.value}}</label> <label class="competence-value">{{carac.value}}</label>
<label class="carac-xp"/> <label class="carac-xp"/>
{{else}} {{else}}
{{#if carac.isLevelUp}} {{#if carac.isLevelUp}}
<span class="carac-label tooltip" name="data.carac.{{key}}.label"> <span class="carac-label tooltip" name="system.carac.{{key}}.label">
<span class="tooltiptext ttt-xp"> <span class="tooltiptext ttt-xp">
Vous pouvez dépenser {{carac.xpNext}} points d'Experience pour augmenter de 1 votre caractéristique {{carac.label}} Vous pouvez dépenser {{carac.xpNext}} points d'Experience pour augmenter de 1 votre caractéristique {{carac.label}}
</span> </span>
<a name={{key}}>{{carac.label}}</a></span> <a name={{key}}>{{carac.label}}</a></span>
{{else}} {{else}}
<span class="carac-label tooltip" name="data.carac.{{key}}.label"><a name={{key}}>{{carac.label}}</a></span> <span class="carac-label tooltip" name="system.carac.{{key}}.label"><a name={{key}}>{{carac.label}}</a></span>
{{/if}} {{/if}}
<input class="carac-value" type="text" name="data.carac.{{key}}.value" value="{{carac.value}}" data-dtype="{{carac.type}}" {{#unless @root.options.editCaracComp}}disabled{{/unless}} /> <input class="carac-value" type="text" name="system.carac.{{key}}.value" value="{{carac.value}}" data-dtype="{{carac.type}}" {{#unless @root.options.editCaracComp}}disabled{{/unless}} />
<span class="carac-xp tooltip"> <span class="carac-xp tooltip">
<input class="carac-xp" type="text" name="data.carac.{{key}}.xp" value="{{carac.xp}}" data-dtype="number" {{#unless @root.options.editCaracComp}}disabled{{/unless}} /> <input class="carac-xp" type="text" name="system.carac.{{key}}.xp" value="{{carac.xp}}" data-dtype="number" {{#unless @root.options.editCaracComp}}disabled{{/unless}} />
<span class="tooltiptext ttt-xp">Vous devez acquérir {{carac.xpNext}} points d'Experience pour augmenter de 1 votre {{carac.label}}</span> <span class="tooltiptext ttt-xp">Vous devez acquérir {{carac.xpNext}} points d'Experience pour augmenter de 1 votre {{carac.label}}</span>
</span> </span>
{{#if carac.isLevelUp}} {{#if carac.isLevelUp}}
<a class="item-control carac-xp-augmenter" name="augmenter.{{key}}" title="Augmenter"> <a class="carac-xp-augmenter" name="augmenter.{{key}}" title="Augmenter">
<i class="fas fa-arrow-alt-circle-up"></i> <i class="fas fa-arrow-alt-circle-up"></i>
</a> </a>
{{/if}} {{/if}}
@@ -139,27 +139,27 @@
{{/if}} {{/if}}
</li> </li>
{{/each}} {{/each}}
<li class="competence flexrow"> <li class="caracteristique flexrow">
<span class="carac-label" name="carac-total">Total Caractéristiques </span> <span class="carac-label" name="carac-total">Total Caractéristiques </span>
<span class="competence-value total" name="carac-total-value">{{calc.caracTotal}} </span> <span class="competence-value total" name="carac-total-value">{{calc.caracTotal}} </span>
</li> </li>
</ul> </ul>
</div> </div>
<div class="flex-group-left flexcol" > <div class="flex-group-left flexcol" >
<ul class="carac-list"> <ul class="carac-list">
<li class="competence flexrow list-item"> <li class="caracteristique flexrow list-item">
<span class="carac-label" name="beaute">Beauté&nbsp;:</span> <span class="carac-label" name="beaute">Beauté&nbsp;:</span>
<input class="description-value" type="text" name="data.beaute" value="{{data.beaute}}" data-dtype="String" {{#unless @root.options.editCaracComp}}disabled{{/unless}}/> <input class="description-value" type="text" name="system.beaute" value="{{system.beaute}}" data-dtype="String" {{#unless @root.options.editCaracComp}}disabled{{/unless}}/>
<label class="carac-xp"/> <label class="carac-xp"/>
</li> </li>
{{#each data.attributs as |attr key|}} {{#each system.attributs as |attr key|}}
{{#unless (eq key 'hautrevant')}} {{#unless (eq key 'hautrevant')}}
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label" name="data.attributs.{{key}}.label">{{attr.label}}&nbsp;:</span> <span class="carac-label" name="system.attributs.{{key}}.label">{{attr.label}}&nbsp;:</span>
{{#if (eq key 'protection')}} {{#if (eq key 'protection')}}
<input class="description-value" id="attribut-protection-edit" type="text" name="{{key}}" value="{{attr.value}}" data-dtype="number"/> <input class="description-value" id="attribut-protection-edit" type="text" name="{{key}}" value="{{attr.value}}" data-dtype="number"/>
{{else}} {{else}}
<input class="description-value" type="text" disabled name="data.attributs.{{key}}." value="{{attr.value}}" data-dtype="number"/> <input class="description-value" type="text" disabled name="system.attributs.{{key}}." value="{{attr.value}}" data-dtype="number"/>
{{/if}} {{/if}}
<label class="carac-xp"/> <label class="carac-xp"/>
</li> </li>
@@ -167,19 +167,19 @@
{{/each}} {{/each}}
</ul> </ul>
<ul class="carac-list alterne-list"> <ul class="carac-list alterne-list">
<li class="competence flexrow list-item"> <li class="caracteristique flexrow list-item">
<span class="attribut-label chance-actuelle"><a>Chance actuelle</a></span> <span class="attribut-label chance-actuelle"><a>Chance actuelle</a></span>
<input class="description-value compteur-edit" type="text" name="chance" value="{{data.compteurs.chance.value}}" data-dtype="number"/> <input class="description-value compteur-edit" type="text" name="chance" value="{{system.compteurs.chance.value}}" data-dtype="number"/>
<span class="utiliser-attribut" style="padding-left: 5px"><a class="item-control chance-appel">Utiliser</a></span> <span class="utiliser-attribut" style="padding-left: 5px"><a class="chance-appel">Utiliser</a></span>
</li> </li>
{{#each data.compteurs as |compteur key|}} {{#each system.compteurs as |compteur key|}}
{{#if (eq compteur.label 'Chance')}} {{#if (eq compteur.label 'Chance')}}
{{else if (eq compteur.label 'Experience')}} {{else if (eq compteur.label 'Experience')}}
{{else if compteur.isInput}} {{else if compteur.isInput}}
<li class="competence flexrow list-item"> <li class="caracteristique flexrow list-item">
<span class="attribut-label">{{compteur.label}}</span> <span class="attribut-label">{{compteur.label}}</span>
{{#if (eq compteur.label 'Ethylisme')}} {{#if (eq compteur.label 'Ethylisme')}}
<select class="description-value" name="data.compteurs.ethylisme.value" id="ethylisme" data-dtype="Number"> <select class="description-value" name="system.compteurs.ethylisme.value" id="ethylisme" data-dtype="Number">
{{#select compteur.value}} {{#select compteur.value}}
{{>"systems/foundryvtt-reve-de-dragon/templates/niveau-ethylisme.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/niveau-ethylisme.html"}}
{{/select}} {{/select}}
@@ -189,9 +189,9 @@
{{/if}} {{/if}}
<span class="utiliser-attribut" style="padding-left: 5px"> <span class="utiliser-attribut" style="padding-left: 5px">
{{#if compteur.isStress}} {{#if compteur.isStress}}
<a class="item-control stress-test" title="Transformer">Transformer</a> <a class="stress-test" title="Transformer">Transformer</a>
{{else if (eq compteur.label 'Ethylisme')}} {{else if (eq compteur.label 'Ethylisme')}}
<a class="item-control ethylisme-test" id="ethylisme-test" title="Jet d'Ethylisme">Boire</a> <a class="ethylisme-test" id="ethylisme-test" title="Jet d'Ethylisme">Boire</a>
{{else if (eq compteur.label 'Moral')}} {{else if (eq compteur.label 'Moral')}}
<a class="moral-malheureux" title="Jet de moral situation malheureuse"><img class="small-button-container" src="systems/foundryvtt-reve-de-dragon/icons/moral-malheureux.svg" alt="Jet de moral situation malheureuse"/></a> <a class="moral-malheureux" title="Jet de moral situation malheureuse"><img class="small-button-container" src="systems/foundryvtt-reve-de-dragon/icons/moral-malheureux.svg" alt="Jet de moral situation malheureuse"/></a>
<a class="moral-neutre" title="Jet de moral situation neutre"><img class="small-button-container" src="systems/foundryvtt-reve-de-dragon/icons/moral-neutre.svg" alt="Jet de moral situation neutre"/></a> <a class="moral-neutre" title="Jet de moral situation neutre"><img class="small-button-container" src="systems/foundryvtt-reve-de-dragon/icons/moral-neutre.svg" alt="Jet de moral situation neutre"/></a>
@@ -215,11 +215,9 @@
<span><a class="lock-unlock-sheet"><img class="small-button-container" <span><a class="lock-unlock-sheet"><img class="small-button-container"
src="systems/foundryvtt-reve-de-dragon/icons/{{#if options.editCaracComp}}unlocked.svg{{else}}locked.svg{{/if}}" alt="blocker/débloquer"> src="systems/foundryvtt-reve-de-dragon/icons/{{#if options.editCaracComp}}unlocked.svg{{else}}locked.svg{{/if}}" alt="blocker/débloquer">
{{#if options.editCaracComp}}Verrouiller{{else}}Déverrouiller{{/if}}</a></span> {{#if options.editCaracComp}}Verrouiller{{else}}Déverrouiller{{/if}}</a></span>
<span class="flexrow"> <span>
<i class="fas fa-search"></i> <input class="recherche flex-grow" type="text" value="{{options.recherche.text}}" name="recherche"
<input class="cherchercompetence" type="text" value="{{options.cherchercompetence}}" name="cherchercompetence" size="8" data-dtype="String" placeholder="chercher"/>
size="8" data-dtype="String" placeholder="chercher"/>
<span></span>
</span> </span>
<span><a class="show-hide-competences"><img class="small-button-container" <span><a class="show-hide-competences"><img class="small-button-container"
src="systems/foundryvtt-reve-de-dragon/icons/{{#if options.showCompNiveauBase}}no-filter.svg{{else}}filter.svg{{/if}}" alt="filter/montrer tout"> src="systems/foundryvtt-reve-de-dragon/icons/{{#if options.showCompNiveauBase}}no-filter.svg{{else}}filter.svg{{/if}}" alt="filter/montrer tout">
@@ -232,25 +230,25 @@
</div> </div>
<div class="grid grid-2col"> <div class="grid grid-2col">
<div class="flex-group-left flexcol competence-column"> <div class="flex-group-left flexcol competence-column">
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.generale) categorie="Compétences générales"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.generale) categorie="Compétences générales"}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.particuliere) categorie="Compétences Particulières"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.particuliere) categorie="Compétences Particulières"}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.specialisee) categorie="Compétences Spécialisées"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.specialisee) categorie="Compétences Spécialisées"}}
</div> </div>
<div class="flex-group-left flexcol competence-column"> <div class="flex-group-left flexcol competence-column">
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.melee) categorie="Compétences de Mêlée"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.melee) categorie="Compétences de Mêlée"}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.tir) categorie="Compétences de Tir"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.tir) categorie="Compétences de Tir"}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.lancer) categorie="Compétences de Lancer"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.lancer) categorie="Compétences de Lancer"}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.connaissance) categorie="Connaissances"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.connaissance) categorie="Connaissances"}}
{{#if (or data.attributs.hautrevant.value options.vueDetaillee)}} {{#if (or system.attributs.hautrevant.value options.vueDetaillee)}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(sortCompetence competenceByCategory.draconic) categorie="Draconic"}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-categorie-competences-partial.html" competences=(filtreTriCompetences competenceByCategory.draconic) categorie="Draconic"}}
{{/if}} {{/if}}
<div> <div>
<ul class="item-list"> <ul class="item-list">
<li class="item flexrow"> <li class="item flexrow">
<span class="generic-label">Stress transformé</span> <span class="generic-label">Stress transformé</span>
<input class="compteur-edit" type="text" name="experience" value="{{data.compteurs.experience.value}}" data-dtype="number" size="3"/> <input class="compteur-edit" type="text" name="experience" value="{{system.compteurs.experience.value}}" data-dtype="number" size="3"/>
</li> </li>
<li class="item flexrow"> <li class="item flexrow">
@@ -302,7 +300,7 @@
</li> </li>
{{/each}} {{/each}}
{{#each esquives as |esq key|}} {{#each esquives as |esq key|}}
<li class="item flexrow list-item"> <li class="item flexrow list-item" data-item-id="{{esq._id}}">
<span class="competence-label"> <span class="competence-label">
<a class="competence-label" name="{{esq.name}}"> <a class="competence-label" name="{{esq.name}}">
<img class="sheet-competence-img" src="{{esq.img}}"/> <img class="sheet-competence-img" src="{{esq.img}}"/>
@@ -311,7 +309,7 @@
</span> </span>
<span class="arme-initiative"></span> <span class="arme-initiative"></span>
<span class="competence-label"></span> <span class="competence-label"></span>
<span class="competence-value">{{numberFormat esq.data.niveau decimals=0 sign=true}}</span> <span class="competence-value">{{numberFormat esq.system.niveau decimals=0 sign=true}}</span>
<span class="competence-value"></span> <span class="competence-value"></span>
</li> </li>
{{/each}} {{/each}}
@@ -334,7 +332,7 @@
{{#each maladiesPoisons as |maladie key|}} {{#each maladiesPoisons as |maladie key|}}
<li class="item flexrow list-item" data-item-id="{{maladie._id}}"> <li class="item flexrow list-item" data-item-id="{{maladie._id}}">
<span class="competence-label"> <span class="competence-label">
{{#if (or @root.options.isGM maladie.data.identifie)}} {{#if (or @root.options.isGM maladie.system.identifie)}}
{{maladie.name}} {{maladie.name}}
{{else}} {{else}}
Inconnue Inconnue
@@ -342,15 +340,15 @@
</span> </span>
<span class="competence-label">{{maladie.type}}</span> <span class="competence-label">{{maladie.type}}</span>
<span class="competence-label"> <span class="competence-label">
{{#if (or @root.options.isGM maladie.data.remedesconnus)}} {{#if (or @root.options.isGM maladie.system.remedesconnus)}}
{{maladie.data.remedes}} {{maladie.system.remedes}}
{{else}} {{else}}
Remèdes Inconnus Remèdes Inconnus
{{/if}} {{/if}}
</span> </span>
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Modifier"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -372,8 +370,8 @@
</span> </span>
<span class="competence-label">{{possession.system.type}}</span> <span class="competence-label">{{possession.system.type}}</span>
<div class="item-controls"> <div class="item-controls">
<a class="item-control item-edit" title="Modifier"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -386,13 +384,15 @@
<h3>Tâches</h3><a class='creer-tache'>Créer une nouvelle Tâche</a> <h3>Tâches</h3><a class='creer-tache'>Créer une nouvelle Tâche</a>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each taches as |tache id|}} {{#each taches as |tache id|}}
<li class="item flexrow list-item" data-item-id="{{tache._id}}"><span class="competence-title tache-label"><a>{{tache.name}} <li class="item flexrow list-item" data-item-id="{{tache._id}}">
<img class="sheet-competence-img" src="{{tache.img}}" />
<span class="competence-title tache-label"><a>{{tache.name}}
({{tache.system.points_de_tache_courant}}{{#if ({{tache.system.points_de_tache_courant}}{{#if
(or @root.options.isGM (not tache.system.cacher_points_de_tache)) (or @root.options.isGM (not tache.system.cacher_points_de_tache))
}}/{{tache.system.points_de_tache}}{{/if}})</a></span> }}/{{tache.system.points_de_tache}}{{/if}})</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -421,8 +421,8 @@
{{#each jeux as |jeu id|}} {{#each jeux as |jeu id|}}
<li class="item flexrow list-item" data-item-id="{{jeu._id}}"><span class="competence-title jeu-label"><a>{{jeu.name}} (base {{jeu.system.base}})</a></span> <li class="item flexrow list-item" data-item-id="{{jeu._id}}"><span class="competence-title jeu-label"><a>{{jeu.name}} (base {{jeu.system.base}})</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -432,8 +432,8 @@
{{#each recettesAlchimiques as |recette id|}} {{#each recettesAlchimiques as |recette id|}}
<li class="item flexrow list-item" data-item-id="{{recette._id}}"><span class="competence-title recette-label item-edit"><a>{{recette.name}}</a></span> <li class="item flexrow list-item" data-item-id="{{recette._id}}"><span class="competence-title recette-label item-edit"><a>{{recette.name}}</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -446,13 +446,13 @@
{{!-- hautreve Tab --}} {{!-- hautreve Tab --}}
<div class="tab hautreve " data-group="primary" data-tab="hautreve" style="height:200px"> <div class="tab hautreve " data-group="primary" data-tab="hautreve" style="height:200px">
<div> <div>
{{#if data.attributs.hautrevant.value}} {{#if system.attributs.hautrevant.value}}
<h3>Haut rêvant</h3> <h3>Haut rêvant</h3>
{{else}} {{else}}
<h3>Vous n'avez pas le don de haut-rêve! Il faut attribuer la Tête de Dragon 'Don de Haut Rêve' si votre personnage est ou devient Haut-Rêvant.</h3> <h3>Vous n'avez pas le don de haut-rêve! Il faut attribuer la Tête de Dragon 'Don de Haut Rêve' si votre personnage est ou devient Haut-Rêvant.</h3>
{{/if}} {{/if}}
<ul class="item-list"> <ul class="item-list">
{{#if data.attributs.hautrevant.value}} {{#if system.attributs.hautrevant.value}}
{{#if options.isGM}} {{#if options.isGM}}
<li class="item flexrow"> <li class="item flexrow">
<span> <span>
@@ -464,37 +464,30 @@
</li> </li>
{{/if}} {{/if}}
<li class="item flexrow"> <li class="item flexrow">
<span class="competence-label flex-shrink">Demi rêve :
{{#if options.isGM}} {{#if options.isGM}}
<span class="competence-label flex-shrink">Demi rêve : {{caseTmr-label system.reve.tmrpos.coord}}
<span>{{caseTmr-label data.reve.tmrpos.coord}}</span> </span><span>
</span> <input class="competence-value" type="text" name="system.reve.tmrpos.coord" value="{{system.reve.tmrpos.coord}}" data-dtype="String"/>
<span> {{else if hautreve.cacheTMR}}
<input class="competence-value" type="text" name="data.reve.tmrpos.coord" value="{{data.reve.tmrpos.coord}}" data-dtype="String"/> {{caseTmr-type system.reve.tmrpos.coord}}
</span> </span><span>
{{else}}
<span class="competence-label flex-shrink">Demi rêve :
{{#unless hautreve.cacheTMR}}
<span>{{caseTmr-label data.reve.tmrpos.coord}}</span>
{{/unless}}
</span>
<span>
{{#if hautreve.cacheTMR}}
?? ??
{{else}} {{else}}
{{data.reve.tmrpos.coord}} {{caseTmr-label system.reve.tmrpos.coord}}
{{/if}} </span><span>
</span> {{system.reve.tmrpos.coord}}
{{/if}} {{/if}}
</span>
</li> </li>
{{/if}} {{/if}}
<li class="item flexrow"> <li class="item flexrow">
<span class="competence-label">Seuil de Rêve :</span> <span class="competence-label">Seuil de Rêve :</span>
<span> <span>
{{#if options.isGM}} {{#if options.isGM}}
<input class="seuil-reve-value" type="text" name="data.reve.seuil.value" value="{{data.reve.seuil.value}}" data-dtype="Number"/> <input class="seuil-reve-value" type="text" name="system.reve.seuil.value" value="{{system.reve.seuil.value}}" data-dtype="Number"/>
{{else}} {{else}}
{{data.reve.seuil.value}} {{system.reve.seuil.value}}
{{/if}} {{/if}}
</span> </span>
</li> </li>
@@ -502,9 +495,9 @@
<span class="competence-label">Refoulement : </span> <span class="competence-label">Refoulement : </span>
<span> <span>
{{#if options.isGM}} {{#if options.isGM}}
<input class="competence-value" type="text" name="data.reve.refoulement.value" value="{{data.reve.refoulement.value}}" data-dtype="Number"/> <input class="competence-value" type="text" name="system.reve.refoulement.value" value="{{system.reve.refoulement.value}}" data-dtype="Number"/>
{{else}} {{else}}
{{data.reve.refoulement.value}} {{system.reve.refoulement.value}}
{{/if}} {{/if}}
</span> </span>
</li> </li>
@@ -512,40 +505,16 @@
</div> </div>
<hr> <hr>
{{!-- Queues, Souffles, Tetes, Ombre --}} {{!-- Queues, Souffles, Tetes, Ombre --}}
{{#if queues.length}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-queues.html"}}
<h3>Queues:</h3>
<ul class="flex-group-left">
{{#each queues as |queue key|}}
<li class="item flexrow" data-attribute={{key}} data-item-id="{{queue._id}}">
<span class="display-label flex-grow"><a data-item-id="{{queue._id}}">{{queue.name}}</a></span>
<div class="item-controls flex-shrink">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
{{/if}}
{{#if ombres.length}}
<h3>Ombres de Thanatos:</h3>
<ul class="item-list">
{{#each ombres as |ombre key|}}
<li class="item flexrow" data-attribute={{key}} data-item-id="{{ombre._id}}">
<span class="display-label flex-grow"><a data-item-id="{{ombre._id}}">{{ombre.name}}</a></span>
<div class="item-controls flex-shrink">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
{{/if}}
{{#if souffles.length}} {{#if souffles.length}}
<h3>Souffles:</h3> <h3>Souffles:</h3>
<ul class="item-list"> <ul class="item-list">
{{#each souffles as |souffle key|}} {{#each souffles as |souffle key|}}
<li class="item flexrow" data-attribute={{key}} data-item-id="{{souffle._id}}"> <li class="item flexrow" data-attribute={{key}} data-item-id="{{souffle._id}}">
<span class="display-label flex-grow"><a data-item-id="{{souffle._id}}">{{souffle.name}}</a></span> <img class="sheet-competence-img" src="{{souffle.img}}" />
<span class="display-label flex-grow"><a>{{souffle.name}}</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -556,31 +525,33 @@
<ul class="item-list"> <ul class="item-list">
{{#each tetes as |tete key|}} {{#each tetes as |tete key|}}
<li class="item flexrow" data-attribute={{key}} data-item-id="{{tete._id}}"> <li class="item flexrow" data-attribute={{key}} data-item-id="{{tete._id}}">
<span class="display-label flex-grow"><a data-item-id="{{tete._id}}">{{tete.name}}</a></span> <img class="sheet-competence-img" src="{{tete.img}}" />
<span class="display-label flex-grow"><a>{{tete.name}}</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
</ul> </ul>
{{/if}} {{/if}}
{{#if data.attributs.hautrevant.value}} {{#if system.attributs.hautrevant.value}}
{{#if (and options.isGM signesdraconiques.length)}} {{#if (and options.isGM signesdraconiques.length)}}
<h3>Signes draconiques</h3> <h3>Signes draconiques</h3>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each signesdraconiques as |signe key|}} {{#each signesdraconiques as |signe key|}}
<li class="item list-item flexrow" data-item-id="{{signe._id}}" data-attribute="{{key}}"> <li class="item list-item flexrow" data-item-id="{{signe._id}}" data-attribute="{{key}}">
<span class="display-label flex-grow"> <a data-item-id="{{signe._id}}">{{signe.name}}</a></span> <img class="sheet-competence-img" src="{{signe.img}}" />
<span class="flex-shrink">{{signe.data.difficulte}}</span> <span class="display-label flex-grow"><a>{{signe.name}}</a></span>
<span class="flex-shrink">{{signe.system.difficulte}}</span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
</ul> </ul>
{{/if}} {{/if}}
{{#if hautreve.rencontres.length}} {{#if hautreve.rencontres.length}}
<h3>Rencontres présentes:</h3> <h3>Rencontres présentes:</h3>
<ul class="item-list"> <ul class="item-list">
{{#each hautreve.rencontres as |rencontre key|}} {{#each hautreve.rencontres as |rencontre key|}}
@@ -591,34 +562,45 @@
<span>{{upperFirst rencontre.heure}}, le {{rencontre.date}}</span> <span>{{upperFirst rencontre.heure}}, le {{rencontre.date}}</span>
{{/if}} {{/if}}
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control rencontre-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="rencontre-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
</ul> </ul>
{{/if}} {{/if}}
{{#if hautreve.sortsReserve.length}} {{#if sortsReserve.length}}
<h3>Sorts en Réserve:</h3> <h3>Sorts en Réserve:</h3>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each sortsReserve as |sort key|}}
<li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}">
<img class="sheet-competence-img" src="{{sort.img}}" />
<span class="display-label"><a>{{#if sort.system.echectotal}}Echec total: {{/if}}{{sort.name}} r{{sort.system.ptreve}}</a></span>
<span>{{sort.system.coord}} - {{caseTmr-label sort.system.coord}}</span>
<div class="item-controls flex-shrink">
<a class="item-delete flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
{{#each hautreve.sortsReserve as |reserve key|}} {{#each hautreve.sortsReserve as |reserve key|}}
<li class="item list-item flexrow" data-item-id="{{reserve._id}}" data-attribute="{{key}}"> <li class="item list-item flexrow" data-index="{{key}}">
<img class="sheet-competence-img" src="{{reserve.sort.img}}" /> <img class="sheet-competence-img" src="{{reserve.img}}" />
<span class="display-label">{{reserve.sort.name}} r{{reserve.sort.system.ptreve_reel}}</span> <span class="display-label">{{reserve.sort.name}} r{{reserve.sort.system.ptreve_reel}}</span>
<span>{{reserve.coord}} - {{caseTmr-label reserve.coord}}</span> <span>{{reserve.coord}} - {{caseTmr-label reserve.coord}}</span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control item-delete flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="delete-sort-reserve flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
</ul> </ul>
{{/if}} {{/if}}
<hr> <hr>
<h3>Sorts:</h3> <h3>Sorts:</h3>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each sorts as |sort key|}} {{#each sorts as |sort key|}}
<li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}"> <li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}">
<img class="sheet-competence-img" src="{{sort.img}}" />
<span class="display-label flex-grow"> <span class="display-label flex-grow">
<a data-item-id="{{sort._id}}">{{sort.name}} <a data-item-id="{{sort._id}}">{{sort.name}}
- {{#if sort.system.caseTMRspeciale}}{{sort.system.caseTMRspeciale}}{{else}}{{upperFirst sort.system.caseTMR}}{{/if}} - {{#if sort.system.caseTMRspeciale}}{{sort.system.caseTMRspeciale}}{{else}}{{upperFirst sort.system.caseTMR}}{{/if}}
@@ -626,7 +608,7 @@
</span> </span>
<span>{{sort.system.draconic}} / {{sort.system.difficulte}}</span> <span>{{sort.system.draconic}} / {{sort.system.difficulte}}</span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -636,24 +618,26 @@
<ul class="item-list"> <ul class="item-list">
{{#each meditations as |meditation key|}} {{#each meditations as |meditation key|}}
<li class="item flexrow" data-item-id="{{meditation._id}}" data-attribute="{{key}}"> <li class="item flexrow" data-item-id="{{meditation._id}}" data-attribute="{{key}}">
<img class="sheet-competence-img" src="{{meditation.img}}" />
<span class="meditation-label flex-grow"><a data-item-id="{{meditation._id}}">{{meditation.name}} - {{meditation.system.competence}}</a></span> <span class="meditation-label flex-grow"><a data-item-id="{{meditation._id}}">{{meditation.name}} - {{meditation.system.competence}}</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
</ul> </ul>
<hr> <hr>
{{#if hautreve.casesTmr}} {{#if hautreve.casesTmr}}
<h3>Cases Spéciales:</h3> <h3>Cases Spéciales:</h3>
<ul class="item-list"> <ul class="item-list">
{{#each hautreve.casesTmr as |casetmr key|}} {{#each hautreve.casesTmr as |casetmr key|}}
<li class="item flexrow" data-item-id="{{casetmr._id}}" data-attribute="{{key}}"> <li class="item flexrow" data-item-id="{{casetmr._id}}" data-attribute="{{key}}">
<img class="sheet-competence-img" src="{{casetmr.img}}" />
<span class="display-label"><a data-item-id="{{casetmr._id}}">{{casetmr.name}}</a></span> <span class="display-label"><a data-item-id="{{casetmr._id}}">{{casetmr.name}}</a></span>
<span>{{casetmr.system.coord}} - {{caseTmr-label casetmr.system.coord}}</span> <span>{{casetmr.system.coord}} - {{caseTmr-label casetmr.system.coord}}</span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@@ -666,79 +650,10 @@
{{!-- Equipment Tab --}} {{!-- Equipment Tab --}}
<div class="tab items" data-group="primary" data-tab="items"> <div class="tab items" data-group="primary" data-tab="items">
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html" monnaie=monnaie}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html"}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-animaux.html"}}
<span class="item-name"><h4>Equipement porté</h4></span> {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-suivants.html"}}
<div> {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-vehicules.html"}}
<span class="item-name">Encombrement total/max : {{numberFormat calc.encTotal decimals=2}} / {{data.attributs.encombrement.value}} <b>{{calc.surEncombrementMessage}}</b></span> -
<span class="item-name">Estimation de l'équipement : {{numberFormat calc.prixTotalEquipement decimals=2}} Sols</span>
</div>
<div>
<span class="item-name"><a class="creer-un-objet">Créer un objet</a></span>
{{#if options.isGM}}
<span class="item-name"> - <a id="nettoyer-conteneurs">Vider tout les conteneurs</a></span>
{{/if}}
</div>
<ul class="item-list alterne-list">
<li class="competence-header flexrow">
<img class="sheet-competence-img" src="{{img}}" title="Equipement"/>
<span class="competence-title flex-grow">Nom</span>
<span class="competence-title">Q.</span>
<span class="competence-title">Enc.</span>
<span class="competence-title flex-grow">Equiper/Editer/Suppr.</span>
</li>
{{#each objets as |item id|}}
{{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}}
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-conteneur.html" item=item }}
{{/if}}
{{/unless}}
{{/each}}
{{#each conteneurs as |conteneur id|}}
{{buildConteneur this}}
{{/each}}
</ul>
<span class="item-name"><h4>Compagnons animaux</h4></span>
<ul class="item-list alterne-list">
{{#each subacteurs.montures as |monture id|}}
<li class="item flexrow list-item" data-actor-id="{{monture.id}}">
<img class="sheet-competence-img" src="{{monture.img}}" title="{{monture.name}}"/>
<span class="competence-title subacteur-label"><a>{{monture.name}}</a></span>
<div class="item-controls flex-shrink">
<a class="item-control subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
<span class="item-name"><h4>Véhicules</h4></span>
<ul class="item-list alterne-list">
{{#each subacteurs.vehicules as |vehicule id|}}
<li class="item flexrow list-item" data-actor-id="{{vehicule.id}}">
<img class="sheet-competence-img" src="{{vehicule.img}}" title="{{vehicule.name}}"/>
<span class="competence-title subacteur-label"><a>{{vehicule.name}}</a></span>
<span class="competence-title">{{vehicule.categorie}}</span>
<span class="competence-title">{{vehicule.structure}}</span>
<div class="item-controls flex-shrink">
<a class="item-control subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
<span class="item-name"><h4>Suivants</h4></span>
<ul class="item-list alterne-list">
{{#each subacteurs.suivants as |suivant id|}}
<li class="item flexrow list-item" data-actor-id="{{suivant.id}}">
<img class="sheet-competence-img" src="{{suivant.img}}" title="{{suivant.name}}"/>
<span class="competence-title subacteur-label"><a>{{suivant.name}}</a></span>
<div class="item-controls flex-shrink">
<a class="item-control subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div> </div>
@@ -747,50 +662,50 @@
<article class="flexrow"> <article class="flexrow">
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label for="data.race">Race :</label> <label for="system.race">Race :</label>
<input class="flex-grow" type="text" name="data.race" value="{{data.race}}" data-dtype="String"/> <input class="flex-grow" type="text" name="system.race" value="{{system.race}}" data-dtype="String"/>
</li> </li>
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label for="data.sexe">Sexe :</label> <label for="system.sexe">Sexe :</label>
<input class="flex-grow" type="text" name="data.sexe" value="{{data.sexe}}" data-dtype="String"/> <input class="flex-grow" type="text" name="system.sexe" value="{{system.sexe}}" data-dtype="String"/>
</li> </li>
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label for="data.age">Age :</label> <label for="system.age">Age :</label>
<input class="flex-grow" type="text" name="data.age" value="{{data.age}}" data-dtype="String"/> <input class="flex-grow" type="text" name="system.age" value="{{system.age}}" data-dtype="String"/>
</li> </li>
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label for="data.poids">Poids :</label> <label for="system.poids">Poids :</label>
<input class="flex-grow" type="text" name="data.poids" value="{{data.poids}}" data-dtype="String"/> <input class="flex-grow" type="text" name="system.poids" value="{{system.poids}}" data-dtype="String"/>
</li> </li>
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label for="data.taille">Taille :</label> <label for="system.taille">Taille :</label>
<input class="flex-grow" type="text" name="data.taille" value="{{data.taille}}" data-dtype="String"/> <input class="flex-grow" type="text" name="system.taille" value="{{system.taille}}" data-dtype="String"/>
</li> </li>
</ul> </ul>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label for="data.main">Main directrice :</label> <label for="system.main">Main directrice :</label>
<input type="text" name="data.main" value="{{data.main}}" data-dtype="String"/> <input type="text" name="system.main" value="{{system.main}}" data-dtype="String"/>
</li> </li>
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label for="data.heure">Heure de naissance :</label> <label for="system.heure">Heure de naissance :</label>
<select type="text" name="data.heure" value="{{data.heure}}" data-dtype="String"> <select type="text" name="system.heure" value="{{system.heure}}" data-dtype="String">
{{#select data.heure}} {{#select system.heure}}
{{>"systems/foundryvtt-reve-de-dragon/templates/heures-select-option.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/heures-select-option.html"}}
{{/select}} {{/select}}
</select> </select>
</li> </li>
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label>Beauté :</label> <label>Beauté :</label>
<input type="text" value="{{data.beaute}}" data-dtype="String" disabled/> <input type="text" value="{{system.beaute}}" data-dtype="String" disabled/>
</li> </li>
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label for="data.cheveux">Cheveux :</label> <label for="system.cheveux">Cheveux :</label>
<input class="flex-grow" type="text" name="data.cheveux" value="{{data.cheveux}}" data-dtype="String"/> <input class="flex-grow" type="text" name="system.cheveux" value="{{system.cheveux}}" data-dtype="String"/>
</li> </li>
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label for="data.yeux">Yeux :</label> <label for="system.yeux">Yeux :</label>
<input class="flex-grow" type="text" name="data.yeux" value="{{data.yeux}}" data-dtype="String"/> <input class="flex-grow" type="text" name="system.yeux" value="{{system.yeux}}" data-dtype="String"/>
</li> </li>
</ul> </ul>
</article> </article>
@@ -798,16 +713,16 @@
<article class="flexcol"> <article class="flexcol">
<h3>Biographie : </h3> <h3>Biographie : </h3>
<div class="form-group editor"> <div class="form-group editor">
{{editor data.biographie target="system.biographie" button=true owner=owner editable=editable}} {{editor system.biographie target="system.biographie" button=true owner=owner editable=editable}}
</div> </div>
<h3>Notes : </h3> <h3>Notes : </h3>
<div class="form-group editor"> <div class="form-group editor">
{{editor data.notes target="system.notes" button=true owner=owner editable=editable}} {{editor system.notes target="system.notes" button=true owner=owner editable=editable}}
</div> </div>
<h3>Journal d'Experience</h3> <h3>Journal d'Experience</h3>
<div class="form-group editor"> <div class="form-group editor">
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each data.experiencelog as |xp key|}} {{#each system.experiencelog as |xp key|}}
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<label class="flex-shrink">{{xp.mode}} </label> <label class="flex-shrink">{{xp.mode}} </label>
<label class="flex-grow">{{xp.valeur}} {{xp.raison}} </label> <label class="flex-grow">{{xp.valeur}} {{xp.raison}} </label>

View File

@@ -25,41 +25,41 @@
<div class="grid grid-2col"> <div class="grid grid-2col">
<div class="flex-group-left flexcol"> <div class="flex-group-left flexcol">
<ol class="carac-list alterne-list"> <ol class="carac-list alterne-list">
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label flexrow" name="categorie">Catégorie</span> <span class="carac-label flexrow" name="categorie">Catégorie</span>
<select name="data.categorie" class="categorie" data-dtype="String"> <select name="system.categorie" class="categorie" data-dtype="String">
{{#select data.categorie}} {{#select system.categorie}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-vehicule.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-vehicule.html"}}
{{/select}} {{/select}}
</select> </select>
</li> </li>
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label flexrow" name="categorie">Résistance</span> <span class="carac-label flexrow" name="categorie">Résistance</span>
<input class="competence-value flexrow" type="text" name="data.resistance" value="{{data.resistance}}" data-dtype="Number" /> <input class="competence-value flexrow" type="text" name="system.resistance" value="{{system.resistance}}" data-dtype="Number" />
</li> </li>
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label flexrow" name="categorie">Structure</span> <span class="carac-label flexrow" name="categorie">Structure</span>
<input class="competence-value flexrow" type="text" name="data.structure" value="{{data.structure}}" data-dtype="Number" /> <input class="competence-value flexrow" type="text" name="system.structure" value="{{system.structure}}" data-dtype="Number" />
</li> </li>
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label flexrow" name="categorie">Vitesse</span> <span class="carac-label flexrow" name="categorie">Vitesse</span>
<input class="competence-value flexrow" type="text" name="data.vitesse" value="{{data.vitesse}}" data-dtype="String" /> <input class="competence-value flexrow" type="text" name="system.vitesse" value="{{system.vitesse}}" data-dtype="String" />
</li> </li>
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label flexrow" name="categorie">Bonus</span> <span class="carac-label flexrow" name="categorie">Bonus</span>
<input class="competence-value flexrow" type="text" name="data.bonus" value="{{data.bonus}}" data-dtype="String" /> <input class="competence-value flexrow" type="text" name="system.bonus" value="{{system.bonus}}" data-dtype="String" />
</li> </li>
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label flexrow" name="categorie">Manoeuvrabilité</span> <span class="carac-label flexrow" name="categorie">Manoeuvrabilité</span>
<input class="competence-value flexrow" type="text" name="data.manoeuvrabilite" value="{{data.manoeuvrabilite}}" data-dtype="String" /> <input class="competence-value flexrow" type="text" name="system.manoeuvrabilite" value="{{system.manoeuvrabilite}}" data-dtype="String" />
</li> </li>
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label flexrow" name="categorie">Equipage</span> <span class="carac-label flexrow" name="categorie">Equipage</span>
<input class="competence-value flexrow" type="text" name="data.equipage" value="{{data.equipage}}" data-dtype="Number" /> <input class="competence-value flexrow" type="text" name="system.equipage" value="{{system.equipage}}" data-dtype="Number" />
</li> </li>
<li class="competence flexrow list-item" data-attribute="{{key}}"> <li class="caracteristique flexrow list-item" data-attribute="{{key}}">
<span class="carac-label flexrow" name="categorie">Capacité d'Encombrement</span> <span class="carac-label flexrow" name="categorie">Capacité d'Encombrement</span>
<input class="competence-value flexrow" type="text" name="data.capacite_encombrement" value="{{data.capacite_encombrement}}" data-dtype="Number" /> <input class="competence-value flexrow" type="text" name="system.capacite_encombrement" value="{{system.capacite_encombrement}}" data-dtype="Number" />
</li> </li>
</ol> </ol>
</div> </div>
@@ -69,51 +69,13 @@
{{!-- Equipment Tab --}} {{!-- Equipment Tab --}}
<div class="tab items" data-group="primary" data-tab="items"> <div class="tab items" data-group="primary" data-tab="items">
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire-monnaie.html" monnaie=monnaie}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-sheet-inventaire.html"}}
<span class="item-name"><h4>Equipement chargé</h4></span>
<span class="item-name">Encombrement total/max : {{numberFormat calc.encTotal decimals=2}} / {{data.capacite_encombrement}} <b>{{calc.surEncombrementMessage}}</b></span> -
<span class="item-name"><a class="creer-un-objet">Créer un objet</a></span>
{{#if options.isGM}}
<span class="item-name"> - <a id="nettoyer-conteneurs">Vider tout les conteneurs</a></span>
{{/if}}
<ul class="item-list alterne-list">
<li class="competence-header flexrow">
<img class="sheet-competence-img" src="{{img}}" title="Equipement"/>
<span class="competence-title competence-label flex-grow">Nom</span>
<span class="competence-title competence-label">Q.</span>
<span class="competence-title competence-value">Enc.</span>
<span class="competence-title competence-value">Equiper/Editer/Suppr.</span>
</li>
{{#each objets as |item id|}}
{{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}}
<li class="item flexrow list-item" data-item-id="{{item._id}}">
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
<span class="item-name flex-grow">{{item.name}}</span>
<span class="item-quantite">{{item.data.quantite}}</span>
<span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span>
<div class="item-controls">
<a class="item-control item-equip" title="Equiper">{{#if item.data.equipe}}<i class="fas fa-circle"></i>{{else}}<i class="fas fa-genderless"></i>{{/if}}</a>
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/if}}
{{/unless}}
{{/each}}
{{#each conteneurs as |conteneur id|}}
{{buildConteneur this}}
{{/each}}
</ul>
</div>
{{!-- Biography Tab --}} {{!-- Biography Tab --}}
<div class="tab description" data-group="primary" data-tab="description"> <div class="tab description" data-group="primary" data-tab="description">
<div class="form-group editor"> <div class="form-group editor">
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}} {{editor content=system.description target="system.description" button=true owner=owner editable=editable}}
</div> </div>
{{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor-sheet-editor-notes-mj.html"}}
</div> </div>

View File

@@ -34,7 +34,7 @@
</select> </select>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">Minutes</label> <label for="minutesRelative">Minutes</label>
<select name="minutesRelative" id="minutesRelative" data-dtype="String"> <select name="minutesRelative" id="minutesRelative" data-dtype="String">
{{#select minutesRelative}} {{#select minutesRelative}}
{{#each minutesOptions as |key|}} {{#each minutesOptions as |key|}}

View File

@@ -6,4 +6,4 @@
{{#if vendeur}}à {{vendeur.name}}{{/if}}: {{#if vendeur}}à {{vendeur.name}}{{/if}}:
{{quantiteTotal}} {{item.name}} pour {{prixTotal}} sols. {{quantiteTotal}} {{item.name}} pour {{prixTotal}} sols.
</p> </p>
{{> "systems/foundryvtt-reve-de-dragon/templates/chat-description.html" item.data}} {{> "systems/foundryvtt-reve-de-dragon/templates/chat-description.html" item.system}}

View File

@@ -1,16 +1,16 @@
<img class="chat-icon" src="{{img}}" alt="potion de repos" /> <img class="chat-icon" src="{{img}}" alt="potion de repos" />
<h4> <h4>
{{alias}} a bu une <strong>{{name}}{{#if data.magique}} enchantée{{/if}}</strong> {{alias}} a bu une <strong>{{name}}{{#if system.magique}} enchantée{{/if}}</strong>
</h4> </h4>
<hr> <hr>
<div> <div>
{{#if data.magique}} {{#if system.magique}}
Le Jet de Résistance est {{#if rolled.isSuccess}}réussi{{else}}échoué{{/if}}. Le Jet de Résistance est {{#if rolled.isSuccess}}réussi{{else}}échoué{{/if}}.
{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}} {{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
{{/if}} {{/if}}
<br>Les effets de la potions sont à gérer manuellement, en fonction de sa nature <br>Les effets de la potions sont à gérer manuellement, en fonction de sa nature
{{#if data.magique}} {{#if system.magique}}
{{#if rolled.isEchec}}et de son enchantement ({{data.pr}} Points de Rêve) {{#if rolled.isEchec}}et de son enchantement ({{system.pr}} Points de Rêve)
{{else}}son enchantement n'a pas d'effet {{else}}son enchantement n'a pas d'effet
{{/if}} {{/if}}
{{/if}}. {{/if}}.

View File

@@ -1,27 +1,27 @@
<img class="chat-icon" src="{{img}}" alt="potion de repos" /> <img class="chat-icon" src="{{img}}" alt="potion de repos" />
<h4> <h4>
{{alias}} a bu une <strong>{{name}}{{#if data.magique}} enchantée{{/if}}</strong> {{alias}} a bu une <strong>{{name}}{{#if system.magique}} enchantée de puissance {{system.puissance}}{{/if}}</strong>.
</h4> </h4>
<hr> <hr>
<div> <div>
{{#if data.magique}} {{#if system.magique}}
Le Jet de Résistance est {{#if rolled.isSuccess}}réussi{{else}}échoué{{/if}}. Le Jet de Résistance est {{#if rolled.isSuccess}}réussi{{else}}échoué{{/if}}.
{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}} {{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
{{#if rolled.isEchec}} {{#if rolled.isEchec}}
<br>La potion fait effet ! <br>La potion fait effet !
{{alias}} a perdu 1 point de rêve et s'endort pour {{guerisonDureeValue}} {{guerisonDureeUnite}} et {{alias}} a perdu 1 point de rêve et s'endort pour {{guerisonDureeValue}} {{guerisonDureeUnite}} et
se récupère {{caseFatigueReel}} cases de fatigue.<br> se récupère {{caseFatigueReel}} cases de fatigue.<br>
{{#if data.reposalchimique}} {{#if system.reposalchimique}}
De plus, la potion étant alchimique, {{alias}} est en aphasie pendant cette durée. De plus, la potion étant alchimique, {{alias}} est en aphasie pendant cette durée.
{{#if aphasiePermanente}} {{#if aphasiePermanente}}
Malheureusement, l'aphasie est permanente tant que {{alias}} ne réussit pas un jet de VOLONTE à 0 à Chateau Dormant (le moral compte). Malheureusement, l'aphasie est permanente tant que {{alias}} ne réussit pas un jet de VOLONTE à 0 à Chateau Dormant (le moral compte).
{{/if}} {{/if}}
{{/if}} {{/if}}
{{else}} {{else}}
<br>La potion ne fait pas effet ! Elle vous octroie tout de même un bonus de {{data.herbebonus}} segments de fatigue récupérés en plus à la fin de Chateau Dormant (à gérer manuellement). <br>La potion ne fait pas effet ! Elle vous octroie tout de même un bonus de {{system.herbebonus}} segments de fatigue récupérés en plus à la fin de Chateau Dormant (à gérer manuellement).
{{/if}} {{/if}}
{{else}} {{else}}
Une fois consommée (vers fin Lyre), elle vous octroie un bonus de {{data.herbebonus}} segments de fatigue récupérés en plus à la fin de Chateau Dormant (à gérer manuellement). Une fois consommée (vers fin Lyre), elle vous octroie un bonus de {{system.herbebonus}} segments de fatigue récupérés en plus à la fin de Chateau Dormant (à gérer manuellement).
{{/if}} {{/if}}
<br>La potion a été supprimée de l'équipement. <br>La potion a été supprimée de l'équipement.
</div> </div>

View File

@@ -1,10 +1,10 @@
<img class="chat-icon" src="{{img}}" alt="potion de soin" /> <img class="chat-icon" src="{{img}}" alt="potion de soin" />
<h4> <h4>
{{alias}} a bu une <strong>{{name}}{{#if data.magique}} enchantée{{/if}}</strong> {{alias}} a bu une <strong>{{name}}{{#if system.magique}} enchantée de {{system.puissance}} points de guérison{{/if}}</strong>
</h4> </h4>
<hr> <hr>
<div> <div>
{{#if data.magique}} {{#if system.magique}}
Le Jet de Résistance est {{#if rolled.isSuccess}}réussi{{else}}échoué{{/if}}. Le Jet de Résistance est {{#if rolled.isSuccess}}réussi{{else}}échoué{{/if}}.
{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}} {{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
{{#if rolled.isEchec}} {{#if rolled.isEchec}}
@@ -16,10 +16,10 @@
{{/each}} {{/each}}
</ul> </ul>
{{else}} {{else}}
<br>La potion ne fait pas effet ! Lors de votre prochain jet de récupération à Chateau Dormant, vous bénéficierez d'un bonus de {{data.herbebonus}} (appliqué automatiquement). <br>La potion ne fait pas effet ! Lors de votre prochain jet de récupération à Chateau Dormant, vous bénéficierez d'un bonus de {{system.herbebonus}} (appliqué automatiquement).
{{/if}} {{/if}}
{{else}} {{else}}
Lors de votre prochain jet de récupération à Chateau Dormant, vous bénéficierez d'un bonus de {{data.herbebonus}} (appliqué automatiquement). Lors de votre prochain jet de récupération à Chateau Dormant, vous bénéficierez d'un bonus de {{system.herbebonus}} (appliqué automatiquement).
{{/if}} {{/if}}
<br>La potion a été supprimée de l'équipement. <br>La potion a été supprimée de l'équipement.
</div> </div>

View File

@@ -8,7 +8,7 @@
</a> </a>
<br> <br>
{{/unless}} {{/unless}}
{{#if (gt attacker.data.compteurs.destinee.value 0)}} {{#if (gt attacker.system.compteurs.destinee.value 0)}}
<a class='chat-card-button' id='appel-destinee-attaque' data-attackerId='{{attackerId}}' <a class='chat-card-button' id='appel-destinee-attaque' data-attackerId='{{attackerId}}'
data-defenderTokenId='{{defenderTokenId}}'>Utiliser la destinée</a> data-defenderTokenId='{{defenderTokenId}}'>Utiliser la destinée</a>
</a> </a>

View File

@@ -26,7 +26,7 @@
<br> <br>
{{/if}} {{/if}}
{{#if (eq defender.type 'personnage')}} {{#if (eq defender.type 'personnage')}}
{{#if (gt defender.data.compteurs.destinee.value 0)}} {{#if (gt defender.system.compteurs.destinee.value 0)}}
<a class='chat-card-button' id='appel-destinee-defense' data-attackerId='{{attackerId}}' <a class='chat-card-button' id='appel-destinee-defense' data-attackerId='{{attackerId}}'
data-defenderTokenId='{{defenderTokenId}}'>Utiliser la destinée</a> data-defenderTokenId='{{defenderTokenId}}'>Utiliser la destinée</a>
</a> </a>
@@ -38,22 +38,23 @@
{{#each armes as |arme key|}} {{#each armes as |arme key|}}
<a class='chat-card-button' id='parer-button' data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderTokenId}}' <a class='chat-card-button' id='parer-button' data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderTokenId}}'
data-armeid='{{arme._id}}'> data-armeid='{{arme._id}}'>
Parer avec {{arme.name}} à {{../diffLibre }}{{#if arme.data.nbUsage}} (Utilisations : {{arme.data.nbUsage}}){{/if}} Parer avec {{arme.name}} à {{../diffLibre }}{{#if arme.system.nbUsage}} (Utilisations : {{arme.system.nbUsage}}){{/if}}
</a> </a>
<br> <br>
{{/each}} {{/each}}
{{#if mainsNues}} {{#if mainsNues}}
<a class='chat-card-button' id='parer-button' data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderTokenId}}' <a class='chat-card-button' id='parer-button' data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderTokenId}}'
data-armeid='{{arme._id}}' data-competence='{{arme.data.competence}}'> data-armeid='{{arme._id}}' data-competence='{{arme.system.competence}}'>
Parer à mains nues à {{diffLibre}}{{#if arme.data.nbUsage}} (Utilisations : {{arme.data.nbUsage}}){{/if}} Parer à mains nues à {{diffLibre}}{{#if arme.system.nbUsage}} (Utilisations : {{arme.system.nbUsage}}){{/if}}
</a> </a>
<br> <br>
{{/if}} {{/if}}
{{#if (ne attaqueCategorie 'tir')}} {{#if (ne attaqueCategorie 'tir')}}
{{#each esquives as |esq key|}} {{#each esquives as |esquive key|}}
<a class='chat-card-button' id='esquiver-button' data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderTokenId}}' <a class='chat-card-button' id='esquiver-button' data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderTokenId}}'
data-compid='{{esq._id}}' data-competence='{{esq.name}}'> data-compid='{{esquive._id}}' data-competence='{{esquive.name}}'>
{{esq.name}} à {{../diffLibre}} {{#if esq.usage}} (Utilisations : {{esq.usage}}){{/if}} {{log 'esquive' esquive}}
{{esquive.name}} à {{../diffLibre}} {{#if esquive.system.nbUsage}} (Utilisations : {{esquive.system.nbUsage}}){{/if}}
</a> </a>
<br> <br>
{{/each}} {{/each}}

View File

@@ -2,7 +2,7 @@
{{alias}} tente d'interpréter {{oeuvre.name}} (niveau {{oeuvre.system.niveau}}) {{alias}} tente d'interpréter {{oeuvre.name}} (niveau {{oeuvre.system.niveau}})
</h4> </h4>
<br>{{upperFirst oeuvre.data.default_carac}} / {{oeuvre.data.competence}} <br>{{upperFirst oeuvre.system.default_carac}} / {{oeuvre.system.competence}}
{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}} {{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
<hr> <hr>
<div> <div>

View File

@@ -6,7 +6,7 @@
<hr> <hr>
<span> <span>
<img class="chat-icon" src="{{platCuisine.img}}" alt="{{platCuisine.name}}" /> <img class="chat-icon" src="{{platCuisine.img}}" alt="{{platCuisine.name}}" />
<br>{{alias}} a préparé {{platCuisine.data.quantite}} portions de {{platCuisine.name}} <br>{{alias}} a préparé {{platCuisine.system.quantite}} portions de {{platCuisine.name}}
{{~#if ajouterEquipement}}, qui ont été ajoutées à son équipement{{/if}}. {{~#if ajouterEquipement}}, qui ont été ajoutées à son équipement{{/if}}.
{{#if rolled.isSuccess}} {{#if rolled.isSuccess}}
Il a réussi la recette, pour un plat de qualité {{qualiteFinale}} Il a réussi la recette, pour un plat de qualité {{qualiteFinale}}

View File

@@ -15,7 +15,7 @@
{{alias}} ne parvient pas à vaincre le Rêve de Dragon, et prend un violent coup de queue. {{alias}} ne parvient pas à vaincre le Rêve de Dragon, et prend un violent coup de queue.
Il subit {{#if rolled.isETotal}}deux queues{{else}}une queue{{/if}} de dragon! Il subit {{#if rolled.isETotal}}deux queues{{else}}une queue{{/if}} de dragon!
{{#each queues as | queue key|}} {{#each queues as | queue key|}}
<br>{{queue.name}}: {{{queue.data.description}}} <br>{{queue.name}}: {{{queue.system.description}}}
{{/each}} {{/each}}
{{/if}} {{/if}}
</span> </span>

View File

@@ -1,10 +1,10 @@
<img class="chat-icon" src="{{competence.img}}" alt="{{competence.name}}" /> <img class="chat-icon" src="{{competence.img}}" alt="{{competence.name}}" />
<h4> <h4>
{{alias}} {{#if isSortReserve}}met en réserve{{else}}lance{{/if}} {{alias}} {{#if isSortReserve}}met en réserve{{else}}lance{{/if}}
le {{#if selectedSort.data.isrituel}}rituel{{else}}sort{{/if}} le {{#if selectedSort.system.isrituel}}rituel{{else}}sort{{/if}}
{{selectedSort.name}} {{selectedSort.name}}
</h4> </h4>
<div>Pour {{selectedSort.data.ptreve_reel}} point{{~#if (gt selectedSort.data.ptreve_reel 1)}}s{{/if}} de rêve en {{tmr.label}} ({{tmr.coord}}). <div>Pour {{selectedSort.system.ptreve_reel}} point{{~#if (gt selectedSort.system.ptreve_reel 1)}}s{{/if}} de rêve en {{tmr.label}} ({{tmr.coord}}).
{{#if show.reveInsuffisant}} {{#if show.reveInsuffisant}}
<span>Pas assez de rêve!</span> <span>Pas assez de rêve!</span>
{{/if}} {{/if}}

View File

@@ -3,5 +3,5 @@
</h4> </h4>
<p>Pour le lire ce signe draconique, {{alias}} doit se rendre dans les <p>Pour le lire ce signe draconique, {{alias}} doit se rendre dans les
Terres Médianes du Rêve et trouvez une case de résonnance. Terres Médianes du Rêve et trouvez une case de résonnance.
{{#if signe.data.ephemere}}C'est un signe éphémère, qui ne restera présent que pour {{signe.data.duree}}{{/if}} {{#if signe.system.ephemere}}C'est un signe éphémère, qui ne restera présent que pour {{signe.system.duree}}{{/if}}
</p> </p>

View File

@@ -8,45 +8,54 @@
</h4> </h4>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="signe.data.difficulte">Difficulte</label> <label for="signe.system.difficulte">Difficulte</label>
<input type="number" name="signe.data.difficulte" value="{{signe.data.difficulte}}" data-dtype="Number" /> <input type="number" name="signe.system.difficulte" value="{{signe.system.difficulte}}" data-dtype="Number" />
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="signe.data.valeur.norm">Expérience en sorts</label> <label for="signe.system.valeur.norm">Expérience en sorts</label>
<div class="flexrow"> <div class="flexrow">
<input class="signe-xp-sort" type="number" name="signe.data.valeur.norm" data-typereussite="norm" <input class="signe-xp-sort" type="number" name="signe.system.valeur.norm" data-typereussite="norm"
value="{{signe.data.valeur.norm}}" min="1" max="100" data-dtype="Number" /> value="{{signe.system.valeur.norm}}" min="1" max="100" data-dtype="Number" />
<span>Sign.</span> <span>Sign.</span>
<input class="signe-xp-sort" type="number" name="signe.data.valeur.sign" data-typereussite="sign" <input class="signe-xp-sort" type="number" name="signe.system.valeur.sign" data-typereussite="sign"
value="{{signe.data.valeur.sign}}" min="1" max="100" data-dtype="Number" /> value="{{signe.system.valeur.sign}}" min="1" max="100" data-dtype="Number" />
<span>Part.</span> <span>Part.</span>
<input class="signe-xp-sort" type="number" name="signe.data.valeur.part" data-typereussite="part" <input class="signe-xp-sort" type="number" name="signe.system.valeur.part" data-typereussite="part"
value="{{signe.data.valeur.part}}" min="1" max="100" data-dtype="Number" /> value="{{signe.system.valeur.part}}" min="1" max="100" data-dtype="Number" />
</div> </div>
</div> </div>
<div class="form-group flexrow"> <div class="form-group flexrow">
<label for="signe.data.ephemere">Ephémère</label> <label for="signe.system.ephemere">Ephémère</label>
<input class="flex-shrink" type="checkbox" name="signe.data.ephemere" {{#if signe.data.ephemere}}checked{{/if}} /> <input class="flex-shrink" type="checkbox" name="signe.system.ephemere" {{#if signe.system.ephemere}}checked{{/if}} />
<span> <span>
<input type="text" name="signe.data.duree" value="{{signe.data.duree}}" data-dtype="String" /> <input type="text" name="signe.system.duree" value="{{signe.system.duree}}" data-dtype="String" />
</span> </span>
</div> </div>
<hr>
<label>Terres médianes</label>
<div class="form-group"> <div class="form-group">
<label for="tmrs">Terres médianes</label> <div class="grid-select-type-tmr">
<select class="select-tmr" name="tmrs" id="tmrs" size="{{tmrs.length}}" multiple>
{{#each tmrs as |tmr key|}} {{#each tmrs as |tmr key|}}
<option value="{{tmr.name}}" {{#if tmr.selected}}selected{{/if}}>{{tmr.name}}</option> <label class="flexrow">
<input type="checkbox" data-dtype="Boolean" class="select-tmr"
data-tmr-name="{{tmr.name}}" {{#if tmr.selected}}checked{{/if}} />
{{tmr.name}}
</label>
{{/each}} {{/each}}
</select> </div>
</div> </div>
<hr>
<label for="actors">Haut-rêvants concernés</label>
<div class="form-group"> <div class="form-group">
<label for="actors">Haut-rêvants concernés</label> <div class="grid-select-actor">
<select class="select-actor" id="actors" size="7" multiple>
{{#each actors as |actor key|}} {{#each actors as |actor key|}}
<option value="{{actor.name}}" data-actor-id="{{actor._id}}" {{#if actor.selected}}selected{{/if}}>{{actor.name}}</option> <label class="flexrow">
<input type="checkbox" data-dtype="Boolean" class="select-actor"
data-actor-id="{{actor.id}}" {{#if actor.selected}}checked{{/if}} />
{{actor.name}}
</label>
{{/each}} {{/each}}
</select> </div>
</div> </div>
<hr>
</form> </form>

View File

@@ -1,6 +1,6 @@
<form class="skill-roll-dialog"> <form class="skill-roll-dialog">
<div class="form-group"> <div class="form-group">
<label>Fabriquer une potion de {{data.categorie}} de {{name}}</label> <label>Fabriquer une potion de {{system.categorie}} de {{name}}</label>
</div> </div>
<div class="form-group"> <div class="form-group">

View File

@@ -47,30 +47,30 @@
{{#if (eq item.type 'nourritureboisson')}} {{#if (eq item.type 'nourritureboisson')}}
<p> <p>
Si vous souhaitez {{#if item.data.boisson}}boire{{else}}manger{{/if}}: Si vous souhaitez {{#if item.system.boisson}}boire{{else}}manger{{/if}}:
</p> </p>
{{#if item.data.sust}} {{#if item.system.sust}}
<p>Cette {{#if item.data.boisson}}boisson{{else}}nourriture{{/if}} vous apportera <span <p>Cette {{#if item.system.boisson}}boisson{{else}}nourriture{{/if}} vous apportera <span
class="total-sust">{{totalSust}}</span> de sustantation.</p> class="total-sust">{{totalSust}}</span> de sustantation.</p>
{{/if}} {{/if}}
{{#if item.data.boisson}} {{#if item.system.boisson}}
<p>{{#if item.data.alcoolise}} <p>{{#if item.system.alcoolise}}
C'est une boisson alcoolisée de force {{item.data.force}}, vous effectuerez un jet d'éthylisme. C'est une boisson alcoolisée de force {{item.system.force}}, vous effectuerez un jet d'éthylisme.
{{/if}} {{/if}}
Cette boisson vous apportera <span class="total-desaltere">{{totalDesaltere}}</span> unités d'eau. Cette boisson vous apportera <span class="total-desaltere">{{totalDesaltere}}</span> unités d'eau.
</p> </p>
{{/if}} {{/if}}
{{#if (gt item.data.qualite 0)}} {{#if (gt item.system.qualite 0)}}
{{#if (gt item.data.qualite cuisine.data.niveau)}} {{#if (gt item.system.qualite cuisine.system.niveau)}}
<p>La qualité du plat est telle qu'un jet de Goût/Cuisine à {{numberFormat item.data.qualite decimals=0 sign=true}} <p>La qualité du plat est telle qu'un jet de Goût/Cuisine à {{numberFormat item.system.qualite decimals=0 sign=true}}
vous permettra un jet de moral heureux.</p> vous permettra un jet de moral heureux.</p>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#if (or (lt item.data.qualite 0) (lt item.data.exotisme 0))}} {{#if (or (lt item.system.qualite 0) (lt item.system.exotisme 0))}}
<p> <p>
Pour surmonter {{#if (lt item.data.qualite 0)}}le mauvais goût{{else}}l'exotisme{{/if}}, vous devez effectuer un jet de Volonté/Cuisine à {{numberFormat (min item.data.exotisme item.data.qualite) decimals=0 sign=true}}. Pour surmonter {{#if (lt item.system.qualite 0)}}le mauvais goût{{else}}l'exotisme{{/if}}, vous devez effectuer un jet de Volonté/Cuisine à {{numberFormat (min item.system.exotisme item.system.qualite) decimals=0 sign=true}}.
<br/> <br/>
<input class="attribute-value se-forcer" type="checkbox" name="se-forcer" {{#if choix.seForcer}}checked{{/if}}> <input class="attribute-value se-forcer" type="checkbox" name="se-forcer" {{#if choix.seForcer}}checked{{/if}}>
<label for="se-forcer">En cas d'échec, voulez-vous vous forcer à manger (et subir un jet de moral en situation malheureuse)?</label> <label for="se-forcer">En cas d'échec, voulez-vous vous forcer à manger (et subir un jet de moral en situation malheureuse)?</label>

View File

@@ -2,31 +2,31 @@
<img class="chat-icon" src="{{item.img}}" title="{{item.name}}" alt="{{item.name}}" /> <img class="chat-icon" src="{{item.img}}" title="{{item.name}}" alt="{{item.name}}" />
<h4>{{item.name}}</h4> <h4>{{item.name}}</h4>
<div class="flexrow"> <div class="flexrow">
<label class="flex-grow">Quantité à {{#if item.data.boisson}}boire{{else}}manger{{/if}}</label> <label class="flex-grow">Quantité à {{#if item.system.boisson}}boire{{else}}manger{{/if}}</label>
<input class="attribute-value consommer-doses flex-shrink" type="number" name="doses" value="{{choix.doses}}" <input class="attribute-value consommer-doses flex-shrink" type="number" name="doses" value="{{choix.doses}}"
min="0" max="{{item.data.quantite}}" data-dtype="Number" /> min="0" max="{{item.system.quantite}}" data-dtype="Number" />
</div> </div>
{{#if item.data.sust}} {{#if item.system.sust}}
<p>Cette {{#if item.data.boisson}}boisson{{else}}nourriture{{/if}} vous apportera <span <p>Cette {{#if item.system.boisson}}boisson{{else}}nourriture{{/if}} vous apportera <span
class="total-sust">{{totalSust}}</span> de sustantation.</p> class="total-sust">{{totalSust}}</span> de sustantation.</p>
{{/if}} {{/if}}
{{#if item.data.boisson}} {{#if item.system.boisson}}
<p>{{#if item.data.alcoolise}} <p>{{#if item.system.alcoolise}}
C'est une boisson alcoolisée de force {{item.data.force}}, vous effectuerez un jet d'éthylisme. C'est une boisson alcoolisée de force {{item.system.force}}, vous effectuerez un jet d'éthylisme.
{{/if}} {{/if}}
Cette boisson vous apportera <span class="total-desaltere">{{totalDesaltere}}</span> unités d'eau. Cette boisson vous apportera <span class="total-desaltere">{{totalDesaltere}}</span> unités d'eau.
</p> </p>
{{/if}} {{/if}}
{{#if (gt item.data.qualite 0)}} {{#if (gt item.system.qualite 0)}}
{{#if (gt item.data.qualite cuisine.data.niveau)}} {{#if (gt item.system.qualite cuisine.system.niveau)}}
<p>La qualité du plat est telle qu'un jet de Goût/Cuisine à {{numberFormat item.data.qualite decimals=0 sign=true}} <p>La qualité du plat est telle qu'un jet de Goût/Cuisine à {{numberFormat item.system.qualite decimals=0 sign=true}}
vous permettra un jet de moral heureux.</p> vous permettra un jet de moral heureux.</p>
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#if (or (lt item.data.qualite 0) (lt item.data.exotisme 0))}} {{#if (or (lt item.system.qualite 0) (lt item.system.exotisme 0))}}
<p> <p>
Pour surmonter {{#if (lt item.data.qualite 0)}}le mauvais goût{{else}}l'exotisme{{/if}}, vous devez effectuer un jet de Volonté/Cuisine à {{numberFormat (min item.data.exotisme item.data.qualite) decimals=0 sign=true}}. Pour surmonter {{#if (lt item.system.qualite 0)}}le mauvais goût{{else}}l'exotisme{{/if}}, vous devez effectuer un jet de Volonté/Cuisine à {{numberFormat (min item.system.exotisme item.system.qualite) decimals=0 sign=true}}.
<br/> <br/>
<input class="attribute-value se-forcer" type="checkbox" name="se-forcer" {{#if choix.seForcer}}checked{{/if}}> <input class="attribute-value se-forcer" type="checkbox" name="se-forcer" {{#if choix.seForcer}}checked{{/if}}>
<label for="se-forcer">En cas d'échec, voulez-vous vous forcer à manger (et subir un jet de moral en situation malheureuse)?</label> <label for="se-forcer">En cas d'échec, voulez-vous vous forcer à manger (et subir un jet de moral en situation malheureuse)?</label>

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