Compare commits

..

15 Commits

Author SHA1 Message Date
4e8f6e8872 Merge pull request 'v10.7.17 - Le doigt du destin de Sémolosse' (#649) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: public/foundryvtt-reve-de-dragon#649
2023-06-05 20:14:00 +02:00
727701bdcd v10.7.17 2023-06-05 20:01:40 +02:00
dcc0f0acfd Fix: validation encaissement MJ 2023-06-05 19:58:57 +02:00
61eee66ebe Merge pull request 'v10.7.16 - La morsure de Sémolosse' (#648) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: public/foundryvtt-reve-de-dragon#648
2023-06-04 20:37:17 +02:00
c75d10f69b v10.7.16 - La morsure de Sémolosse 2023-06-04 02:41:06 +02:00
333bb051c1 Correction de liens
Quelques liens pointaient sur les icones du bazaar de forge-vtt
2023-06-04 02:36:40 +02:00
1bf247db33 Fix affichage des "objets" dans les commerces
La confusion entre les Item "objets" et le champ formData.objets
rendait les Item "objets" indisponibles (par exemple, les vêtements)
2023-06-04 02:36:40 +02:00
49fc2c9b0a Max release = v10 2023-05-29 13:32:22 +02:00
9013376096 Merge pull request 'v10.7.14 - l'expérience de Sémolosse' (#646) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: public/foundryvtt-reve-de-dragon#646
2023-05-29 07:46:20 +02:00
972459a08d Version 10.7.14 2023-05-28 22:05:36 +02:00
1607629365 Tri des listes d'items 2023-05-28 22:05:09 +02:00
8f7efdad87 Utilisation de la dateReel du calendrier 2023-05-28 22:04:03 +02:00
2dbe0dea4a Refonte du journal d'expérience
Reprise du journal d'expérience pour:
- afficher ancienne/nouvelle valeur
- la valeur du changement
- si c'est manuel / automatique
- identifier les dépenses de stress
- identifier les augmentations de compétences
- les changements des compteurs
2023-05-28 22:03:57 +02:00
5fc455fbad Ajout des acteurs accordés aux entités 2023-05-28 22:01:35 +02:00
8a7e4d3a9e Merge pull request 'Version 10.7.13 - L'armure de Semolosse' (#644) from VincentVk/foundryvtt-reve-de-dragon:v10 into v10
Reviewed-on: public/foundryvtt-reve-de-dragon#644
2023-05-25 20:35:39 +02:00
23 changed files with 166 additions and 257 deletions

4
.gitignore vendored
View File

@@ -8,7 +8,3 @@ todo.md
/jsconfig.json /jsconfig.json
/package.json /package.json
/package-lock.json /package-lock.json
/packs/*/
/packs/*/CURRENT
/packs/*/LOG
/packs/*/LOCK

View File

@@ -1,9 +1,13 @@
--- ---
# v11.0
# v10.7 - L'os de Semolosse # v10.7 - L'os de Semolosse
## v10.7.17 - le doigt du destin de Semolosse
- correction de la validation d'encaissement par le MJ
## v10.7.16 - la morsure de Semolosse
- correction de l'affichage des objets suite à confusion
- correction de liens dans la liste des équipements
## v10.7.14 - l'expérience de Semolosse ## v10.7.14 - l'expérience de Semolosse
- Affichage des personnages accordés sur les fiches des entités - Affichage des personnages accordés sur les fiches des entités
- Refonte du journal d'expérience - Refonte du journal d'expérience

View File

@@ -1,56 +1,54 @@
{ {
"TYPES": { "ACTOR": {
"Actor": { "TypePersonnage": "Personnage",
"Personnage": "Personnage", "TypeCreature": "Créature",
"Creature": "Créature", "TypeEntite": "Entité de cauchemar",
"Entite": "Entité de cauchemar", "TypeCommerce": "Commerce",
"Commerce": "Commerce", "TypeVehicule": "Véhicule"
"Vehicule": "Véhicule" },
}, "ITEM": {
"Item": { "TypeArme": "Arme",
"Arme": "Arme", "TypeArmure": "Armure",
"Armure": "Armure", "TypeBlessure": "Blessure",
"Blessure": "Blessure", "TypeCasetmr": "TMR spéciale",
"Casetmr": "TMR spéciale", "TypeChant": "Chant",
"Chant": "Chant", "TypeCompetence": "Compétence",
"Competence": "Compétence", "TypeCompetencecreature": "Compétence de créature",
"Competencecreature": "Compétence de créature", "TypeConteneur": "Conteneur",
"Conteneur": "Conteneur", "TypeDanse": "Danse",
"Danse": "Danse", "TypeExtraitpoetique": "Extrait poetique",
"Extraitpoetique": "Extrait poetique", "TypeFaune": "Faune",
"Faune": "Faune", "TypeGemme": "Gemme",
"Gemme": "Gemme", "TypeHerbe": "Herbe",
"Herbe": "Herbe", "TypeIngredient": "Ingrédient",
"Ingredient": "Ingrédient", "TypeJeu": "Jeu",
"Jeu": "Jeu", "TypeLivre": "Livre",
"Livre": "Livre", "TypeMaladie": "Maladie",
"Maladie": "Maladie", "TypeMeditation": "Méditation",
"Meditation": "Méditation", "TypeMonnaie": "Monnaie",
"Monnaie": "Monnaie", "TypeMunition": "Munition",
"Munition": "Munition", "TypeMusique": "Musique",
"Musique": "Musique", "TypeNombreastral": "Nombre astral",
"Nombreastral": "Nombre astral", "TypeNourritureboisson": "Nourriture & boisson",
"Nourritureboisson": "Nourriture & boisson", "TypeObjet": "Objet",
"Objet": "Objet", "TypeOeuvre": "Oeuvre",
"Oeuvre": "Oeuvre", "TypeOmbre": "Ombre de Thanatos",
"Ombre": "Ombre de Thanatos", "TypePlante": "Plante",
"Plante": "Plante", "TypePoison": "Poison",
"Poison": "Poison", "TypePossession": "Possession",
"Possession": "Possession", "TypePotion": "Potion",
"Potion": "Potion", "TypeQueue": "Queue de Dragon",
"Queue": "Queue de Dragon", "TypeRecettealchimique": "Recette alchimique",
"Recettealchimique": "Recette alchimique", "TypeRecettecuisine": "Recette de cuisine",
"Recettecuisine": "Recette de cuisine", "TypeRencontre": "Rencontre TMR",
"Rencontre": "Rencontre TMR", "TypeService": "Service",
"Service": "Service", "TypeSignedraconique": "Signe draconique",
"Signedraconique": "Signe draconique", "TypeSort": "Sort",
"Sort": "Sort", "TypeSortreserve": "Sort en réserve",
"Sortreserve": "Sort en réserve", "TypeSouffle": "Souffle de Dragon",
"Souffle": "Souffle de Dragon", "TypeTache": "Tâche",
"Tache": "Tâche", "TypeTarot": "Carte de tarot",
"Tarot": "Carte de tarot", "TypeTete": "te de Dragon"
"Tete": "Tête de Dragon"
}
}, },
"EFFECT": { "EFFECT": {
"StatusStunned": "Sonné", "StatusStunned": "Sonné",

View File

@@ -456,9 +456,9 @@ export class RdDActorSheet extends RdDBaseActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async selectTypeOeuvreToCreate() { async selectTypeOeuvreToCreate() {
let typeObjets = RdDItem.getTypesOeuvres(); let types = RdDItem.getTypesOeuvres();
let content = `<span class="competence-label">Selectionnez le type d'oeuvre</span><select class="item-type">`; let content = `<span class="competence-label">Selectionnez le type d'oeuvre</span><select class="item-type">`;
for (let typeName of typeObjets) { for (let typeName of types) {
content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>` content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
} }
content += '</select>'; content += '</select>';

View File

@@ -3204,25 +3204,31 @@ export class RdDActor extends RdDBaseActor {
if (attacker && !await attacker.accorder(this, 'avant-encaissement')) { if (attacker && !await attacker.accorder(this, 'avant-encaissement')) {
return; return;
} }
const attackerId = attacker?.id;
if (ReglesOptionelles.isUsing('validation-encaissement-gr') && !game.user.isGM) { if (ReglesOptionelles.isUsing('validation-encaissement-gr') && !game.user.isGM) {
RdDBaseActor.remoteActorCall({ RdDBaseActor.remoteActorCall({
actorId: this.id, actorId: this.id,
method: 'validerEncaissement', method: 'appliquerEncaissement',
args: [rollData, show] args: [rollData, show, attackerId]
}); });
return; return;
} }
await this.appliquerEncaissement(rollData, show, attackerId);
}
async appliquerEncaissement(rollData, show, attackerId) {
const armure = await this.computeArmure(rollData); const armure = await this.computeArmure(rollData);
if (ReglesOptionelles.isUsing('validation-encaissement-gr')) { if (ReglesOptionelles.isUsing('validation-encaissement-gr')) {
DialogValidationEncaissement.validerEncaissement(this, rollData, armure, show, (encaissement, show) => this._appliquerEncaissement(encaissement, show, attacker)); DialogValidationEncaissement.validerEncaissement(this, rollData, armure, show, attackerId, (encaissement, show, attackerId) => this._appliquerEncaissement(encaissement, show, attackerId));
} }
else { else {
let encaissement = await RdDUtility.jetEncaissement(rollData, armure, { showDice: SHOW_DICE }); let encaissement = await RdDUtility.jetEncaissement(rollData, armure, { showDice: SHOW_DICE });
await this._appliquerEncaissement(encaissement, show, attacker) await this._appliquerEncaissement(encaissement, show, attackerId);
} }
} }
async _appliquerEncaissement(encaissement, show, attacker) { async _appliquerEncaissement(encaissement, show, attackedId) {
const attacker = attackedId ? game.actors.get(attackedId) : undefined
let santeOrig = duplicate(this.system.sante); let santeOrig = duplicate(this.system.sante);
const blessure = await this.ajouterBlessure(encaissement, attacker); // Will update the result table const blessure = await this.ajouterBlessure(encaissement, attacker); // Will update the result table

View File

@@ -50,16 +50,16 @@ export class RdDBaseActorSheet extends ActorSheet {
encTotal: await this.actor.computeEncTotal(), encTotal: await this.actor.computeEncTotal(),
} }
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets); this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.inventaires);
this._appliquerRechercheObjets(formData.objets, formData.conteneurs); this._appliquerRechercheObjets(formData.conteneurs, formData.inventaires);
formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs); formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
return formData; return formData;
} }
_appliquerRechercheObjets(objets, conteneurs) { _appliquerRechercheObjets(conteneurs, inventaires) {
if (this.options.recherche?.text) { if (this.options.recherche?.text) {
const recherche = this.options.recherche; const recherche = this.options.recherche;
const allVisible = objets.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id); const allVisible = inventaires.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id);
let addVisible = conteneurs.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id) let addVisible = conteneurs.filter(it => it.isNomTypeLike(recherche.text)).map(it => it.id)
do { do {
allVisible.push(...addVisible) allVisible.push(...addVisible)
@@ -67,11 +67,11 @@ export class RdDBaseActorSheet extends ActorSheet {
addVisible = parentsIds.filter(id => !allVisible.includes(id)) addVisible = parentsIds.filter(id => !allVisible.includes(id))
} }
while (addVisible.length > 0) while (addVisible.length > 0)
objets.forEach(it => it.system.isHidden = !allVisible.includes(it.id)) inventaires.forEach(it => it.system.isHidden = !allVisible.includes(it.id))
conteneurs.forEach(it => it.system.isHidden = !allVisible.includes(it.id)) conteneurs.forEach(it => it.system.isHidden = !allVisible.includes(it.id))
} }
else { else {
objets.forEach(it => it.system.isHidden = false) inventaires.forEach(it => it.system.isHidden = false)
conteneurs.forEach(it => it.system.isHidden = false) conteneurs.forEach(it => it.system.isHidden = false)
} }
} }
@@ -118,9 +118,10 @@ export class RdDBaseActorSheet extends ActorSheet {
formData.herbes = Misc.arrayOrEmpty(itemTypes['herbe']); formData.herbes = Misc.arrayOrEmpty(itemTypes['herbe']);
formData.nourritureboissons = Misc.arrayOrEmpty(itemTypes['nourritureboisson']); formData.nourritureboissons = Misc.arrayOrEmpty(itemTypes['nourritureboisson']);
formData.gemmes = Misc.arrayOrEmpty(itemTypes['gemme']); formData.gemmes = Misc.arrayOrEmpty(itemTypes['gemme']);
formData.monnaie = Misc.arrayOrEmpty(itemTypes['monnaie']).sort(Monnaie.triValeurEntiere()); formData.monnaies = Misc.arrayOrEmpty(itemTypes['monnaie']).sort(Monnaie.triValeurEntiere());
formData.objets = Misc.arrayOrEmpty(itemTypes['objet'])
formData.objets = RdDItem.getItemTypesInventaire('all') formData.inventaires = RdDItem.getItemTypesInventaire('all')
.map(t => Misc.arrayOrEmpty(itemTypes[t])) .map(t => Misc.arrayOrEmpty(itemTypes[t]))
.reduce((a, b) => a.concat(b), []) .reduce((a, b) => a.concat(b), [])
.sort(Misc.ascending(it => it.name)); .sort(Misc.ascending(it => it.name));
@@ -230,9 +231,9 @@ export class RdDBaseActorSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async selectObjetTypeToCreate() { async selectObjetTypeToCreate() {
let typeObjets = this.getTypesInventaire().sort(Misc.ascending(type => Misc.typeName('Item', type))); let types = this.getTypesInventaire().sort(Misc.ascending(type => Misc.typeName('Item', type)));
let content = `<span class="competence-label">Selectionnez le type d'équipement</span><select class="item-type">`; let content = `<span class="competence-label">Selectionnez le type d'équipement</span><select class="item-type">`;
for (let typeName of typeObjets) { for (let typeName of types) {
content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>` content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
} }
content += '</select>'; content += '</select>';

View File

@@ -3,6 +3,7 @@ import { SYSTEM_SOCKET_ID } from "../constants.js";
import { Monnaie } from "../item-monnaie.js"; import { Monnaie } from "../item-monnaie.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { RdDAudio } from "../rdd-audio.js"; import { RdDAudio } from "../rdd-audio.js";
import { RdDConfirm } from "../rdd-confirm.js";
import { RdDUtility } from "../rdd-utility.js"; import { RdDUtility } from "../rdd-utility.js";
import { SystemCompendiums } from "../settings/system-compendiums.js"; import { SystemCompendiums } from "../settings/system-compendiums.js";
import { APP_ASTROLOGIE_REFRESH } from "../sommeil/app-astrologie.js"; import { APP_ASTROLOGIE_REFRESH } from "../sommeil/app-astrologie.js";

View File

@@ -7,7 +7,7 @@ import { RdDUtility } from "./rdd-utility.js";
*/ */
export class DialogValidationEncaissement extends Dialog { export class DialogValidationEncaissement extends Dialog {
static async validerEncaissement(actor, rollData, armure, show, onEncaisser) { static async validerEncaissement(actor, rollData, armure, show, attackerId, onEncaisser) {
let encaissement = await RdDUtility.jetEncaissement(rollData, armure, { showDice: HIDE_DICE }); let encaissement = await RdDUtility.jetEncaissement(rollData, armure, { showDice: HIDE_DICE });
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-validation-encaissement.html', { const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-validation-encaissement.html', {
actor: actor, actor: actor,
@@ -15,12 +15,12 @@ export class DialogValidationEncaissement extends Dialog {
encaissement: encaissement, encaissement: encaissement,
show: show show: show
}); });
const dialog = new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, show, onEncaisser); const dialog = new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, show, attackerId, onEncaisser);
dialog.render(true); dialog.render(true);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
constructor(html, actor, rollData, armure, encaissement, show, onEncaisser) { constructor(html, actor, rollData, armure, encaissement, show, attackerId, onEncaisser) {
// Common conf // Common conf
let buttons = { let buttons = {
"valider": { label: "Valider", callback: html => this.onValider() }, "valider": { label: "Valider", callback: html => this.onValider() },
@@ -48,6 +48,7 @@ export class DialogValidationEncaissement extends Dialog {
this.armure = armure; this.armure = armure;
this.encaissement = encaissement; this.encaissement = encaissement;
this.show = show; this.show = show;
this.attackerId = attackerId;
this.onEncaisser = onEncaisser; this.onEncaisser = onEncaisser;
this.forceDiceResult = {total: encaissement.roll.result }; this.forceDiceResult = {total: encaissement.roll.result };
} }
@@ -66,6 +67,6 @@ export class DialogValidationEncaissement extends Dialog {
async onValider() { async onValider() {
this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: SHOW_DICE, forceDiceResult: this.forceDiceResult}); this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: SHOW_DICE, forceDiceResult: this.forceDiceResult});
this.onEncaisser(this.encaissement, this.show) this.onEncaisser(this.encaissement, this.show, this.attackerId)
} }
} }

View File

@@ -15,6 +15,7 @@ export const TYPES = {
conteneur: 'conteneur', conteneur: 'conteneur',
sort: 'sort', sort: 'sort',
herbe: 'herbe', herbe: 'herbe',
plante: 'plante',
faune: 'faune', faune: 'faune',
ingredient: 'ingredient', ingredient: 'ingredient',
livre: 'livre', livre: 'livre',
@@ -34,6 +35,8 @@ export const TYPES = {
maladie: 'maladie', maladie: 'maladie',
poison: 'poison', poison: 'poison',
oeuvre: 'oeuvre', oeuvre: 'oeuvre',
monnaie: 'monnaie',
munition: 'munition',
nourritureboisson: 'nourritureboisson', nourritureboisson: 'nourritureboisson',
service: 'service', service: 'service',
signedraconique: 'signedraconique', signedraconique: 'signedraconique',
@@ -42,7 +45,8 @@ export const TYPES = {
sortreserve: 'sortreserve', sortreserve: 'sortreserve',
extraitpoetique: 'extraitpoetique', extraitpoetique: 'extraitpoetique',
tarot: 'tarot', tarot: 'tarot',
empoignade: 'empoignade' empoignade: 'empoignade',
objet: 'objet'
} }
const typesInventaireMateriel = [ const typesInventaireMateriel = [
TYPES.arme, TYPES.arme,

View File

@@ -29,7 +29,7 @@ export class RdDConteneurItemSheet extends RdDItemInventaireSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareConteneurData(formData) { prepareConteneurData(formData) {
RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes); RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets); this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.inventaires);
formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems; formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems;
} }

View File

@@ -58,15 +58,6 @@ export class RdDCarac {
selectedCarac?.label.match(/(Apparence|Force|Agilité|Dextérité|Vue|Ouïe|Odorat-Goût|Empathie|Dérobée|Mêlée|Tir|Lancer)/); selectedCarac?.label.match(/(Apparence|Force|Agilité|Dextérité|Vue|Ouïe|Odorat-Goût|Empathie|Dérobée|Mêlée|Tir|Lancer)/);
} }
static isIgnoreEtatGeneral(rollData) {
const selectedCarac = rollData.selectedCarac;
return !selectedCarac ||
rollData.ethylisme ||
RdDCarac.isChance(selectedCarac) ||
(RdDCarac.isReve(selectedCarac) && !rollData.competence);
}
static computeTotal(carac, beaute = undefined) { static computeTotal(carac, beaute = undefined) {
const total = Object.values(carac ?? {}).filter(c => !c.derivee) const total = Object.values(carac ?? {}).filter(c => !c.derivee)
.map(it => parseInt(it.value)) .map(it => parseInt(it.value))

View File

@@ -314,8 +314,8 @@ export class RdDRoll extends Dialog {
HtmlUtility.showControlWhen(this.html.find(".use-encTotal"), rollData.ajustements.encTotal.visible && RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac)); HtmlUtility.showControlWhen(this.html.find(".use-encTotal"), rollData.ajustements.encTotal.visible && RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac));
HtmlUtility.showControlWhen(this.html.find(".use-surenc"), rollData.ajustements.surenc.visible && RdDCarac.isActionPhysique(rollData.selectedCarac)); HtmlUtility.showControlWhen(this.html.find(".use-surenc"), rollData.ajustements.surenc.visible && RdDCarac.isActionPhysique(rollData.selectedCarac));
HtmlUtility.showControlWhen(this.html.find(".utilisation-moral"), rollData.use.appelAuMoral); HtmlUtility.showControlWhen(this.html.find(".utilisation-moral"), rollData.use.appelAuMoral);
HtmlUtility.showControlWhen(this.html.find(".diffMoral"), rollData.ajustements.moralTotal.used);
HtmlUtility.showControlWhen(this.html.find(".divAppelAuMoral"), rollData.use.appelAuMoral); HtmlUtility.showControlWhen(this.html.find(".divAppelAuMoral"), rollData.use.appelAuMoral);
HtmlUtility.showControlWhen(this.html.find(".diffMoral"), rollData.ajustements.moralTotal.used);
// Mise à jour valeurs // Mise à jour valeurs
this.html.find(".dialog-roll-title").text(this._getTitle(rollData)); this.html.find(".dialog-roll-title").text(this._getTitle(rollData));

View File

@@ -1052,7 +1052,6 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
static _computeEventOddq(origEvent) { static _computeEventOddq(origEvent) {
console.log("EVENT", origEvent)
let canvasRect = origEvent.target.getBoundingClientRect(); let canvasRect = origEvent.target.getBoundingClientRect();
let x = origEvent.clientX - canvasRect.left; let x = origEvent.clientX - canvasRect.left;
let y = origEvent.clientY - canvasRect.top; let y = origEvent.clientY - canvasRect.top;

View File

@@ -339,13 +339,13 @@ export class RdDUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static buildArbreDeConteneurs(conteneurs, objets) { static buildArbreDeConteneurs(conteneurs, inventaires) {
let objetVersConteneur = {}; let objetVersConteneur = {};
// Attribution des objets aux conteneurs // Attribution des objets aux conteneurs
for (let conteneur of conteneurs) { for (let conteneur of conteneurs) {
conteneur.subItems = []; conteneur.subItems = [];
for (let id of conteneur.system.contenu ?? []) { for (let id of conteneur.system.contenu ?? []) {
let objet = objets.find(objet => (id == objet._id)); let objet = inventaires.find(objet => (id == objet._id));
if (objet) { if (objet) {
objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template
objetVersConteneur[id] = conteneur._id; objetVersConteneur[id] = conteneur._id;
@@ -354,20 +354,20 @@ export class RdDUtility {
} }
} }
for (let conteneur of conteneurs) { for (let conteneur of conteneurs) {
conteneur.system.encTotal = RdDUtility.calculEncContenu(conteneur, objets); conteneur.system.encTotal = RdDUtility.calculEncContenu(conteneur, inventaires);
} }
return objetVersConteneur; return objetVersConteneur;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static calculEncContenu(conteneur, objets) { static calculEncContenu(conteneur, inventaires) {
const contenus = (conteneur.system.contenu ?? []).filter(id => id != undefined) const contenus = (conteneur.system.contenu ?? []).filter(id => id != undefined)
.map(id => objets.find(it => (id == it.id))) .map(id => inventaires.find(it => (id == it.id)))
.filter(it => it); .filter(it => it);
let enc = Number(conteneur.system.encombrement ?? 0) * Number(conteneur.system.quantite ?? 1); let enc = Number(conteneur.system.encombrement ?? 0) * Number(conteneur.system.quantite ?? 1);
for (let contenu of contenus) { for (let contenu of contenus) {
if (contenu.type == 'conteneur') { if (contenu.type == 'conteneur') {
enc += RdDUtility.calculEncContenu(contenu, objets); enc += RdDUtility.calculEncContenu(contenu, inventaires);
} }
else { else {
enc += Number(contenu.system.encombrement ?? 0) * Number(contenu.system.quantite ?? 1) enc += Number(contenu.system.encombrement ?? 0) * Number(contenu.system.quantite ?? 1)

View File

@@ -51,7 +51,7 @@ export const referenceAjustements = {
getValue: (rollData, actor) => RdDBonus.find(rollData.surpriseDefenseur).attaque, getValue: (rollData, actor) => RdDBonus.find(rollData.surpriseDefenseur).attaque,
}, },
etat: { etat: {
isUsed: (rollData, actor) => !RdDCarac.isIgnoreEtatGeneral(rollData), isUsed: (rollData, actor) => !RollDataAjustements.isIgnoreEtatGeneral(rollData),
getLabel: (rollData, actor) => 'Etat général', getLabel: (rollData, actor) => 'Etat général',
getValue: (rollData, actor) => actor.getEtatGeneral({ ethylisme: rollData.forceAlcool != undefined }) getValue: (rollData, actor) => actor.getEtatGeneral({ ethylisme: rollData.forceAlcool != undefined })
}, },
@@ -177,4 +177,11 @@ export class RollDataAjustements {
return sum; return sum;
} }
static isIgnoreEtatGeneral(rollData) {
const selectedCarac = rollData.selectedCarac;
return !selectedCarac ||
rollData.ethylisme ||
RdDCarac.isChance(selectedCarac) ||
(RdDCarac.isReve(selectedCarac) && !rollData.competence);
}
} }

View File

@@ -105,11 +105,10 @@ export class RdDCalendrier extends Application {
} }
return buttons return buttons
} }
async maximize() {
/*async maximize() {
await super.maximize() await super.maximize()
this.render(true) this.render(true)
}*/ }
async close() { } async close() { }
@@ -274,7 +273,6 @@ export class RdDCalendrier extends Application {
/* -------------------------------------------- */ /* -------------------------------------------- */
async rebuildNombresAstraux(showDice = HIDE_DICE) { async rebuildNombresAstraux(showDice = HIDE_DICE) {
if (Misc.isUniqueConnectedGM()) { if (Misc.isUniqueConnectedGM()) {
console.log("Astral rebuild")
let newList = []; let newList = [];
for (let i = 0; i < MAX_NOMBRE_ASTRAL; i++) { for (let i = 0; i < MAX_NOMBRE_ASTRAL; i++) {
let dayIndex = this.timestamp.indexDate + i; let dayIndex = this.timestamp.indexDate + i;

View File

@@ -1,10 +1,8 @@
import { Draconique } from "./draconique.js"; import { Draconique } from "./draconique.js";
import { PixiTMR } from "./pixi-tmr.js";
export class CarteTmr extends Draconique { export class CarteTmr extends Draconique {
constructor() { constructor() {
console.log("Sprite create 1!!!!")
super(); super();
} }

View File

@@ -91,8 +91,6 @@ export class Draconique {
coordTMR: coordTMR coordTMR: coordTMR
}; };
token[type ?? this.code()] = linkData; token[type ?? this.code()] = linkData;
console.log("SPRITE: ", token.sprite)
//PixiTMR.getImgFromCode()
pixiTMR.addTooltip(token.sprite, this.tooltip(linkData)); pixiTMR.addTooltip(token.sprite, this.tooltip(linkData));
return token; return token;
} }

View File

@@ -20,20 +20,18 @@ export class PixiTMR {
this.callbacksOnAnimate = []; this.callbacksOnAnimate = [];
} }
async load( onLoad = (loader, resources) => {} ) { load( onLoad = (loader, resources) => {} ) {
// WIP - Deprecated since v7 : let loader = new PIXI.Loader(); let loader = this.pixiApp.loader;
for (const [name, img] of Object.entries(PixiTMR.textures)) { for (const [name, img] of Object.entries(PixiTMR.textures)) {
const texture = await PIXI.Assets.load(img); loader = loader.add(name, img);
let image = PIXI.Sprite.from(texture);
} }
onLoad(); loader.onError.add((error, reason) => { console.log("ERROR", error, reason) });
for (let onAnimate of this.callbacksOnAnimate) { loader.load( (loader, resources) => {
onAnimate(); onLoad(loader, resources);
} for (let onAnimate of this.callbacksOnAnimate) {
} onAnimate();
}
static getImgFromCode(code) { });
return PixiTMR.textures[code]
} }
static register(name, img) { static register(name, img) {
@@ -46,9 +44,7 @@ export class PixiTMR {
} }
carteTmr(code) { carteTmr(code) {
let img = PixiTMR.getImgFromCode(code) const carteTmr = new PIXI.Sprite(PIXI.utils.TextureCache[code]);
const carteTmr = new PIXI.Sprite(PIXI.utils.TextureCache[img]);
console.log(code, carteTmr)
// Setup the position of the TMR // Setup the position of the TMR
carteTmr.x = 0; carteTmr.x = 0;
carteTmr.y = 0; carteTmr.y = 0;
@@ -56,8 +52,7 @@ export class PixiTMR {
carteTmr.height = 860; carteTmr.height = 860;
// Rotate around the center // Rotate around the center
carteTmr.anchor.set(0); carteTmr.anchor.set(0);
carteTmr.eventMode = 'dynamic'; // PIXI 7 : Not sure .. carteTmr.interactive = true;
// This one is deprecated ; carteTmr.interactive = true;
carteTmr.buttonMode = true; carteTmr.buttonMode = true;
carteTmr.tmrObject = this; carteTmr.tmrObject = this;
if (!this.tmrObject.viewOnly) { if (!this.tmrObject.viewOnly) {
@@ -68,10 +63,9 @@ export class PixiTMR {
} }
sprite(code, options = {}) { sprite(code, options = {}) {
let img = PixiTMR.getImgFromCode(code) const texture = PIXI.utils.TextureCache[code];
const texture = PIXI.utils.TextureCache[img];
if (!texture) { if (!texture) {
console.error("Texture manquante", code, PIXI.utils.TextureCache) console.error("Texture manquante", code)
return; return;
} }
let sprite = new PIXI.Sprite(texture); let sprite = new PIXI.Sprite(texture);
@@ -103,8 +97,7 @@ export class PixiTMR {
sprite.tooltip = new PIXI.Text(text, tooltipStyle); sprite.tooltip = new PIXI.Text(text, tooltipStyle);
sprite.tooltip.zIndex = tmrTokenZIndex.tooltip; sprite.tooltip.zIndex = tmrTokenZIndex.tooltip;
sprite.isOver = false; sprite.isOver = false;
// Deprecated : sprite.interactive = true; sprite.interactive = true;
sprite.eventMode = 'dynamic'; // PIXI 7 To be checked
sprite.on('pointerdown', event => this.onClickBackground(event)) sprite.on('pointerdown', event => this.onClickBackground(event))
.on('pointerover', () => this.onShowTooltip(sprite)) .on('pointerover', () => this.onShowTooltip(sprite))
.on('pointerout', () => this.onHideTooltip(sprite)); .on('pointerout', () => this.onHideTooltip(sprite));

View File

@@ -1,13 +1,13 @@
{ {
"id": "foundryvtt-reve-de-dragon", "id": "foundryvtt-reve-de-dragon",
"title": "Rêve de Dragon", "title": "Rêve de Dragon",
"version": "11.0.4", "version": "10.7.17",
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.0.4.zip", "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.7.17.zip",
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v11/system.json", "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v10/system.json",
"compatibility": { "compatibility": {
"minimum": "11", "minimum": "10",
"verified": "11", "verified": "10",
"maximum": "11" "maximum": "10"
}, },
"description": "Rêve de Dragon RPG for FoundryVTT", "description": "Rêve de Dragon RPG for FoundryVTT",
"authors": [ "authors": [
@@ -69,10 +69,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/competences.db", "path": "packs/competences.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -81,9 +78,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/arts-et-divertissements.db", "path": "packs/arts-et-divertissements.db",
"type": "Item", "type": "Item",
"ownership": { "private": false,
"PLAYER": "OBSERVER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -92,10 +87,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/competences-creatures.db", "path": "packs/competences-creatures.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -104,10 +96,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/competences-entites.db", "path": "packs/competences-entites.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -116,9 +105,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/sorts-oniros.db", "path": "packs/sorts-oniros.db",
"type": "Item", "type": "Item",
"ownership": { "private": false,
"PLAYER": "OBSERVER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -127,9 +114,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/sorts-hypnos.db", "path": "packs/sorts-hypnos.db",
"type": "Item", "type": "Item",
"ownership": { "private": false,
"PLAYER": "OBSERVER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -138,9 +123,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/sorts-narcos.db", "path": "packs/sorts-narcos.db",
"type": "Item", "type": "Item",
"ownership": { "private": false,
"PLAYER": "OBSERVER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -149,9 +132,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/sorts-thanatos.db", "path": "packs/sorts-thanatos.db",
"type": "Item", "type": "Item",
"ownership": { "private": false,
"PLAYER": "OBSERVER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -160,9 +141,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/equipement.db", "path": "packs/equipement.db",
"type": "Item", "type": "Item",
"ownership": { "private": false,
"PLAYER": "OBSERVER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -171,10 +150,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/maladies-et-poisons.db", "path": "packs/maladies-et-poisons.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -183,9 +159,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/rappel-des-regles.db", "path": "packs/rappel-des-regles.db",
"type": "JournalEntry", "type": "JournalEntry",
"ownership": { "private": false,
"PLAYER": "OBSERVER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -194,9 +168,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/macros.db", "path": "packs/macros.db",
"type": "Macro", "type": "Macro",
"ownership": { "private": false,
"PLAYER": "OBSERVER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -205,10 +177,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/queues-de-dragon.db", "path": "packs/queues-de-dragon.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -217,10 +186,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/ombres-de-thanatos.db", "path": "packs/ombres-de-thanatos.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -229,10 +195,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/souffles-de-dragon.db", "path": "packs/souffles-de-dragon.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -241,9 +204,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/tarot-draconique.db", "path": "packs/tarot-draconique.db",
"type": "Item", "type": "Item",
"ownership": { "private": false,
"PLAYER": "OBSERVER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -252,9 +213,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/extrait-poetique.db", "path": "packs/extrait-poetique.db",
"type": "Item", "type": "Item",
"ownership": { "private": false,
"PLAYER": "OBSERVER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -263,10 +222,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/tetes-de-dragon-pour-haut-revants.db", "path": "packs/tetes-de-dragon-pour-haut-revants.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -275,10 +231,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/tetes-de-dragon-pour-tous-personnages.db", "path": "packs/tetes-de-dragon-pour-tous-personnages.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -287,10 +240,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/rencontres.db", "path": "packs/rencontres.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -299,10 +249,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/tables-diverses.db", "path": "packs/tables-diverses.db",
"type": "RollTable", "type": "RollTable",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -311,10 +258,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/animaux.db", "path": "packs/animaux.db",
"type": "Actor", "type": "Actor",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -323,10 +267,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/voyageurs.db", "path": "packs/voyageurs.db",
"type": "Actor", "type": "Actor",
"ownership": { "private": false,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -335,10 +276,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/vehicules.db", "path": "packs/vehicules.db",
"type": "Actor", "type": "Actor",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -347,10 +285,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/archetypes.db", "path": "packs/archetypes.db",
"type": "Actor", "type": "Actor",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -359,10 +294,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/humanoides.db", "path": "packs/humanoides.db",
"type": "Actor", "type": "Actor",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -371,10 +303,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/entites-de-cauchemar.db", "path": "packs/entites-de-cauchemar.db",
"type": "Actor", "type": "Actor",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -383,10 +312,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/invocations.db", "path": "packs/invocations.db",
"type": "Actor", "type": "Actor",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -395,10 +321,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/faune-flore-mineraux.db", "path": "packs/faune-flore-mineraux.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -407,10 +330,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/meditations-et-ecrits.db", "path": "packs/meditations-et-ecrits.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -419,10 +339,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/recettes-alchimiques.db", "path": "packs/recettes-alchimiques.db",
"type": "Item", "type": "Item",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
}, },
{ {
@@ -431,10 +348,7 @@
"system": "foundryvtt-reve-de-dragon", "system": "foundryvtt-reve-de-dragon",
"path": "packs/scenes-rdd.db", "path": "packs/scenes-rdd.db",
"type": "Scene", "type": "Scene",
"ownership": { "private": true,
"PLAYER": "NONE",
"ASSISTANT": "OWNER"
},
"flags": {} "flags": {}
} }
], ],

View File

@@ -25,7 +25,7 @@
<span class="equipement-detail">Prix (sols)</span> <span class="equipement-detail">Prix (sols)</span>
<span class="equipement-actions">Actions</span> <span class="equipement-actions">Actions</span>
</li> </li>
{{#each (trier objets) as |item id|}} {{#each (trier inventaires) as |item id|}}
{{#unless item.estContenu}} {{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}} {{#if (ne item.type 'conteneur')}}
{{buildLigneInventaire item ../options}} {{buildLigneInventaire item ../options}}

View File

@@ -1,7 +1,7 @@
{{#if @root.options.isObserver}} {{#if @root.options.isObserver}}
<span class="item-name"><h4>Argent et Monnaies (fortune: {{calc.fortune.sols}} sols {{calc.fortune.deniers}} deniers)</h4></span> <span class="item-name"><h4>Argent et Monnaies (fortune: {{calc.fortune.sols}} sols {{calc.fortune.deniers}} deniers)</h4></span>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each monnaie as |piece id|}} {{#each monnaies as |piece id|}}
<li class="item flexrow list-item" data-item-id="{{piece._id}}"> <li class="item flexrow list-item" data-item-id="{{piece._id}}">
<img class="sheet-competence-img" src="{{piece.img}}" title="{{piece.name}}"/> <img class="sheet-competence-img" src="{{piece.img}}" title="{{piece.name}}"/>
<span class="equipement-nom">{{piece.name}}</span> <span class="equipement-nom">{{piece.name}}</span>

View File

@@ -22,7 +22,7 @@
<span class="equipement-detail">Enc.</span> <span class="equipement-detail">Enc.</span>
<span class="equipement-actions">Actions</span> <span class="equipement-actions">Actions</span>
</li> </li>
{{#each objets as |item id|}} {{#each inventaires as |item id|}}
{{#unless item.estContenu}} {{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}} {{#if (ne item.type 'conteneur')}}
{{buildLigneInventaire item @root.options}} {{buildLigneInventaire item @root.options}}