Compare commits

...

53 Commits

Author SHA1 Message Date
4afa313ffc Enable links in editor 2022-09-27 21:03:18 +02:00
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: public/foundryvtt-reve-de-dragon#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: public/foundryvtt-reve-de-dragon#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: public/foundryvtt-reve-de-dragon#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: public/foundryvtt-reve-de-dragon#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: public/foundryvtt-reve-de-dragon#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: public/foundryvtt-reve-de-dragon#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: public/foundryvtt-reve-de-dragon#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
93 changed files with 1723 additions and 1684 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

@@ -40,6 +40,9 @@ export class RdDActorEntiteSheet extends ActorSheet {
options: this.options, options: this.options,
owner: this.actor.isOwner, owner: this.actor.isOwner,
itemsByType: Misc.classify(this.actor.items.map(i => foundry.utils.deepClone(i))), itemsByType: Misc.classify(this.actor.items.map(i => foundry.utils.deepClone(i))),
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
notesmj: await TextEditor.enrichHTML(this.object.system.notesmj, {async: true}),
}; };
formData.options.isGM = game.user.isGM; formData.options.isGM = game.user.isGM;

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 {
@@ -51,6 +52,9 @@ export class RdDActorSheet extends ActorSheet {
limited: this.actor.limited, limited: this.actor.limited,
options: this.options, options: this.options,
owner: this.actor.isOwner, owner: this.actor.isOwner,
biographie: await TextEditor.enrichHTML(this.object.system.biographie, {async: true}),
notes: await TextEditor.enrichHTML(this.object.system.notes, {async: true}),
notesmj: await TextEditor.enrichHTML(this.object.system.notesmj, {async: true}),
itemsByType: Misc.classify(this.actor.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)
@@ -99,8 +103,7 @@ 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.system.reve.reserve.list,
rencontres: duplicate(formData.system.reve.rencontre.list), rencontres: duplicate(formData.system.reve.rencontre.list),
casesTmr: formData.itemsByType.casetmr, casesTmr: formData.itemsByType.casetmr,
cacheTMR: this.actor.isTMRCache() cacheTMR: this.actor.isTMRCache()
@@ -180,7 +183,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);
@@ -197,7 +201,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 => {
@@ -356,11 +364,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));

View File

@@ -41,6 +41,8 @@ export class RdDActorVehiculeSheet extends ActorSheet {
options: this.options, options: this.options,
owner: this.actor.isOwner, owner: this.actor.isOwner,
itemsByType: Misc.classify(this.actor.items.map(i => foundry.utils.deepClone(i))), itemsByType: Misc.classify(this.actor.items.map(i => foundry.utils.deepClone(i))),
description: await TextEditor.enrichHTML(this.object.system.biographie, {async: true}),
notesmj: await TextEditor.enrichHTML(this.object.system.notesmj, {async: true}),
}; };
RdDUtility.filterItemsPerTypeForSheet(formData); RdDUtility.filterItemsPerTypeForSheet(formData);
@@ -104,7 +106,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);

View File

@@ -17,7 +17,7 @@ import { RdDAudio } from "./rdd-audio.js";
import { RdDItemCompetence } from "./item-competence.js"; import { RdDItemCompetence } from "./item-competence.js";
import { RdDItemArme } from "./item-arme.js"; import { RdDItemArme } from "./item-arme.js";
import { RdDAlchimie } from "./rdd-alchimie.js"; import { RdDAlchimie } from "./rdd-alchimie.js";
import { StatusEffects } from "./status-effects.js"; import { STATUSES, StatusEffects } from "./status-effects.js";
import { RdDItemCompetenceCreature } from "./item-competencecreature.js"; import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
import { RdDItemSigneDraconique } from "./item-signedraconique.js"; import { RdDItemSigneDraconique } from "./item-signedraconique.js";
import { ReglesOptionelles } from "./regles-optionelles.js"; import { ReglesOptionelles } from "./regles-optionelles.js";
@@ -44,6 +44,7 @@ const POSSESSION_SANS_DRACONIC = {
} }
}; };
const PAS_DE_BLESSURE = { "active": false, "psdone": false, "scdone": false, "premiers_soins": 0, "soins_complets": 0, "jours": 0, "loc": "" };
/* -------------------------------------------- */ /* -------------------------------------------- */
/** /**
* Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system. * Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
@@ -52,8 +53,6 @@ const POSSESSION_SANS_DRACONIC = {
export class RdDActor extends Actor { export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
static init() { static init() {
Hooks.on("deleteActiveEffect", (effect, options, userId) => RdDActor.getParentActor(effect)?.onDeleteActiveEffect(effect, options));
Hooks.on("preUpdateItem", (item, change, options, id) => RdDActor.getParentActor(item)?.onPreUpdateItem(item, change, options, id)); Hooks.on("preUpdateItem", (item, change, options, id) => RdDActor.getParentActor(item)?.onPreUpdateItem(item, change, options, id));
Hooks.on("createItem", (item, options, id) => RdDActor.getParentActor(item)?.onCreateItem(item, options, id)); Hooks.on("createItem", (item, options, id) => RdDActor.getParentActor(item)?.onCreateItem(item, options, id));
Hooks.on("deleteItem", (item, options, id) => RdDActor.getParentActor(item)?.onDeleteItem(item, options, id)); Hooks.on("deleteItem", (item, options, id) => RdDActor.getParentActor(item)?.onDeleteItem(item, options, id));
@@ -199,8 +198,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async checkMonnaiePresence() { // Ajout opportuniste si les pièces n'existent pas. async checkMonnaiePresence() { // Ajout opportuniste si les pièces n'existent pas.
if (!this.items) return; // Sanity check during import if (!this.items) return; // Sanity check during import
let manquantes = Monnaie.monnaiesManquantes(this.itemTypes['monnaie']); let manquantes = Monnaie.monnaiesManquantes(this);
//console.log("Manque : ", manquantes);
if (manquantes.length > 0) { if (manquantes.length > 0) {
await this.createEmbeddedDocuments('Item', manquantes, { renderSheet: false }); await this.createEmbeddedDocuments('Item', manquantes, { renderSheet: false });
} }
@@ -419,23 +417,9 @@ export class RdDActor extends Actor {
} }
} }
/* -------------------------------------------- */
async deleteSortReserve(sortReserve) {
let reserve = duplicate(this.system.reve.reserve);
let tmr = TMRUtility.getTMR(sortReserve.coord);
let index = reserve.list.findIndex(tmr.type == 'fleuve'
? sort => (TMRUtility.getTMR(sort.coord).type == 'fleuve' && sort.sort.name == sortReserve.sort.name)
: sort => (sort.coord == sortReserve.coord && sort.sort.name == sortReserve.sort.name)
);
if (index >= 0) {
reserve.list.splice(index, 1);
await this.update({ "system.reve.reserve": reserve });
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getSurprise(isCombat = undefined) { getSurprise(isCombat = undefined) {
let niveauSurprise = this.getActiveEffects() let niveauSurprise = this.getEffects()
.map(effect => StatusEffects.valeurSurprise(effect, isCombat)) .map(effect => StatusEffects.valeurSurprise(effect, isCombat))
.reduce(Misc.sum(), 0); .reduce(Misc.sum(), 0);
if (niveauSurprise > 1) { if (niveauSurprise > 1) {
@@ -562,7 +546,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
_supprimerBlessure(blessure) { _supprimerBlessure(blessure) {
mergeObject(blessure, { "active": false, "psdone": false, "scdone": false, "premiers_soins": 0, "soins_complets": 0, "jours": 0, "loc": "" }); mergeObject(blessure, PAS_DE_BLESSURE);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -605,39 +589,30 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async remiseANeuf() { async remiseANeuf() {
let message = {
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
content: "Remise à neuf de " + this.name
};
if (this.isEntite([ENTITE_NONINCARNE])) { if (this.isEntite([ENTITE_NONINCARNE])) {
return; return;
} }
if (this.isEntite([ENTITE_INCARNE, ENTITE_BLURETTE])) { ChatMessage.create({
await this.santeIncDec("endurance", this.system.sante.endurance.max - this.system.sante.endurance.value); whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
} content: 'Remise à neuf de ' + this.name
else { });
const updates = {
'system.sante.endurance.value' : this.system.sante.endurance.max
};
if (!this.isEntite([ENTITE_INCARNE, ENTITE_BLURETTE])) {
if (this.system.blessures) { if (this.system.blessures) {
const blessures = duplicate(this.system.blessures); updates['system.blessures.legeres.liste'] = [PAS_DE_BLESSURE, PAS_DE_BLESSURE, PAS_DE_BLESSURE, PAS_DE_BLESSURE, PAS_DE_BLESSURE];
for (let listeBlessures of [blessures.legeres.liste, blessures.graves.liste, blessures.critiques.liste]) { updates['system.blessures.graves.liste'] = [PAS_DE_BLESSURE, PAS_DE_BLESSURE];
for (let blessure of listeBlessures) { updates['system.blessures.critiques.liste'] = [PAS_DE_BLESSURE];
this._supprimerBlessure(blessure);
}
}
await this.update({ "system.blessures": blessures });
} }
updates['system.sante.vie.value'] = this.system.sante.vie.max;
updates['system.sante.fatigue.value'] = 0;
if (this.isPersonnage()) { if (this.isPersonnage()) {
await this.setEthylisme(1); updates['system.compteurs.ethylisme'] = { value:1, nb_doses: 0, jet_moral: false};
}
await this.santeIncDec("vie", this.system.sante.vie.max - this.system.sante.vie.value);
await this.santeIncDec("endurance", this.system.sante.endurance.max - this.system.sante.endurance.value);
if (ReglesOptionelles.isUsing("appliquer-fatigue") && this.system.sante.fatigue) {
await this.update({ "system.sante.fatigue.value": 0 });
} }
} }
ChatMessage.create(message); await this.update(updates);
this.sheet.render(true); await this.removeEffects(e => e.flags.core.statusId !== STATUSES.StatusDemiReve);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -849,10 +824,13 @@ export class RdDActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async sortMisEnReserve(rollData, sort) { async sortMisEnReserve(sort, draconic, coord, ptreve) {
let reserve = duplicate(this.system.reve.reserve.list); await this.createEmbeddedDocuments("Item", [{
reserve.push({ coord: rollData.tmr.coord, sort: sort, draconic: duplicate(rollData.competence) }); type: 'sortreserve',
await this.update({ "system.reve.reserve.list": reserve }); name: sort.name,
img: sort.img,
system: { sortid: sort.id, draconic: (draconic ?? sort.system.draconic), ptreve: ptreve, coord: coord, heurecible: 'Vaisseau' } }],
{ renderSheet: false});
this.currentTMR.updateTokens(); this.currentTMR.updateTokens();
} }
@@ -929,26 +907,27 @@ export class RdDActor extends Actor {
if (!competence) { if (!competence) {
return; return;
} }
const stress = this.system.compteurs.experience.value;
const niveau = Number(competence.system.niveau); const niveau = Number(competence.system.niveau);
const stressTransforme = this.system.compteurs.experience.value; const xpSuivant = RdDItemCompetence.getCompetenceNextXp(niveau);
const xpRequis = RdDItemCompetence.getCompetenceNextXp(niveau) - competence.system.xp; const xpRequis = xpSuivant - competence.system.xp;
if (stressTransforme <= 0 || niveau >= competence.system.niveau_archetype || xpRequis <= 0) { if (stress <= 0 || niveau >= competence.system.niveau_archetype) {
ui.notifications.info(`La compétence ne peut pas augmenter! ui.notifications.info(`La compétence ne peut pas augmenter!
stress disponible: ${stressTransforme} stress disponible: ${stress}
expérience requise: ${xpRequis} expérience requise: ${xpRequis}
niveau : ${niveau} niveau : ${niveau}
archétype : ${competence.system.niveau_archetype}`); archétype : ${competence.system.niveau_archetype}`);
return; return;
} }
const xpUtilise = Math.min(stressTransforme, xpRequis); const xpUtilise = Math.max(0, Math.min(stress, xpRequis));
const gainNiveau = xpUtilise >= xpRequis ? 1 : 0; const gainNiveau = (xpUtilise >= xpRequis || xpRequis <=0) ? 1 : 0;
const nouveauNiveau = niveau + gainNiveau; const nouveauNiveau = niveau + gainNiveau;
const nouveauXp = gainNiveau > 0 ? Math.max(competence.system.xp - xpRequis, 0) : (competence.system.xp + xpUtilise); const nouveauXp = gainNiveau > 0 ? Math.max(competence.system.xp - xpSuivant, 0) : (competence.system.xp + xpUtilise);
await competence.update({ await competence.update({
"system.xp": nouveauXp, "system.xp": nouveauXp,
"system.niveau": nouveauNiveau, "system.niveau": nouveauNiveau,
}); });
const stressTransformeRestant = Math.max(0, stressTransforme - xpUtilise); const stressTransformeRestant = Math.max(0, stress - xpUtilise);
await this.update({ "system.compteurs.experience.value": stressTransformeRestant }); await this.update({ "system.compteurs.experience.value": stressTransformeRestant });
this.updateExperienceLog('Dépense stress', xpUtilise, `Stress en ${competence.name} ${gainNiveau ? "pour passer à " + nouveauNiveau : ""}`); this.updateExperienceLog('Dépense stress', xpUtilise, `Stress en ${competence.name} ${gainNiveau ? "pour passer à " + nouveauNiveau : ""}`);
} }
@@ -1088,7 +1067,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
_isConteneurContenu(item, conteneur) { _isConteneurContenu(item, conteneur) {
if (item?.isConteneur()) { // Si c'est un conteneur, il faut vérifier qu'on ne le déplace pas vers un sous-conteneur lui appartenant if (item?.isConteneur()) { // Si c'est un conteneur, il faut vérifier qu'on ne le déplace pas vers un sous-conteneur lui appartenant
for (let id of this.system.contenu) { for (let id of item.system.contenu) {
let subObjet = this.getObjet(id); let subObjet = this.getObjet(id);
if (subObjet?.id == conteneur.id) { if (subObjet?.id == conteneur.id) {
return true; // Loop detected ! return true; // Loop detected !
@@ -1119,7 +1098,7 @@ export class RdDActor extends Actor {
buildSubConteneurObjetList(conteneurId, deleteList) { buildSubConteneurObjetList(conteneurId, deleteList) {
let conteneur = this.getObjet(conteneurId); let conteneur = this.getObjet(conteneurId);
if (conteneur?.type == 'conteneur') { // Si c'est un conteneur if (conteneur?.type == 'conteneur') { // Si c'est un conteneur
for (let subId of this.system.contenu) { for (let subId of conteneur.system.contenu) {
let subObj = this.getObjet(subId); let subObj = this.getObjet(subId);
if (subObj) { if (subObj) {
if (subObj.type == 'conteneur') { if (subObj.type == 'conteneur') {
@@ -1132,11 +1111,11 @@ export class RdDActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async deleteAllConteneur(itemId) { async deleteAllConteneur(itemId, options) {
let list = []; let list = [];
list.push({ id: itemId, conteneurId: undefined }); // Init list list.push({ id: itemId, conteneurId: undefined }); // Init list
this.buildSubConteneurObjetList(itemId, list); this.buildSubConteneurObjetList(itemId, list);
await this.deleteEmbeddedDocuments('Item', list.map(it => it.id)); await this.deleteEmbeddedDocuments('Item', list.map(it => it.id), options);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -1144,28 +1123,29 @@ export class RdDActor extends Actor {
* de leurs ID */ * de leurs ID */
async enleverDeConteneur(item, conteneur, onEnleverDeConteneur) { async enleverDeConteneur(item, conteneur, onEnleverDeConteneur) {
if (conteneur?.isConteneur()) { if (conteneur?.isConteneur()) {
let data2use = duplicate(conteneur); item.estContenu = false;
let contenu = data2use.system.contenu; await this.updateEmbeddedDocuments('Item', [{
let index = contenu.indexOf(item.id); _id: conteneur.id,
while (index >= 0) { // Force cleanup, itemId is unique 'system.contenu': conteneur.system.contenu.filter(id => id != item.id)
contenu.splice(index, 1); }]);
index = contenu.indexOf(item.id);
}
item.system.estContenu = false;
await this.updateEmbeddedDocuments('Item', [data2use]);
onEnleverDeConteneur(); onEnleverDeConteneur();
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
/** Ajoute un item dans un conteneur, sur la base /** Ajoute un item dans un conteneur, sur la base
* de leurs ID */ * de leurs ID */
async ajouterDansConteneur(item, conteneur, onAjouterDansConteneur) { async ajouterDansConteneur(item, conteneur, onAjouterDansConteneur) {
if (conteneur?.isConteneur()) { if (!conteneur) {
let data2use = duplicate(conteneur); // TODO: afficher
data2use.system.contenu.push(item.id); item.estContenu = false;
item.system.estContenu = true; }
await this.updateEmbeddedDocuments('Item', [data2use]); else if (conteneur.isConteneur()) {
item.estContenu = true;
await this.updateEmbeddedDocuments('Item', [{
_id: conteneur.id,
'system.contenu': [...conteneur.system.contenu, item.id]
}]);
onAjouterDansConteneur(item.id, conteneur.id); onAjouterDansConteneur(item.id, conteneur.id);
} }
} }
@@ -1203,23 +1183,39 @@ export class RdDActor extends Actor {
if (item?.isEquipement() && sourceActorId == targetActorId) { if (item?.isEquipement() && sourceActorId == targetActorId) {
// rangement // rangement
if (srcId != destId && itemId != destId) { // déplacement de l'objet if (srcId != destId && itemId != destId) { // déplacement de l'objet
const dest = this.getObjet(destId);
const src = this.getObjet(srcId); const src = this.getObjet(srcId);
// changer de conteneur const dest = this.getObjet(destId);
if (this.conteneurPeutContenir(dest, item)) { const cible = this.getContenantOrParent(dest);
await this.enleverDeConteneur(item, src, params.onEnleverConteneur); const messageEquipementDifferent = item.messageEquipementDifferent(dest);
await this.ajouterDansConteneur(item, dest, params.onAjouterDansConteneur); if (dest && !messageEquipementDifferent) {
}
else if (dest?.isEquipementSimilaire(item)) {
await this.regrouperEquipementsSimilaires(item, dest); await this.regrouperEquipementsSimilaires(item, dest);
result = false; result = false;
} }
// changer de conteneur
else if (!cible || this.conteneurPeutContenir(cible, item)) {
await this.enleverDeConteneur(item, src, params.onEnleverConteneur);
await this.ajouterDansConteneur(item, cible, params.onAjouterDansConteneur);
}
else {
ui.notifications.info(messageEquipementDifferent);
}
} }
} }
await this.computeEncombrementTotalEtMalusArmure(); await this.computeEncombrementTotalEtMalusArmure();
return result; return result;
} }
getContenantOrParent(dest) {
if (!dest || dest.isConteneur()) {
return dest;
}
return this.getContenant(dest);
}
getContenant(item) {
return this.itemTypes['conteneur'].find(it => it.system.contenu.includes(item.id));
}
/* -------------------------------------------- */ /* -------------------------------------------- */
conteneurPeutContenir(dest, item) { conteneurPeutContenir(dest, item) {
if (!dest) { if (!dest) {
@@ -1272,7 +1268,7 @@ export class RdDActor extends Actor {
let newItemId = itemMap[item.id]; // Get newItem let newItemId = itemMap[item.id]; // Get newItem
console.log('New conteneur filling!', newConteneur, newItemId, item); console.log('New conteneur filling!', newConteneur, newItemId, item);
let contenu = duplicate(this.system.contenu); let contenu = duplicate(newConteneur.system.contenu);
contenu.push(newItemId); contenu.push(newItemId);
await this.updateEmbeddedDocuments('Item', [{ _id: newConteneurId, 'system.contenu': contenu }]); await this.updateEmbeddedDocuments('Item', [{ _id: newConteneurId, 'system.contenu': contenu }]);
} }
@@ -1424,6 +1420,15 @@ export class RdDActor extends Actor {
} }
} }
/* -------------------------------------------- */
async actionRefoulement(item) {
const refoulement = item?.system.refoulement ?? 0;
if (refoulement>0){
await this.ajouterRefoulement(refoulement);
await item.delete();
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async ajouterRefoulement(value = 1) { async ajouterRefoulement(value = 1) {
let refoulement = this.system.reve.refoulement.value + value; let refoulement = this.system.reve.refoulement.value + value;
@@ -1589,12 +1594,12 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getSonne() { getSonne() {
return this.getEffectByLabel("EFFECT.StatusStunned"); return this.getEffect(STATUSES.StatusStunned);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async finDeRound(options = { terminer: false }) { async finDeRound(options = { terminer: false }) {
for (let effect of this.getActiveEffects()) { for (let effect of this.getEffects()) {
if (effect.duration.type !== 'none' && (effect.duration.remaining <= 0 || options.terminer)) { if (effect.duration.type !== 'none' && (effect.duration.remaining <= 0 || options.terminer)) {
if (effect.system.origin) { if (effect.system.origin) {
await effect.update({ 'disabled': true }); await effect.update({ 'disabled': true });
@@ -1623,7 +1628,7 @@ export class RdDActor extends Actor {
ui.notifications.info("Le personnage est hors combat, il ne reste donc pas sonné"); ui.notifications.info("Le personnage est hors combat, il ne reste donc pas sonné");
return; return;
} }
await this.setStatusEffect("EFFECT.StatusStunned", sonne); await this.setEffect(STATUSES.StatusStunned, sonne);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -1776,7 +1781,7 @@ export class RdDActor extends Actor {
} }
await this.update({ "system.sante": sante }) await this.update({ "system.sante": sante })
if (this.isDead()) { if (this.isDead()) {
await this.setStatusEffect("EFFECT.StatusComma", true); await this.setEffect(STATUSES.StatusComma, true);
} }
return result; return result;
} }
@@ -1924,6 +1929,7 @@ export class RdDActor extends Actor {
} }
return; return;
} }
case 'queue': case 'ombre': return await this.actionRefoulement(item);
} }
} }
@@ -2435,7 +2441,7 @@ export class RdDActor extends Actor {
RdDItemSort.incrementBonusCase(this, selectedSort, rollData.tmr.coord); RdDItemSort.incrementBonusCase(this, selectedSort, rollData.tmr.coord);
if (rollData.isSortReserve) { if (rollData.isSortReserve) {
await this.sortMisEnReserve(rollData, selectedSort); await this.sortMisEnReserve(selectedSort, rollData.competence, rollData.tmr.coord, Number(selectedSort.system.ptreve_reel));
} }
} }
else { else {
@@ -2447,6 +2453,7 @@ export class RdDActor extends Actor {
if (rolled.isETotal) { // Echec total ! if (rolled.isETotal) { // Echec total !
rollData.depenseReve = Math.min(reveActuel, Math.floor(rollData.depenseReve * 1.5)) rollData.depenseReve = Math.min(reveActuel, Math.floor(rollData.depenseReve * 1.5))
// TODO: mise en réserve d'un échec total... // TODO: mise en réserve d'un échec total...
// await dialog mse en réserve, pour traitement échec total
} else { } else {
rollData.depenseReve = 0 rollData.depenseReve = 0
} }
@@ -3158,8 +3165,7 @@ export class RdDActor extends Actor {
ui.notifications.warn("Vous êtes déja dans les TMR...."); ui.notifications.warn("Vous êtes déja dans les TMR....");
return return
} }
let demiReve = this.getActiveEffects(it => it.label == "Demi-rêve"); if (mode != 'visu' && this.getEffect(STATUSES.StatusDemiReve)) {
if (mode != 'visu' && demiReve.length > 0) {
ui.notifications.warn("Le joueur ou le MJ est déja dans les Terres Médianes avec ce personnage ! Visualisation uniquement"); ui.notifications.warn("Le joueur ou le MJ est déja dans les Terres Médianes avec ce personnage ! Visualisation uniquement");
mode = "visu"; // bascule le mode en visu automatiquement mode = "visu"; // bascule le mode en visu automatiquement
} }
@@ -3174,7 +3180,7 @@ export class RdDActor extends Actor {
}); });
return; return;
} }
await this.setStatusEffect("EFFECT.StatusDemiReve", true); await this.setEffect(STATUSES.StatusDemiReve, true);
} }
const fatigue = this.system.sante.fatigue.value; const fatigue = this.system.sante.fatigue.value;
@@ -3464,7 +3470,7 @@ export class RdDActor extends Actor {
count--; count--;
} else { } else {
// TODO: status effect dead // TODO: status effect dead
this.setStatusEffect("EFFECT.StatusComma", true); this.setEffect(STATUSES.StatusComma, true);
ChatMessage.create({ ChatMessage.create({
content: `<img class="chat-icon" src="icons/svg/skull.svg" alt="charge" /> content: `<img class="chat-icon" src="icons/svg/skull.svg" alt="charge" />
<strong>${this.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !</strong>` <strong>${this.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !</strong>`
@@ -3554,7 +3560,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
isEntite(typeentite = []) { isEntite(typeentite = []) {
return this.type == 'entite' && (typeentite.length == 0 || typeentite.includes(this.system.typeentite)); return this.type == 'entite' && (typeentite.length == 0 || typeentite.includes(this.system.definition.typeentite));
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -3916,9 +3922,9 @@ export class RdDActor extends Actor {
let newVehicules = this.system.subacteurs.vehicules.filter(function (obj, index, arr) { return obj.id != actorId }); let newVehicules = this.system.subacteurs.vehicules.filter(function (obj, index, arr) { return obj.id != actorId });
let newSuivants = this.system.subacteurs.suivants.filter(function (obj, index, arr) { return obj.id != actorId }); let newSuivants = this.system.subacteurs.suivants.filter(function (obj, index, arr) { return obj.id != actorId });
let newMontures = this.system.subacteurs.montures.filter(function (obj, index, arr) { return obj.id != actorId }); let newMontures = this.system.subacteurs.montures.filter(function (obj, index, arr) { return obj.id != actorId });
await this.update({ 'system.subacteurs.vehicules': newVehicules }); await this.update({ 'system.subacteurs.vehicules': newVehicules }, { renderSheet: false });
await this.update({ 'system.subacteurs.suivants': newSuivants }); await this.update({ 'system.subacteurs.suivants': newSuivants }, { renderSheet: false });
await this.update({ 'system.subacteurs.montures': newMontures }); await this.update({ 'system.subacteurs.montures': newMontures }, { renderSheet: false });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -4030,11 +4036,12 @@ export class RdDActor extends Actor {
name: `Potion de ${herbeData.system.categorie} (${herbeData.name})`, type: 'potion', name: `Potion de ${herbeData.system.categorie} (${herbeData.name})`, type: 'potion',
img: "systems/foundryvtt-reve-de-dragon/icons/objets/fiole_verre.webp", img: "systems/foundryvtt-reve-de-dragon/icons/objets/fiole_verre.webp",
system: { system: {
quantite: 1, valeur_deniers: 1, encombrement: 0.01, quantite: 1, cout: 0, encombrement: 0.1,
categorie: herbeData.system.categorie, categorie: herbeData.system.categorie,
herbe: herbeData.name, herbe: herbeData.name,
rarete: herbeData.system.rarete, rarete: herbeData.system.rarete,
herbebrins: herbeData.nbBrins, herbebrins: herbeData.nbBrins,
herbebonus: herbeData.herbebonus,
description: "" description: ""
} }
} }
@@ -4099,61 +4106,47 @@ export class RdDActor extends Actor {
async onUpdateActor(update, options, actorId) { async onUpdateActor(update, options, actorId) {
const updatedEndurance = update?.system?.sante?.endurance const updatedEndurance = update?.system?.sante?.endurance
if (updatedEndurance && options.diff) { if (updatedEndurance && options.diff) {
await this.setStatusEffect("EFFECT.StatusUnconscious", updatedEndurance.value == 0) await this.setEffect(STATUSES.StatusUnconscious, updatedEndurance.value == 0)
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async onDeleteActiveEffect(effect, options) { getEffects(filter = e => true) {
switch (effect.label) { return this.getEmbeddedCollection("ActiveEffect").filter(filter);
case 'EFFECT.StatusStunned':
return;
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getActiveEffects(matching = it => true) { getEffect(statusId) {
return Array.from(this.getEmbeddedCollection("ActiveEffect").values()).filter(it => matching(it)); return this.getEmbeddedCollection("ActiveEffect").find(it => it.flags?.core?.statusId == statusId);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getEffectByLabel(label) { async setEffect(statusId, status) {
return this.getActiveEffects().find(it => it.system?.label == label);
}
/* -------------------------------------------- */
getEffectById(id) {
return this.getActiveEffects().find(it => it.id == id);
}
/* -------------------------------------------- */
async setStatusEffect(label, status, updates = {}) {
if (this.isEntite() || this.type == 'vehicule') { if (this.isEntite() || this.type == 'vehicule') {
return; return;
} }
console.log("setStatusEffect", label, status, updates) console.log("setEffect", statusId, status)
const existing = this.getEffectByLabel(label); const effect = this.getEffect(statusId);
if (existing) { if (!status && effect){
existing.delete(); await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]);
} }
if (status) { if (status && !effect ) {
const statusEffect = mergeObject(duplicate(StatusEffects.status(label)), updates); await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.status(statusId)]);
await this.createEmbeddedDocuments("ActiveEffect", [statusEffect]);
} }
} }
enleverActiveEffectById(id) { async removeEffect(statusId) {
if (game.user.isGM) { const effect = this.getEffect(statusId);
const existing = this.getEffectById(id); if (effect) {
if (existing) { await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]);
existing.delete();
}
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
enleverTousLesEffets() { async removeEffects(filter = e => true) {
if (game.user.isGM) { if (game.user.isGM) {
this.deleteEmbeddedDocuments('ActiveEffect', this.getActiveEffects().map(it => it.id)); const ids = this.getEffects(filter).map(it => it.id);
await this.deleteEmbeddedDocuments('ActiveEffect', ids);
} }
} }

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.system.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(); } }
} }
@@ -41,7 +40,8 @@ export class DialogCreateSigneDraconique extends Dialog {
await $("[name='signe.system.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));
} }
@@ -64,7 +64,7 @@ export class DialogCreateSigneDraconique extends Dialog {
this.dialogData.signe.system.difficulte = $("[name='signe.system.difficulte']").val(); this.dialogData.signe.system.difficulte = $("[name='signe.system.difficulte']").val();
this.dialogData.signe.system.ephemere = $("[name='signe.system.ephemere']").prop("checked"); this.dialogData.signe.system.ephemere = $("[name='signe.system.ephemere']").prop("checked");
this.dialogData.signe.system.duree = $("[name='signe.system.duree']").val(); this.dialogData.signe.system.duree = $("[name='signe.system.duree']").val();
this.dialogData.signe.system.typesTMR = $(".select-tmr").val(); this.dialogData.signe.system.typesTMR = TMRUtility.buildListTypesTMRSelection(this.dialogData.tmrs);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -73,8 +73,9 @@ export class DialogCreateSigneDraconique extends Dialog {
this.setEphemere(this.dialogData.signe.system.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.system.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() {
@@ -87,7 +88,10 @@ export class DialogCreateSigneDraconique extends Dialog {
$("[name='signe.system.difficulte']").val(newSigne.system.difficulte); $("[name='signe.system.difficulte']").val(newSigne.system.difficulte);
$("[name='signe.system.duree']").val(newSigne.system.duree); $("[name='signe.system.duree']").val(newSigne.system.duree);
$("[name='signe.system.ephemere']").prop("checked", newSigne.system.ephemere); $("[name='signe.system.ephemere']").prop("checked", newSigne.system.ephemere);
$(".select-tmr").val(newSigne.system.typesTMR); this.dialogData.tmrs = TMRUtility.buildSelectionTypesTMR(newSigne.system.typesTMR);
this.dialogData.tmrs.forEach(t => {
$(`[data-tmr-name='${t.name}']`).prop( "checked", t.selected);
})
this.setEphemere(newSigne.system.ephemere); this.setEphemere(newSigne.system.ephemere);
} }
@@ -97,17 +101,22 @@ export class DialogCreateSigneDraconique extends Dialog {
} }
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);

View File

@@ -6,6 +6,11 @@ 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 = {
@@ -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.system.quantite); potionData.nbBrinsSelect = RdDUtility.buildListOptions(
potionData.nbBrins = Math.min(potionData.system.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,7 +53,15 @@ export class DialogFabriquerPotion extends Dialog {
this.potionData = potionData; this.potionData = potionData;
} }
static getNombreBrinOptimal(herbeData) { static nombreBrinsMinimum(herbeData) {
switch (herbeData.system.categorie ?? '') {
case "Soin": return 1 + Math.max(0, 12 - 2 * herbeData.system.niveau);
case "Repos": return 1 + Math.max(0, 7 - 2 * herbeData.system.niveau);
}
return 1;
}
static nombreBrinsOptimal(herbeData) {
switch (herbeData.system.categorie ?? '') { switch (herbeData.system.categorie ?? '') {
case "Soin": return 12 - herbeData.system.niveau; case "Soin": return 12 - herbeData.system.niveau;
case "Repos": return 7 - herbeData.system.niveau; case "Repos": return 7 - herbeData.system.niveau;
@@ -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

@@ -39,7 +39,7 @@ export class DialogItemAchat extends Dialog {
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

@@ -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,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,24 +17,27 @@ 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;
} }
@@ -44,6 +48,6 @@ export class RdDItemCompetenceCreature extends Item {
/* -------------------------------------------- */ /* -------------------------------------------- */
static isCompetenceParade(item) { static isCompetenceParade(item) {
return item.type == 'competencecreature' && item.system.isparade; return item.type == 'competencecreature' && item.system.categorie_parade !== "";
} }
} }

View File

@@ -1,4 +1,5 @@
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { LOG_HEAD, SYSTEM_RDD } from "./constants.js";
const MONNAIES_STANDARD = [ const MONNAIES_STANDARD = [
{ {
@@ -22,28 +23,32 @@ const MONNAIES_STANDARD = [
system: { 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 = MONNAIES_STANDARD.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 MONNAIES_STANDARD; return MONNAIES_STANDARD;
} }
static filtrerMonnaies(items) { static monnaiesManquantes(actor) {
return items.filter(it => it.type == 'monnaie'); const disponibles = actor.itemTypes['monnaie'];
}
static monnaiesManquantes(disponibles) {
const manquantes = MONNAIES_STANDARD.filter(standard => !disponibles.find(disponible => Monnaie.deValeur(disponible, standard.system?.valeur_deniers))); const manquantes = MONNAIES_STANDARD.filter(standard => !disponibles.find(disponible => Monnaie.deValeur(disponible, standard.system?.valeur_deniers)));
if (manquantes.length>0) { if (manquantes.length > 0) {
console.error('monnaiesManquantes', manquantes, ' avec monnaies', disponibles, MONNAIES_STANDARD); console.error(`${LOG_HEAD} monnaiesManquantes pour ${actor.name}`, manquantes, ' avec monnaies', disponibles, MONNAIES_STANDARD);
} }
return []; //manquantes; return manquantes;
} }
static deValeur(monnaie, valeur) { static deValeur(monnaie, valeur) {

View File

@@ -74,7 +74,10 @@ export class RdDItemSheet extends ItemSheet {
owner: this.item.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,
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
descriptionmj: await TextEditor.enrichHTML(this.object.system.descriptionmj, {async: true})
} }
if (this.actor) { if (this.actor) {
formData.isOwned = true; formData.isOwned = true;
@@ -84,32 +87,43 @@ export class RdDItemSheet extends ItemSheet {
} }
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 == 'recettecuisine') {
RdDAlchimie.processManipulation(this.item, this.actor && this.actor.id); formData.ingredients = await TextEditor.enrichHTML(this.object.system.ingredients, {async: true})
} }
if (formData.type == 'gemme') { if (this.item.type == 'recettealchimique') {
RdDAlchimie.processManipulation(this.item, this.actor && this.actor.id);
formData.manipulation_update = await TextEditor.enrichHTML(this.object.system.manipulation_update, {async: true})
formData.utilisation = await TextEditor.enrichHTML(this.object.system.utilisation, {async: true})
formData.enchantement = await TextEditor.enrichHTML(this.object.system.enchantement, {async: true})
formData.sureffet = await TextEditor.enrichHTML(this.object.system.sureffet, {async: true})
}
if (this.item.type == 'gemme') {
formData.gemmeTypeList = RdDGemme.getGemmeTypeOptionList(); formData.gemmeTypeList = RdDGemme.getGemmeTypeOptionList();
RdDGemme.calculDataDerivees(this.item); RdDGemme.calculDataDerivees(this.item);
} }
if (formData.type == 'potion') { if (this.item.type == 'potion') {
if (this.dateUpdated) { if (this.dateUpdated) {
formData.system.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.system.categorie == 'Soin' || formData.system.categorie == 'Repos')) { if (formData.isOwned && this.item.type == 'herbe' && (formData.system.categorie == 'Soin' || formData.system.categorie == 'Repos')) {
formData.isIngredientPotionBase = true; formData.isIngredientPotionBase = true;
} }
if (this.item.type == 'sortreserve') {
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;
@@ -197,7 +211,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);

View File

@@ -32,8 +32,7 @@ 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;
} }
@@ -41,16 +40,17 @@ export class RdDSigneDraconiqueItemSheet extends ItemSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
const formData = duplicate(this.item); 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.actor.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.system.typesTMR ?? []);
return formData; return formData;
} }
@@ -62,7 +62,7 @@ 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)));
} }
@@ -72,9 +72,13 @@ export class RdDSigneDraconiqueItemSheet extends ItemSheet {
} }
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.item.update({ 'system.typesTMR': selectedTMR }); if (onTmr){
onTmr.selected = event.currentTarget.checked;
}
this.item.update({ 'system.typesTMR': TMRUtility.buildListTypesTMRSelection(this.tmrs) });
} }
async onValeurXpSort(event) { async onValeurXpSort(event) {

View File

@@ -36,7 +36,8 @@ 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",
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -145,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 }) {
@@ -193,8 +198,9 @@ export class RdDItem extends Item {
/* -------------------------------------------- */ /* -------------------------------------------- */
// 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) {
if (!this.isEquipement()) return false; if (!other || !this.isEquipement()) return undefined;
let message = undefined; let message = undefined;
if (this.type != other.type) { if (this.type != other.type) {
message = `Impossible de regrouper ${this.type} avec ${other.type}`; message = `Impossible de regrouper ${this.type} avec ${other.type}`;
@@ -215,11 +221,7 @@ export class RdDItem extends Item {
} }
} }
} }
if (message){ return message;
ui.notifications.info(message)
return false;
}
return true;
} }
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

@@ -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.items.find( item => (item.type == 'maladie' || (item.type == 'poison' && item.system.active) ) && item.system.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.system.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 !` });

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 = [
@@ -196,6 +197,11 @@ 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 =>
{ {
@@ -217,17 +223,15 @@ 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.system.carac)); actions = actions.concat(RdDCombatManager.listActionsArmes(armes, competences, actor.system.carac));
if (actor.system.attributs.hautrevant.value) { if (actor.system.attributs.hautrevant.value) {
@@ -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.system.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.system.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.system.cac) {
case "empoignade": return 3; case "empoignade":
case "pugilat": return 4; return 3;
case "pugilat":
case "naturelle":
return 4;
} }
return 5; return 5;
} }
@@ -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,
@@ -1185,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';

View File

@@ -358,10 +358,9 @@ export class RdDCommands {
async supprimerSignesDraconiquesEphemeres() { async supprimerSignesDraconiquesEphemeres() {
game.actors.forEach(actor => { game.actors.forEach(actor => {
const ephemeres = actor.items.find(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

@@ -2,14 +2,18 @@ import { Misc } from "./misc.js";
export class RdDHotbar { export class RdDHotbar {
static async createMacro(item, command) { static async addToHotbar(item, slot) {
let macro = await Macro.create({ let command = `game.system.rdd.RdDHotbar.rollMacro("${item.name}", "${item.type}");`;
name: item.name, let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command));
type: "script", if (!macro) {
img: item.img, macro = await Macro.create({
command: command name: item.name,
}, { displaySheet: false }) type: "script",
return macro img: item.img,
command: command
}, { displaySheet: false })
}
await game.user.assignHotbarMacro(macro, slot);
} }
/** /**
@@ -32,69 +36,33 @@ export class RdDHotbar {
if (!item || (item.type != "arme" && item.type != "competence")) { if (!item || (item.type != "arme" && item.type != "competence")) {
return true return true
} }
let command = `game.system.rdd.RdDHotbar.rollMacro("${item.name}", "${item.type}");`; this.addToHotbar(item, slot)
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command));
if (!macro) {
macro = this.createMacro(item, command)
}
game.user.assignHotbarMacro(macro, slot);
return false return false
} }
// Create a macro to open the actor sheet of the actor dropped on the hotbar return true
/*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.name,
type: "script",
img: actor.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 = fromUuidSync(documentData.uuid)
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.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 true;
});
}
/** Roll macro */ /** Roll macro */
static rollMacro(itemName, itemType, bypassData) { static rollMacro(itemName, itemType, bypassData) {
const speaker = ChatMessage.getSpeaker(); const speaker = ChatMessage.getSpeaker();
let actor; let actor;
if (speaker.token) actor = game.actors.tokens[speaker.token]; if (speaker.token) actor = game.actors.tokens[speaker.token];
if (!actor) actor = game.actors.get(speaker.actor); if (!actor) actor = game.actors.get(speaker.actor);
let item = actor?.items.find(it => it.name === itemName && it.type == itemType) ?? undefined; let item = actor?.items.find(it => it.name === itemName && it.type == itemType) ?? undefined;
if (!item) { if (!item) {
return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`); return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`);
}
// Trigger the item roll
switch (item.type) {
case "arme":
return actor.rollArme(item);
case "competence":
return actor.rollCompetence(itemName);
}
} }
// Trigger the item roll
switch (item.type) {
case "arme":
return actor.rollArme(item);
case "competence":
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();

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

@@ -26,7 +26,7 @@ export class RdDSheetUtility {
destId: destItemId, destId: destItemId,
targetActorId: actorId, targetActorId: actorId,
itemId: item.id, itemId: item.id,
sourceActorId: item.actor.id, sourceActorId: item.actor?.id,
srcId: objetVersConteneur[item.id], srcId: objetVersConteneur[item.id],
onEnleverConteneur: () => { delete objetVersConteneur[item.id]; }, onEnleverConteneur: () => { delete objetVersConteneur[item.id]; },
onAjouterDansConteneur: (itemId, conteneurId) => { objetVersConteneur[itemId] = conteneurId; } onAjouterDansConteneur: (itemId, conteneurId) => { objetVersConteneur[itemId] = conteneurId; }

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");
@@ -272,15 +266,17 @@ export class RdDTMRDialog extends Dialog {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
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
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -316,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);
@@ -336,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);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -483,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);
@@ -498,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);
@@ -537,7 +528,7 @@ export class RdDTMRDialog extends Dialog {
await this._tentativeMaitrise(rencontreData); await this._tentativeMaitrise(rencontreData);
this.maximize(); this.maximize();
postRencontre(); this.postRencontre(tmr);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -573,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);
@@ -605,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;
@@ -618,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();
} }
} }
@@ -728,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),
@@ -774,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;
@@ -784,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({
@@ -794,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.data.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();
} }
@@ -926,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';
@@ -975,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);
@@ -994,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);
} }
} }
@@ -1019,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 };
} }
@@ -1029,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);
@@ -1037,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

@@ -121,8 +121,10 @@ 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.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-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-animaux.html',
@@ -130,6 +132,7 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet-liens-vehicules.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',
@@ -390,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) {
@@ -690,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
@@ -828,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.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: {
@@ -856,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;
} }
@@ -872,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: {
@@ -881,15 +892,15 @@ export class RdDUtility {
label: "Annuler" label: "Annuler"
} }
} }
if (objet.type == 'conteneur' && objet.system.contenu.length > 0) { if (item.type == 'conteneur' && item.system.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);
} }
} }
} }
@@ -903,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

@@ -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

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

@@ -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) {

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

@@ -840,6 +840,23 @@ ul, li {
margin-left: 3rem; 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;
@@ -1146,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;}

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.12", "version": "10.0.21",
"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.12.zip", "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.0.21.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

@@ -139,7 +139,7 @@
<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 system.description target="system.description" button=true owner=owner editable=true}} {{editor 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

@@ -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 system.description target="system.description" button=true owner=owner editable=true}} {{editor 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

@@ -1,6 +1,6 @@
{{#if options.isGM}} {{#if options.isGM}}
<h3>Notes du MJ : </h3> <h3>Notes du MJ : </h3>
<div class="form-group editor"> <div class="form-group editor">
{{editor system.notesmj target="system.notesmj" button=true owner=owner editable=editable}} {{editor notesmj target="system.notesmj" button=true owner=owner editable=editable}}
</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,52 +0,0 @@
<li class="item flexrow list-item" data-item-id="{{item._id}}" draggable="true">
{{#if (eq item.type 'conteneur')}}
<span class="sheet-competence-img conteneur-name">
{{#if vide}}
<i class="far fa-square"></i>
{{else}}
<a data-item-id="{{item._id}}">
{{#if ouvert}}
<i class="far fa-minus-square"></i>
<!-- <i class="far fa-caret-square-down"></i> -->
{{else}}
<i class="far fa-plus-square"></i>
<!-- <i class="fas fa-caret-square-right"></i> -->
{{/if}}
</a>
{{/if}}
</span>
<span class="item-name conteneur-name flex-grow">
<a data-item-id="{{item._id}}">
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
{{item.name}}
</a>
</span>
{{else}}
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
<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

@@ -1,24 +1,16 @@
<li class="item flexrow list-item" data-item-id="{{item._id}}" draggable="true"> <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}} "> <span class="equipement-nom {{#if (eq item.type 'conteneur')}}conteneur-name{{/if}} ">
{{#if (eq item.type 'conteneur')}} {{#if (eq item.type 'conteneur')}}
{{#if vide}} <a>
<i class="far fa-square"></i> <i class="{{~#if vide}}far fa-square
{{else}} {{else if ouvert}}far fa-minus-square
<a data-item-id="{{item._id}}"> {{else}}far fa-plus-square
{{#if ouvert}} {{/if~}}"></i>
<i class="far fa-minus-square"></i> {{/if}}
{{else}}
<i class="far fa-plus-square"></i>
{{/if}}
</a>
{{/if}}
<a data-item-id="{{item._id}}">
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
<span>{{item.name}}</span>
</a>
{{else}}
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/> <img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
<span>{{item.name}}</span> <span>{{item.name}}</span>
{{#if (eq item.type 'conteneur')}}
</a>
{{/if}} {{/if}}
</span> </span>
<span class="equipement-detail">{{item.system.quantite}} <span class="equipement-detail">{{item.system.quantite}}
@@ -40,8 +32,8 @@
<a class="item-vendre" title="Vendre ou donner"><i class="fas fa-comments-dollar"></i></a> <a class="item-vendre" title="Vendre ou donner"><i class="fas fa-comments-dollar"></i></a>
{{/if}} {{/if}}
<a class="item-montrer" title="Montrer"><i class="fas fa-comment"></i></a> <a class="item-montrer" title="Montrer"><i class="fas fa-comment"></i></a>
{{#if item.actionPrincipale}} {{#if item.system.actionPrincipale}}
<a class="item-action">{{item.actionPrincipale}}</a> <a class="item-action">{{item.system.actionPrincipale}}</a>
{{/if}} {{/if}}
</span> </span>
</li> </li>

View File

@@ -13,12 +13,6 @@
<span class="equipement-detail item-controls"> <span class="equipement-detail item-controls">
<a class="monnaie-plus"><i class="fas fa-plus-square"></i></a> <a class="monnaie-plus"><i class="fas fa-plus-square"></i></a>
</span> </span>
<!-- <span class="equipement-detail">
<span class="flex-shrink"><a class="monnaie-moins"><i class="fas fa-minus-square"></i></a></span>
<span>{{piece.system.quantite}}</span>
<span class="flex-shrink"><a class="monnaie-plus"><i class="fas fa-plus-square"></i></a></span>
</span> -->
<span class="equipement-actions item-controls"> <span class="equipement-actions item-controls">
<a class="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-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>

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

@@ -1,4 +1,5 @@
<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>

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

@@ -384,7 +384,9 @@
<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>
@@ -462,28 +464,21 @@
</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 system.reve.tmrpos.coord}}</span> </span><span>
</span>
<span>
<input class="competence-value" type="text" name="system.reve.tmrpos.coord" value="{{system.reve.tmrpos.coord}}" data-dtype="String"/> <input class="competence-value" type="text" name="system.reve.tmrpos.coord" value="{{system.reve.tmrpos.coord}}" data-dtype="String"/>
</span> {{else if hautreve.cacheTMR}}
{{caseTmr-type system.reve.tmrpos.coord}}
{{else}} </span><span>
<span class="competence-label flex-shrink">Demi rêve :
{{#unless hautreve.cacheTMR}}
<span>{{caseTmr-label system.reve.tmrpos.coord}}</span>
{{/unless}}
</span>
<span>
{{#if hautreve.cacheTMR}}
?? ??
{{else}} {{else}}
{{caseTmr-label system.reve.tmrpos.coord}}
</span><span>
{{system.reve.tmrpos.coord}} {{system.reve.tmrpos.coord}}
{{/if}}
</span>
{{/if}} {{/if}}
</span>
</li> </li>
{{/if}} {{/if}}
<li class="item flexrow"> <li class="item flexrow">
@@ -510,38 +505,14 @@
</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-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-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-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>
@@ -554,7 +525,8 @@
<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-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>
@@ -563,12 +535,13 @@
</ul> </ul>
{{/if}} {{/if}}
{{#if system.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="display-label flex-grow"><a>{{signe.name}}</a></span>
<span class="flex-shrink">{{signe.system.difficulte}}</span> <span class="flex-shrink">{{signe.system.difficulte}}</span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
@@ -576,9 +549,9 @@
</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|}}
@@ -594,29 +567,40 @@
</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 hautreve.sortsReserve as |reserve key|}} {{#each sortsReserve as |sort key|}}
<li class="item list-item flexrow" data-item-id="{{reserve._id}}" data-attribute="{{key}}"> <li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}">
<img class="sheet-competence-img" src="{{reserve.sort.img}}" /> <img class="sheet-competence-img" src="{{sort.img}}" />
<span class="display-label">{{reserve.sort.name}} r{{reserve.sort.system.ptreve_reel}}</span> <span class="display-label"><a>{{#if sort.system.echectotal}}Echec total: {{/if}}{{sort.name}} r{{sort.system.ptreve}}</a></span>
<span>{{reserve.coord}} - {{caseTmr-label reserve.coord}}</span> <span>{{sort.system.coord}} - {{caseTmr-label sort.system.coord}}</span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-delete flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
{{#each hautreve.sortsReserve as |reserve key|}}
<li class="item list-item flexrow" data-index="{{key}}">
<img class="sheet-competence-img" src="{{reserve.img}}" />
<span class="display-label">{{reserve.sort.name}} r{{reserve.sort.system.ptreve_reel}}</span>
<span>{{reserve.coord}} - {{caseTmr-label reserve.coord}}</span>
<div class="item-controls flex-shrink">
<a class="delete-sort-reserve flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/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}}
@@ -634,6 +618,7 @@
<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-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a>
@@ -642,12 +627,13 @@
</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">
@@ -727,11 +713,11 @@
<article class="flexcol"> <article class="flexcol">
<h3>Biographie : </h3> <h3>Biographie : </h3>
<div class="form-group editor"> <div class="form-group editor">
{{editor system.biographie target="system.biographie" button=true owner=owner editable=editable}} {{editor 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 system.notes target="system.notes" button=true owner=owner editable=editable}} {{editor 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">

View File

@@ -75,7 +75,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 content=system.description target="system.description" button=true owner=owner editable=editable}} {{editor 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

@@ -1,6 +1,6 @@
<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 system.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>

View File

@@ -1,6 +1,6 @@
<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 system.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>

View File

@@ -50,10 +50,11 @@
<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

@@ -31,22 +31,31 @@
<input type="text" name="signe.system.duree" value="{{signe.system.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="dialog-roll-sort"> <form class="dialog-roll-sort">
<h2>Lancer le <span class="sort-ou-rituel">{{#if sort.system.isrituel}}rituel{{else}}sort{{/if}}</span>: <h2 class="flexrow">Lancer le {{#if sort.system.isrituel}}rituel{{else}}sort{{/if}}:
<select name="sort" class="roll-sort flex-grow" data-dtype="String"> <select name="sort" class="roll-sort" data-dtype="String">
{{#select sort}} {{#select sort}}
{{#each sortList as |sort key|}} {{#each sortList as |sort key|}}
<option value={{key}}>{{this.name}} - {{#if this.system.caseTMRspeciale}} {{this.system.caseTMRspeciale}} <option value={{key}}>{{this.name}} - {{#if this.system.caseTMRspeciale}} {{this.system.caseTMRspeciale}}

View File

@@ -12,13 +12,17 @@
<label for="immediat">Expérience immédiate</label> <label for="immediat">Expérience immédiate</label>
<input class="flex-shrink" type="checkbox" name="immediat" {{#if immediat}}checked{{/if}} /> <input class="flex-shrink" type="checkbox" name="immediat" {{#if immediat}}checked{{/if}} />
</div> </div>
<div class="form-group"> <div class="flexcol">
<label for="actors">Personnages concernés</label> <label>Personnages concernés</label>
<select class="select-actor" id="actors" size="7" multiple> <div class="grid-select-actor">
{{#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>
</div> </div>
</form> </form>

View File

@@ -0,0 +1,6 @@
<header class="sheet-header">
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/>
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
</div>
</header>

View File

@@ -1,10 +1,5 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/>
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
</div>
</header>
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
<section class="sheet-body"> <section class="sheet-body">

View File

@@ -1,35 +1,29 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/>
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
</div>
</header>
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label for="xp">Protection</label>
<input class="attribute-value" type="text" name="system.protection" value="{{system.protection}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="xp">Encombrement </label>
<input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Détérioration</label>
<input class="attribute-value" type="text" name="system.deterioration" value="{{system.deterioration}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Malus Armure </label>
<input class="attribute-value" type="text" name="system.malus" value="{{system.malus}}" data-dtype="Number"/>
</div>
<div class="form-group item-cout">
<label for="xp">Prix (sols) </label>
<input class="attribute-value" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{!-- Sheet Body --}}
</section> <section class="sheet-body">
<div class="form-group">
<label for="xp">Protection</label>
<input class="attribute-value" type="text" name="system.protection" value="{{system.protection}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="xp">Encombrement </label>
<input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Détérioration</label>
<input class="attribute-value" type="text" name="system.deterioration" value="{{system.deterioration}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Malus Armure </label>
<input class="attribute-value" type="text" name="system.malus" value="{{system.malus}}" data-dtype="Number"/>
</div>
<div class="form-group item-cout">
<label for="xp">Prix (sols) </label>
<input class="attribute-value" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</form> </form>

View File

@@ -1,27 +1,20 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label for="niveau">Coordonnées TMR </label>
</header> <input class="attribute-value" type="text" name="system.coord" value="{{system.coord}}" data-dtype="String"/>
</div>
{{!-- Sheet Body --}} <div class="form-group">
<section class="sheet-body"> <label for="niveau">Mode spécifique</label>
<div class="form-group"> <select name="system.specific" id="specific" data-dtype="String">
<label for="niveau">Coordonnées TMR </label> {{#select system.specific}}
<input class="attribute-value" type="text" name="system.coord" value="{{system.coord}}" data-dtype="String"/> {{>"systems/foundryvtt-reve-de-dragon/templates/casetmr-specific-list.html"}}
</div> {{/select}}
<div class="form-group"> </select>
<label for="niveau">Mode spécifique</label> </div>
<select name="system.specific" id="specific" data-dtype="String">
{{#select system.specific}}
{{>"systems/foundryvtt-reve-de-dragon/templates/casetmr-specific-list.html"}}
{{/select}}
</select>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section> </section>
</form> </form>

View File

@@ -1,24 +1,16 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label class="alchimie-title" for="xp">Niveau</label>
</header> <input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>
{{!-- Sheet Body --}} <div class="form-group">
<section class="sheet-body"> <label>Référence / Auteur</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
<label class="alchimie-title" for="xp">Niveau</label> </div>
<input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label>Référence / Auteur</label>
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,37 +1,46 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label for="system.categorie">Catégorie</label>
</header> <select name="system.categorie" class="categorie" data-dtype="String">
{{#select system.categorie}}
{{!-- Sheet Body --}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-competence.html"}}
<section class="sheet-body"> {{/select}}
</select>
</div>
<div class="form-group">
<label for="niveau">Valeur de Caractéristique </label>
<input class="attribute-value" type="text" name="system.carac_value" value="{{system.carac_value}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="niveau">Niveau </label>
<input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="default_diffLibre">Difficulté libre par défaut</label>
<input class="attribute-value" type="text" name="system.default_diffLibre" value="{{system.default_diffLibre}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="system.ispossession">Attaque de possession</label>
<input class="attribute-value" type="checkbox" name="system.ispossession" {{#if system.ispossession}}checked{{/if}}/>
</div>
{{#unless system.ispossession}}
<div class="form-group">
<label for="system.iscombat">Compétence d'attaque</label>
<input class="attribute-value" type="checkbox" name="system.iscombat" {{#if system.iscombat}}checked{{/if}}/>
</div>
{{#if system.iscombat}}
<div class="form-group"> <div class="form-group">
<label for="niveau">Niveau </label> <label for="system.isnaturelle">Arme naturelle</label>
<input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/> <input class="attribute-value" type="checkbox" name="system.isnaturelle" {{#if system.isnaturelle}}checked{{/if}}/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="niveau">Valeur de Caractéristique </label> <label for="niveau">Dommages (+dom)</label>
<input class="attribute-value" type="text" name="system.carac_value" value="{{system.carac_value}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="system.dommages" value="{{system.dommages}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="default_diffLibre">Difficulté libre par défaut</label>
<input class="attribute-value" type="text" name="system.default_diffLibre" value="{{system.default_diffLibre}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Arme ? </label>
<input class="attribute-value" type="checkbox" name="system.iscombat" {{#if system.iscombat}}checked{{/if}}/>
</div>
<div class="form-group">
<label for="xp">Parade ? </label>
<input class="attribute-value" type="checkbox" name="system.isparade" {{#if system.isparade}}checked{{/if}}/>
</div>
<div class="form-group">
<label for="xp">Possession ? </label>
<input class="attribute-value" type="checkbox" name="system.ispossession" {{#if system.ispossession}}checked{{/if}}/>
</div> </div>
{{/if}}
<div class="form-group"> <div class="form-group">
<label>Catégorie parade </label> <label>Catégorie parade </label>
<select name="system.categorie_parade" id="categorie_parade" data-dtype="String"> <select name="system.categorie_parade" id="categorie_parade" data-dtype="String">
@@ -40,13 +49,8 @@
{{/select}} {{/select}}
</select> </select>
</div> </div>
<div class="form-group"> {{/unless}}
<label for="niveau">Dommages (+dom), si applicable </label>
<input class="attribute-value" type="text" name="system.dommages" value="{{system.dommages}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,47 +1,39 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label for="xp">Encombrement </label>
</header> <input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"/>
</div>
{{!-- Sheet Body --}} <div class="form-group">
<section class="sheet-body"> <label for="xp">Capacite (points d'Encombrement portable)</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.capacite" value="{{system.capacite}}" data-dtype="Number"/>
<label for="xp">Encombrement </label> </div>
<input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"/> <div class="form-group">
</div> <label for="xp">Qualité</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.qualite" value="{{system.qualite}}" data-dtype="Number"/>
<label for="xp">Capacite (points d'Encombrement portable)</label> </div>
<input class="attribute-value" type="text" name="system.capacite" value="{{system.capacite}}" data-dtype="Number"/> <div class="form-group item-cout">
</div> <label for="xp">Prix (sols) </label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"/>
<label for="xp">Qualité</label> </div>
<input class="attribute-value" type="text" name="system.qualite" value="{{system.qualite}}" data-dtype="Number"/> {{#if isOwned}}
</div> <div class="flexcol">
<div class="form-group item-cout"> <span><label>Contenu : </label></span>
<label for="xp">Prix (sols) </label> <ul class="item-list alterne-list">
<input class="attribute-value" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"/> <li class="competence-header flexrow">
</div> <span class="equipement-nom">Nom</span>
{{#if isOwned}} <span class="equipement-detail">Q.</span>
<div class="flexcol"> <span class="equipement-detail">Enc.</span>
<span><label>Contenu : </label></span> <span class="equipement-actions">Actions</span>
<ul class="item-list alterne-list"> </li>
<li class="competence-header flexrow"> {{buildContenu this}}
<span class="equipement-nom">Nom</span> </ul>
<span class="equipement-detail">Q.</span> </div>
<span class="equipement-detail">Enc.</span> {{/if}}
<span class="equipement-actions">Actions</span>
</li>
{{buildContenu this}}
</ul>
</div>
{{/if}}
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,41 +1,33 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label class="alchimie-title" for="xp">Type</label>
</header> <select name="system.type" data-dtype="String">
{{#select system.type}}
{{!-- Sheet Body --}} <option value="recreative">Récréative</option>
<section class="sheet-body"> <option value="soliste">Soliste</option>
<div class="form-group"> {{/select}}
<label class="alchimie-title" for="xp">Type</label> </select>
<select name="system.type" data-dtype="String"> </div>
{{#select system.type}} <div class="form-group">
<option value="recreative">Récréative</option> <label class="alchimie-title" for="xp">Agilité ?</label>
<option value="soliste">Soliste</option> <input class="attribute-value" type="checkbox" name="system.agilite" {{#if system.agilite}}checked{{/if}}/>
{{/select}} </div>
</select> <div class="form-group">
</div> <label class="alchimie-title" for="xp">Apparence ?</label>
<div class="form-group"> <input class="attribute-value" type="checkbox" name="system.apparence" {{#if system.apparence}}checked{{/if}}/>
<label class="alchimie-title" for="xp">Agilité ?</label> </div>
<input class="attribute-value" type="checkbox" name="system.agilite" {{#if system.agilite}}checked{{/if}}/> <div class="form-group">
</div> <label class="alchimie-title" for="xp">Niveau</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
<label class="alchimie-title" for="xp">Apparence ?</label> </div>
<input class="attribute-value" type="checkbox" name="system.apparence" {{#if system.apparence}}checked{{/if}}/> <div class="form-group">
</div> <label>Référence / Auteur</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
<label class="alchimie-title" for="xp">Niveau</label> </div>
<input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label>Référence / Auteur</label>
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,11 +1,5 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
</div>
</header>
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
<section class="sheet-body"> <section class="sheet-body">
<div class="form-group"> <div class="form-group">
@@ -50,7 +44,5 @@
</div> </div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section> </section>
</form> </form>

View File

@@ -1,10 +1,5 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
</div>
</header>
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
<section class="sheet-body"> <section class="sheet-body">
@@ -48,7 +43,5 @@
</div> </div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section> </section>
</form> </form>

View File

@@ -1,39 +1,32 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/>
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
</div>
</header>
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label class="alchimie-title" for="xp">Type</label>
<select name="system.type" data-dtype="String">
{{#select system.type}}
<option value="adressehasard">Adresse/Hasard</option>
<option value="de">Dés</option>
<option value="carte">Cartes</option>
<option value="reflexion">Reflexion</option>
{{/select}}
</select>
</div>
<div class="form-group">
<label class="alchimie-title" for="xp">Base</label>
<input class="attribute-value" type="text" name="system.base" value="{{system.base}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label class="alchimie-title" for="xp">Caractéristique/Compétence</label>
<input class="attribute-value" type="text" name="system.caraccomp" value="{{system.caraccomp}}" data-dtype="String"/>
</div>
<div class="form-group">
<label>Référence / Auteur</label>
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{!-- Sheet Body --}}
<section class="sheet-body">
</section> <div class="form-group">
<label class="alchimie-title" for="xp">Type</label>
<select name="system.type" data-dtype="String">
{{#select system.type}}
<option value="adressehasard">Adresse/Hasard</option>
<option value="de">Dés</option>
<option value="carte">Cartes</option>
<option value="reflexion">Reflexion</option>
{{/select}}
</select>
</div>
<div class="form-group">
<label class="alchimie-title" for="xp">Base</label>
<input class="attribute-value" type="text" name="system.base" value="{{system.base}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label class="alchimie-title" for="xp">Caractéristique/Compétence</label>
<input class="attribute-value" type="text" name="system.caraccomp" value="{{system.caraccomp}}" data-dtype="String"/>
</div>
<div class="form-group">
<label>Référence / Auteur</label>
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</form> </form>

View File

@@ -1,84 +1,76 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label for="xp">Compétence</label>
</header> <select name="system.competence" id="competenceselect" data-dtype="String">
{{#select system.competence}}
{{!-- Sheet Body --}} {{#each competences as |competence key|}}
<section class="sheet-body"> <option value="{{competence.name}}">{{competence.name}}</option>
<div class="form-group"> {{/each}}
<label for="xp">Compétence</label> {{/select}}
<select name="system.competence" id="competenceselect" data-dtype="String"> </select>
{{#select system.competence}} </div>
{{#each competences as |competence key|}} <div class="form-group">
<option value="{{competence.name}}">{{competence.name}}</option> <label for="xp">Thème</label>
{{/each}} <input class="attribute-value" type="text" name="system.theme" value="{{system.theme}}" data-dtype="String"/>
{{/select}} </div>
</select> <div class="form-group">
</div> <label for="xp">Support</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.support" value="{{system.support}}" data-dtype="String"/>
<label for="xp">Thème</label> </div>
<input class="attribute-value" type="text" name="system.theme" value="{{system.theme}}" data-dtype="String"/> <div class="form-group">
</div> <label for="xp">Heure</label>
<div class="form-group"> <select name="system.heure" id="heure" data-dtype="String">
<label for="xp">Support</label> {{#select system.heure}}
<input class="attribute-value" type="text" name="system.support" value="{{system.support}}" data-dtype="String"/> {{>"systems/foundryvtt-reve-de-dragon/templates/heures-select-option.html"}}
</div> {{/select}}
<div class="form-group"> </select>
<label for="xp">Heure</label> </div>
<select name="system.heure" id="heure" data-dtype="String"> <div class="form-group">
{{#select system.heure}} <label for="xp">Purification</label>
{{>"systems/foundryvtt-reve-de-dragon/templates/heures-select-option.html"}} <input class="attribute-value" type="text" name="system.purification" value="{{system.purification}}" data-dtype="String"/>
{{/select}} </div>
</select> <div class="form-group">
</div> <label for="xp">Vêture</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.veture" value="{{system.veture}}" data-dtype="String"/>
<label for="xp">Purification</label> </div>
<input class="attribute-value" type="text" name="system.purification" value="{{system.purification}}" data-dtype="String"/> <div class="form-group">
</div> <label for="xp">Comportement</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.comportement" value="{{system.comportement}}" data-dtype="String"/>
<label for="xp">Vêture</label> </div>
<input class="attribute-value" type="text" name="system.veture" value="{{system.veture}}" data-dtype="String"/> <div class="form-group">
</div> <label for="xp">Case TMR</label>
<div class="form-group"> <select name="system.tmr" id="tmr" data-dtype="String">
<label for="xp">Comportement</label> {{#select system.tmr}}
<input class="attribute-value" type="text" name="system.comportement" value="{{system.comportement}}" data-dtype="String"/> {{>"systems/foundryvtt-reve-de-dragon/templates/sort-tmr.html"}}
</div> {{/select}}
<div class="form-group"> </select>
<label for="xp">Case TMR</label> </div>
<select name="system.tmr" id="tmr" data-dtype="String"> <div class="form-group">
{{#select system.tmr}} <label for="xp">Malus</label>
{{>"systems/foundryvtt-reve-de-dragon/templates/sort-tmr.html"}} {{#if isGM}}
{{/select}} <select name="system.malus" id="malus" data-dtype="Number">
</select> {{#select system.malus}}
</div> <option value="0">0</option>
<div class="form-group"> <option value="-1">-1</option>
<label for="xp">Malus</label> <option value="-2">-2</option>
{{#if isGM}} <option value="-3">-3</option>
<select name="system.malus" id="malus" data-dtype="Number"> <option value="-4">-4</option>
{{#select system.malus}} <option value="-5">-5</option>
<option value="0">0</option> <option value="-6">-6</option>
<option value="-1">-1</option> <option value="-7">-7</option>
<option value="-2">-2</option> <option value="-8">-8</option>
<option value="-3">-3</option> <option value="-9">-9</option>
<option value="-4">-4</option> <option value="-10">-10</option>
<option value="-5">-5</option> {{/select}}
<option value="-6">-6</option> </select>
<option value="-7">-7</option> {{else}}
<option value="-8">-8</option> <label>>{{system.malus}}</label>
<option value="-9">-9</option> {{/if}}
<option value="-10">-10</option> </div>
{{/select}}
</select>
{{else}}
<label>>{{system.malus}}</label>
{{/if}}
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,32 +1,24 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label for="xp">Quantité</label>
</header> <input class="attribute-value" type="text" name="system.quantite" value="{{system.quantite}}" data-dtype="Number"/>
</div>
{{!-- Sheet Body --}} <div class="form-group">
<section class="sheet-body"> <label for="xp">Valeur en Deniers</label>
<div class="form-group"> {{#if isGM}}
<label for="xp">Quantité</label> <input class="attribute-value" type="text" name="system.valeur_deniers" value="{{system.valeur_deniers}}" data-dtype="Number"/>
<input class="attribute-value" type="text" name="system.quantite" value="{{system.quantite}}" data-dtype="Number"/> {{else}}
</div> <label for="xp">{{system.valeur_deniers}}</label>
<div class="form-group"> {{/if}}
<label for="xp">Valeur en Deniers</label> </div>
{{#if isGM}} <div class="form-group">
<input class="attribute-value" type="text" name="system.valeur_deniers" value="{{system.valeur_deniers}}" data-dtype="Number"/> <label for="xp">Encombrement</label>
{{else}} <input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"/>
<label for="xp">{{system.valeur_deniers}}</label> </div>
{{/if}}
</div>
<div class="form-group">
<label for="xp">Encombrement</label>
<input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,32 +1,24 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label for="xp">Encombrement </label>
</header> <input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"/>
</div>
{{!-- Sheet Body --}} <div class="form-group">
<section class="sheet-body"> <label>Quantité </label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.quantite" value="{{system.quantite}}" data-dtype="Number" />
<label for="xp">Encombrement </label> </div>
<input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"/> <div class="form-group">
</div> <label for="xp">Qualité</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.qualite" value="{{system.qualite}}" data-dtype="Number"/>
<label>Quantité </label> </div>
<input class="attribute-value" type="text" name="system.quantite" value="{{system.quantite}}" data-dtype="Number" /> <div class="form-group item-cout">
</div> <label for="xp">Prix (sols) </label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"/>
<label for="xp">Qualité</label> </div>
<input class="attribute-value" type="text" name="system.qualite" value="{{system.qualite}}" data-dtype="Number"/>
</div>
<div class="form-group item-cout">
<label for="xp">Prix (sols) </label>
<input class="attribute-value" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,24 +1,16 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label class="alchimie-title" for="xp">Niveau</label>
</header> <input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>
{{!-- Sheet Body --}} <div class="form-group">
<section class="sheet-body"> <label>Référence / Auteur</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
<label class="alchimie-title" for="xp">Niveau</label> </div>
<input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label>Référence / Auteur</label>
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,30 +1,23 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label for="xp">Nombre</label>
</header> <input class="attribute-value" type="text" name="system.value" value="{{system.value}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Nombre valide ? </label>
<input class="attribute-value" type="checkbox" name="system.istrue" {{#if system.istrue}}checked{{/if}}/>
</div>
<div class="form-group">
<label for="xp">Index du jour concerné</label>
<input class="attribute-value" type="text" name="system.jourindex" value="{{system.jourindex}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Label du jour</label>
<input class="attribute-value" type="text" name="system.jourlabel" value="{{system.jourlabel}}" data-dtype="String"/>
</div>
{{!-- Sheet Body --}} </section>
<section class="sheet-body">
<div class="form-group">
<label for="xp">Nombre</label>
<input class="attribute-value" type="text" name="system.value" value="{{system.value}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Nombre valide ? </label>
<input class="attribute-value" type="checkbox" name="system.istrue" {{#if system.istrue}}checked{{/if}}/>
</div>
<div class="form-group">
<label for="xp">Index du jour concerné</label>
<input class="attribute-value" type="text" name="system.jourindex" value="{{system.jourindex}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Label du jour</label>
<input class="attribute-value" type="text" name="system.jourlabel" value="{{system.jourlabel}}" data-dtype="String"/>
</div>
</section>
</form> </form>

View File

@@ -1,11 +1,5 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
</div>
</header>
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
<section class="sheet-body"> <section class="sheet-body">
<div class="form-group"> <div class="form-group">
@@ -55,7 +49,5 @@
</div> </div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section> </section>
</form> </form>

View File

@@ -1,36 +1,28 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label for="xp">Encombrement </label>
</header> <input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"/>
</div>
{{!-- Sheet Body --}} <div class="form-group">
<section class="sheet-body"> <label>Quantité </label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.quantite" value="{{system.quantite}}" data-dtype="Number" />
<label for="xp">Encombrement </label> </div>
<input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"/> <div class="form-group">
</div> <label for="xp">Résistance</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.resistance" value="{{system.resistance}}" data-dtype="Number"/>
<label>Quantité </label> </div>
<input class="attribute-value" type="text" name="system.quantite" value="{{system.quantite}}" data-dtype="Number" /> <div class="form-group">
</div> <label for="xp">Qualité</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.qualite" value="{{system.qualite}}" data-dtype="Number"/>
<label for="xp">Résistance</label> </div>
<input class="attribute-value" type="text" name="system.resistance" value="{{system.resistance}}" data-dtype="Number"/> <div class="form-group item-cout">
</div> <label for="xp">Prix (sols) </label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"/>
<label for="xp">Qualité</label> </div>
<input class="attribute-value" type="text" name="system.qualite" value="{{system.qualite}}" data-dtype="Number"/>
</div>
<div class="form-group item-cout">
<label for="xp">Prix (sols) </label>
<input class="attribute-value" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,20 +1 @@
<form class="{{cssClass}}" autocomplete="off"> {{>"systems/foundryvtt-reve-de-dragon/templates/item-queue-sheet.html"}}
<header class="sheet-header">
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/>
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
</div>
</header>
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label for="xp">Refoulement</label>
<input class="attribute-value" type="text" name="system.refoulement" value="{{system.refoulement}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</form>

View File

@@ -1,29 +1,19 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label for="xp">Type de possession </label>
</header> <input class="attribute-value" type="text" name="system.typepossession" value="{{system.typepossession}}" data-dtype="String"/>
</div>
{{!-- Sheet Body --}} <div class="form-group">
<section class="sheet-body"> <label for="xp">Possédé ? </label>
<div class="form-group"> <input class="attribute-value" type="checkbox" name="system.istrue" {{#if system.istrue}}checked{{/if}}/>
<label for="xp">Type de possession </label> </div>
<input class="attribute-value" type="text" name="system.typepossession" value="{{system.typepossession}}" data-dtype="String"/> <div class="form-group">
</div> <label for="xp">Compteur </label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.compteur" value="{{system.compteur}}" data-dtype="Number"/>
<label for="xp">Possédé ? </label> </div>
<input class="attribute-value" type="checkbox" name="system.istrue" {{#if system.istrue}}checked{{/if}}/> {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</div> </section>
<div class="form-group">
<label for="xp">Compteur </label>
<input class="attribute-value" type="text" name="system.compteur" value="{{system.compteur}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</form> </form>

View File

@@ -1,20 +1,20 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label></label>
</header> <label class="attribute-value">{{#if (eq type 'ombre')}}Ombre de thanatos
{{else if (eq type 'queue')}}Queue de Dragon
{{!-- Sheet Body --}} {{/if}}
<section class="sheet-body"> </label>
<div class="form-group"> </div>
<label for="xp">Refoulement</label>
<input class="attribute-value" type="text" name="system.refoulement" value="{{system.refoulement}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} <div class="form-group">
<label for="system.refoulement">Refoulement</label>
</section> <input class="attribute-value" type="text" name="system.refoulement" value="{{system.refoulement}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</form> </form>

View File

@@ -1,44 +1,36 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label class="alchimie-title" for="xp">But</label>
</header> <input class="attribute-value" type="text" name="system.but" value="{{system.but}}" data-dtype="String"/>
</div>
{{!-- Sheet Body --}} <div class="flexcol">
<section class="sheet-body"> <span><label class="alchimie-title">Manipulation : </label></span>
<div class="form-group"> <div class="form-group medium-editor">
<label class="alchimie-title" for="xp">But</label> {{editor manipulation_update target="system.manipulation" button=true owner=owner editable=editable}}
<input class="attribute-value" type="text" name="system.but" value="{{system.but}}" data-dtype="String"/>
</div> </div>
<div class="flexcol"> </div>
<span><label class="alchimie-title">Manipulation : </label></span> <div class="flexcol">
<div class="form-group medium-editor"> <span><label class="alchimie-title">Utilisation : </label></span>
{{editor system.manipulation_update target="system.manipulation" button=true owner=owner editable=editable}} <div class="form-group small-editor">
</div> {{editor utilisation target="system.utilisation" button=true owner=owner editable=editable}}
</div> </div>
<div class="flexcol"> </div>
<span><label class="alchimie-title">Utilisation : </label></span> <div class="flexcol">
<div class="form-group small-editor"> <span><label class="alchimie-title">Enchantement : </label></span>
{{editor system.utilisation target="system.utilisation" button=true owner=owner editable=editable}} <div class="form-group small-editor">
</div> {{editor enchantement target="system.enchantement" button=true owner=owner editable=editable}}
</div> </div>
<div class="flexcol"> </div>
<span><label class="alchimie-title">Enchantement : </label></span> <div class="flexcol">
<div class="form-group small-editor"> <span><label class="alchimie-title">Sur-effet : </label></span>
{{editor system.enchantement target="system.enchantement" button=true owner=owner editable=editable}} <div class="form-group small-editor">
</div> {{editor sureffet target="system.sureffet" button=true owner=owner editable=editable}}
</div>
<div class="flexcol">
<span><label class="alchimie-title">Sur-effet : </label></span>
<div class="form-group small-editor">
{{editor system.sureffet target="system.sureffet" button=true owner=owner editable=editable}}
</div>
</div> </div>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,42 +1,34 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label>Niveau</label>
</header> <input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>
{{!-- Sheet Body --}} <div class="form-group">
<section class="sheet-body"> <label>Durée</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.duree" value="{{system.duree}}" data-dtype="String"/>
<label>Niveau</label> </div>system
<input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/> <div class="form-group">
</div> <label>Sust</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.sust" value="{{system.sust}}" data-dtype="Number"/>
<label>Durée</label> </div>
<input class="attribute-value" type="text" name="system.duree" value="{{system.duree}}" data-dtype="String"/> <div class="form-group">
</div>system <label>Exotisme</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.exotisme" value="{{system.exotisme}}" data-dtype="Number"/>
<label>Sust</label> </div>
<input class="attribute-value" type="text" name="system.sust" value="{{system.sust}}" data-dtype="Number"/> <div class="form-group">
</div> <label>Référence / Auteur</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
<label>Exotisme</label> </div>
<input class="attribute-value" type="text" name="system.exotisme" value="{{system.exotisme}}" data-dtype="Number"/> <div class="flexcol">
</div> <span><label>Ingrédients : </label></span>
<div class="form-group"> <div class="form-group editor">
<label>Référence / Auteur</label> {{editor ingredients target="system.ingredients" button=true owner=owner editable=editable}}
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>
<div class="flexcol">
<span><label>Ingrédients : </label></span>
<div class="form-group editor">
{{editor system.ingredients target="system.ingredients" button=true owner=owner editable=editable}}
</div>
</div> </div>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,16 +1,7 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</div> </section>
</header>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</form> </form>

View File

@@ -25,7 +25,7 @@
{{!-- Description Tab --}} {{!-- Description Tab --}}
<div class="tab" data-group="primary" data-tab="description"> <div class="tab" data-group="primary" data-tab="description">
{{editor system.description target="system.description" button=true owner=owner editable=editable}} {{editor description target="system.description" button=true owner=owner editable=editable}}
</div> </div>
{{!-- Attributes Tab --}} {{!-- Attributes Tab --}}

View File

@@ -37,17 +37,21 @@
<input class="attribute-value" type="text" name="system.duree" value="{{system.duree}}" data-dtype="String" /> <input class="attribute-value" type="text" name="system.duree" value="{{system.duree}}" data-dtype="String" />
</div> </div>
{{/if}} {{/if}}
<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 attribute-value" name="tmrs" id="tmrs" size={{tmrs.length}} multiple /> {{#each tmrs as |tmr key|}}
{{#each tmrs as |tmr key|}} <label class="flexrow">
<option class="option-tmr" value="{{tmr.name}}" {{#if tmr.selected}}selected{{/if}}>{{tmr.name}}</option> <input type="checkbox" data-dtype="Boolean" class="select-tmr"
{{/each}} data-tmr-name="{{tmr.name}}" {{#if tmr.selected}}checked{{/if}} />
</select> {{tmr.name}}
</label>
{{/each}}
</div>
</div> </div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section> </section>
</form> </form>

View File

@@ -1,82 +1,74 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label>Draconic</label>
</header> <select name="system.draconic" id="draconic" data-dtype="String">
{{#select system.draconic}}
{{!-- Sheet Body --}} {{>"systems/foundryvtt-reve-de-dragon/templates/sort-draconic.html"}}
<section class="sheet-body"> {{/select}}
<div class="form-group"> </select>
<label>Draconic </label> </div>
<select name="system.draconic" id="draconic" data-dtype="String"> <div class="form-group">
{{#select system.draconic}} <label for="system.caseTMR">Case TMR</label>
{{>"systems/foundryvtt-reve-de-dragon/templates/sort-draconic.html"}} <select name="system.caseTMR" id="caseTMR" data-dtype="String">
{{/select}} {{#select system.caseTMR}}
</select> {{>"systems/foundryvtt-reve-de-dragon/templates/sort-tmr.html"}}
</div> <option value="special">Case spéciale TMR (saisie ci-dessous)</option>
<div class="form-group"> {{/select}}
<label for="xp">Case TMR </label> </select>
<select name="system.caseTMR" id="caseTMR" data-dtype="String"> </div>
{{#select system.caseTMR}} <div class="form-group">
{{>"systems/foundryvtt-reve-de-dragon/templates/sort-tmr.html"}} <label for="system.caseTMRspeciale">Case TMR Spéciale</label>
<option value="special">Case spéciale TMR (saisie ci-dessous)</option> <input class="attribute-value" type="text" name="system.caseTMRspeciale" value="{{system.caseTMRspeciale}}" data-dtype="String"/>
{{/select}} </div>
</select> <div class="form-group">
</div> <label for="system.difficulte">Difficulté</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.difficulte" value="{{system.difficulte}}" data-dtype="String"/>
<label for="xp">Case TMR Spéciale </label> </div>
<input class="attribute-value" type="text" name="system.caseTMRspeciale" value="{{system.caseTMRspeciale}}" data-dtype="String"/> <div class="form-group">
</div> <label for="system.ptreve">Coût en Rêve</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.ptreve" value="{{system.ptreve}}" data-dtype="String"/>
<label for="xp">Difficulté </label> </div>
<input class="attribute-value" type="text" name="system.difficulte" value="{{system.difficulte}}" data-dtype="String"/> <div class="form-group">
</div> <label for="system.coutseuil">Coût en Seuil</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.coutseuil" value="{{system.coutseuil}}" data-dtype="Number"/>
<label for="xp">Coût en Rêve </label> </div>
<input class="attribute-value" type="text" name="system.ptreve" value="{{system.ptreve}}" data-dtype="String"/> <div class="form-group">
</div> <label for="system.isrituel">Rituel</label>
<div class="form-group"> <input class="attribute-value" type="checkbox" name="system.isrituel" {{#if system.isrituel}}checked{{/if}}/>
<label for="xp">Coût en Seuil </label> </div>
<input class="attribute-value" type="text" name="system.coutseuil" value="{{system.coutseuil}}" data-dtype="Number"/> <div class="form-group">
</div> <label for="system.duree">Durée</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.duree" value="{{system.duree}}" data-dtype="String"/>
<label for="rituel">Rituel </label> </div>
<input class="attribute-value" type="checkbox" name="system.isrituel" {{#if system.isrituel}}checked{{/if}}/> <div class="form-group">
</div> <label for="system.portee">Portée</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.portee" value="{{system.portee}}" data-dtype="String"/>
<label for="xp">Durée </label> </div>
<input class="attribute-value" type="text" name="system.duree" value="{{system.duree}}" data-dtype="String"/> <div class="form-group">
</div> <label for="system.cible">Cible</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.cible" value="{{system.cible}}" data-dtype="String"/>
<label for="xp">Portée </label> </div>
<input class="attribute-value" type="text" name="system.portee" value="{{system.portee}}" data-dtype="String"/> <div class="form-group">
</div> <label for="system.JR">Jet de Resistance</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.JR" value="{{system.JR}}" data-dtype="String"/>
<label for="xp">Cible </label> </div>
<input class="attribute-value" type="text" name="system.cible" value="{{system.cible}}" data-dtype="String"/> <div class="form-group">
</div> <label for="system.xp">XP</label>
<div class="form-group"> <input class="attribute-value" type="text" name="system.xp" value="{{system.xp}}" data-dtype="Number"/>
<label for="xp">Jet de Resistance</label> </div>
<input class="attribute-value" type="text" name="system.JR" value="{{system.JR}}" data-dtype="String"/> {{#if owner}}
</div> {{#each bonusCaseList as |bcData key|}}
<div class="form-group"> <div class="form-group">
<label for="xp">XP </label> <label for="caseValue">Case/Bonus :</label>
<input class="attribute-value" type="text" name="system.xp" value="{{system.xp}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="caseValue" value="{{bcData.case}}" data-dtype="String"/>
</div> <input class="attribute-value" type="text" name="bonusValue" value="{{bcData.bonus}}" data-dtype="Number"/>
{{#if owner}} </div>
{{#each bonusCaseList as |bcData key|}} {{/each}}
<div class="form-group"> {{/if}}
<label for="bonuscase">Case/Bonus :</label>
<input class="attribute-value" type="text" name="caseValue" value="{{bcData.case}}" data-dtype="String"/>
<input class="attribute-value" type="text" name="bonusValue" value="{{bcData.bonus}}" data-dtype="Number"/>
</div>
{{/each}}
{{/if}}
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -0,0 +1,45 @@
<form class="{{cssClass}}" autocomplete="off">
{{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<section class="sheet-body">
{{#if (and system.sortid sort)}}
<div class="form-group">
<label>Sort</label>
<label>{{sort.name}} - {{sort.system.draconic}} / {{sort.system.difficulte}}</label>
</div>
{{else}}
<div class="form-group">
<label>Draconic</label>
<select name="system.draconic" id="draconic" data-dtype="String">
{{#select system.draconic}}
{{>"systems/foundryvtt-reve-de-dragon/templates/sort-draconic.html"}}
{{/select}}
</select>
</div>
{{/if}}
<div class="form-group">
<label for="system.coord">Case TMR</label>
<input class="attribute-value" type="text" name="system.coord" value="{{system.coord}}" data-dtype="String"/>
</div>
<div class="form-group">
<label></label>
<label class="attribute-value" >{{caseTmr-label system.coord}}</label>
</div>
<div class="form-group">
<label for="system.ptreve">Rêve</label>
<input class="attribute-value" type="text" name="system.ptreve" value="{{system.ptreve}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="system.heurecible">Heure de naissance cible</label>
<select type="text" name="system.heurecible" value="{{system.heurecible}}" data-dtype="String">
{{#select system.heurecible}}
{{>"systems/foundryvtt-reve-de-dragon/templates/heures-select-option.html"}}
{{/select}}
</select>
</div>
<div class="form-group">
<label for="system.echectotal">Echec total</label>
<input class="attribute-value" type="checkbox" name="system.echectotal" {{#if system.echectotal}}checked{{/if}} />
</div>
</section>
</form>

View File

@@ -1,16 +1,8 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
</div>
</header>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,80 +1,72 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="form-group">
</div> <label for="xp">Caractéristique</label>
</header> <select name="system.carac" id="caracselect" data-dtype="String">
{{#select system.carac}}
{{!-- Sheet Body --}} {{#each caracList as |carac key|}}
<section class="sheet-body"> <option value="{{key}}">{{carac.label}}</option>
<div class="form-group"> {{/each}}
<label for="xp">Caractéristique</label> {{/select}}
<select name="system.carac" id="caracselect" data-dtype="String">
{{#select system.carac}}
{{#each caracList as |carac key|}}
<option value="{{key}}">{{carac.label}}</option>
{{/each}}
{{/select}}
</select>
</div>
<div class="form-group">
<label for="xp">Compétence</label>
<select name="system.competence" id="competenceselect" data-dtype="String">
{{#select system.competence}}
{{#each competences as |competence key|}}
<option value="{{competence.name}}">{{competence.name}}</option>
{{/each}}
{{/select}}
</select> </select>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="xp">Difficulté</label> <label for="xp">Compétence</label>
<input class="attribute-value" type="text" name="system.difficulte" value="{{system.difficulte}}" data-dtype="Number"/> <select name="system.competence" id="competenceselect" data-dtype="String">
</div> {{#select system.competence}}
<div class="form-group"> {{#each competences as |competence key|}}
<label for="xp">Périodicité</label> <option value="{{competence.name}}">{{competence.name}}</option>
<input class="attribute-value" type="text" name="system.periodicite" value="{{system.periodicite}}" data-dtype="String"/> {{/each}}
</div> {{/select}}
<div class="form-group"> </select>
<label for="xp">Fatigue</label> </div>
<input class="attribute-value" type="text" name="system.fatigue" value="{{system.fatigue}}" data-dtype="Number"/> <div class="form-group">
</div> <label for="xp">Difficulté</label>
{{#if isGM}} <input class="attribute-value" type="text" name="system.difficulte" value="{{system.difficulte}}" data-dtype="Number"/>
<div class="form-group"> </div>
<label for="xp">Cacher les Points de Tâches nécessaires au joueur</label> <div class="form-group">
<input class="attribute-value" type="checkbox" name="system.cacher_points_de_tache" value="{{system.cacher_points_de_tache}}" {{checked system.cacher_points_de_tache}}/> <label for="xp">Périodicité</label>
</div> <input class="attribute-value" type="text" name="system.periodicite" value="{{system.periodicite}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="xp">Fatigue</label>
<input class="attribute-value" type="text" name="system.fatigue" value="{{system.fatigue}}" data-dtype="Number"/>
</div>
{{#if isGM}}
<div class="form-group">
<label for="xp">Cacher les Points de Tâches nécessaires au joueur</label>
<input class="attribute-value" type="checkbox" name="system.cacher_points_de_tache" value="{{system.cacher_points_de_tache}}" {{checked system.cacher_points_de_tache}}/>
</div>
<div class="form-group">
<label for="xp">Points de tâches nécessaires</label>
<input class="attribute-value" type="text" name="system.points_de_tache" value="{{system.points_de_tache}}" data-dtype="Number"/>
</div>
{{else}}
<div class="form-group"> <div class="form-group">
<label for="xp">Points de tâches nécessaires</label> <label for="xp">Points de tâches nécessaires</label>
{{#if system.cacher_points_de_tache}}
<input class="attribute-value" type="text" value="?????" data-dtype="Number" disabled/>
{{else}}
<input class="attribute-value" type="text" name="system.points_de_tache" value="{{system.points_de_tache}}" data-dtype="Number"/> <input class="attribute-value" type="text" name="system.points_de_tache" value="{{system.points_de_tache}}" data-dtype="Number"/>
{{/if}}
</div> </div>
{{else}} {{/if}}
<div class="form-group"> <hr>
<label for="xp">Points de tâches nécessaires</label> <div class="form-group">
{{#if system.cacher_points_de_tache}} <label for="xp">Points de tâches obtenus</label>
<input class="attribute-value" type="text" value="?????" data-dtype="Number" disabled/> <input class="attribute-value" type="text" name="system.points_de_tache_courant" value="{{system.points_de_tache_courant}}" data-dtype="Number"/>
{{else}} </div>
<input class="attribute-value" type="text" name="system.points_de_tache" value="{{system.points_de_tache}}" data-dtype="Number"/> <div class="form-group">
{{/if}} <label for="xp">Nombre de Succès</label>
</div> <input class="attribute-value" type="text" name="system.nb_jet_succes" value="{{system.nb_jet_succes}}" data-dtype="Number" {{#if isGM}}{{else}}disabled{{/if}}/>
{{/if}} </div>
<hr> <div class="form-group">
<div class="form-group"> <label for="xp">Nombre d'Echecs</label>
<label for="xp">Points de tâches obtenus</label> <input class="attribute-value" type="text" name="system.nb_jet_echec" value="{{system.nb_jet_echec}}" data-dtype="Number" {{#if isGM}}{{else}}disabled{{/if}}/>
<input class="attribute-value" type="text" name="system.points_de_tache_courant" value="{{system.points_de_tache_courant}}" data-dtype="Number"/> </div>
</div>
<div class="form-group">
<label for="xp">Nombre de Succès</label>
<input class="attribute-value" type="text" name="system.nb_jet_succes" value="{{system.nb_jet_succes}}" data-dtype="Number" {{#if isGM}}{{else}}disabled{{/if}}/>
</div>
<div class="form-group">
<label for="xp">Nombre d'Echecs</label>
<input class="attribute-value" type="text" name="system.nb_jet_echec" value="{{system.nb_jet_echec}}" data-dtype="Number" {{#if isGM}}{{else}}disabled{{/if}}/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,29 +1,21 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1> <div class="flexcol">
</div> <div class="form-group">
</header> <label>Aspect</label>
<input class="attribute-value" type="text" name="system.concept" value="{{system.concept}}" data-dtype="String" />
{{!-- Sheet Body --}} </div>
<section class="sheet-body"> <div class="form-group">
<div class="flexcol"> <label>Sens</label>
<div class="form-group"> <select name="system.aspect" id="aspect" data-dtype="String">
<label>Aspect</label> {{#select system.aspect}}
<input class="attribute-value" type="text" name="system.concept" value="{{system.concept}}" data-dtype="String" /> {{>"systems/foundryvtt-reve-de-dragon/templates/enum-aspect-tarot.html"}}
</div> {{/select}}
<div class="form-group"> </select>
<label>Sens</label> </div>
<select name="system.aspect" id="aspect" data-dtype="String">
{{#select system.aspect}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-aspect-tarot.html"}}
{{/select}}
</select>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,16 +1,8 @@
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}"/> {{!-- Sheet Body --}}
<div class="header-fields"> <section class="sheet-body">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
</div>
</header>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</section>
</form> </form>

View File

@@ -1,14 +1,14 @@
<div class="flexcol"> <div class="flexcol">
<span><label>Description : </label></span> <span><label>Description : </label></span>
<div class="form-group editor"> <div class="form-group editor">
{{editor system.description target="system.description" button=true owner=owner editable=editable}} {{editor description target="system.description" button=true owner=owner editable=editable}}
</div> </div>
</div> </div>
{{#if isGM}} {{#if isGM}}
<div class="flexcol"> <div class="flexcol">
<span><label>Description (MJ seulement): </label></span> <span><label>Description (MJ seulement): </label></span>
<div class="form-group editor"> <div class="form-group editor">
{{editor system.descriptionmj target="system.descriptionmj" button=true owner=owner editable=editable}} {{editor descriptionmj target="system.descriptionmj" button=true owner=owner editable=editable}}
</div> </div>
</div> </div>
{{/if}} {{/if}}

View File

@@ -7,7 +7,7 @@
{{else}} {{else}}
<input class="resource-content select-effect" type="checkbox" name="{{effect.id}}" {{#if effect.active}}checked{{/if}}/> <input class="resource-content select-effect" type="checkbox" name="{{effect.id}}" {{#if effect.active}}checked{{/if}}/>
{{/if}} {{/if}}
<img class="button-effect-img" height="16" width="16" src="{{effect.icon}}" alt="{{ localize effect.label}}" /> <img class="button-effect-img" height="16" width="16" src="{{effect.icon}}" alt="{{localize effect.label}}" />
<label>{{localize effect.label}}</label> <label>{{localize effect.label}}</label>
</li> </li>
{{/each}} {{/each}}