Compare commits
	
		
			12 Commits
		
	
	
		
			foundryvtt
			...
			foundryvtt
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f027e3318b | |||
| 
						 | 
					31b4d1cfcc | ||
| 
						 | 
					5056c35038 | ||
| 
						 | 
					7b58407634 | ||
| 
						 | 
					7efa7be1c0 | ||
| 
						 | 
					717bb6fc6e | ||
| 51273bcc3e | |||
| 
						 | 
					b8f3a9af27 | ||
| 
						 | 
					ab704c46d2 | ||
| 
						 | 
					db8fd6dbf8 | ||
| 
						 | 
					d998a4cb08 | ||
| 
						 | 
					b1e27a9597 | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/cerf.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/chevre.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/crabe.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/lapin.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 8.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/oie.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/oiseau.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 8.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/poisson.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/raton-laveur.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/rongeur.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/saumon.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 8.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icons/faune/singe-vert.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.9 KiB  | 
@@ -20,6 +20,7 @@
 | 
			
		||||
    "TypeMonnaie": "Monnaie",
 | 
			
		||||
    "TypeHerbe": "Herbe ou plante",
 | 
			
		||||
    "TypeIngredient": "Ingrédient",
 | 
			
		||||
    "TypeFaune": "Faune",
 | 
			
		||||
    "TypeLivre": "Livre",
 | 
			
		||||
    "TypePotion": "Potion",
 | 
			
		||||
    "TypeArme": "Arme",
 | 
			
		||||
 
 | 
			
		||||
@@ -132,10 +132,12 @@ export class RdDActorSheet extends ActorSheet {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _onDropItem(event, dragData) {
 | 
			
		||||
    const destItemId = $(event.target)?.closest('.item').attr('data-item-id')
 | 
			
		||||
    const dropParams = RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor.id, dragData, this.objetVersConteneur)
 | 
			
		||||
    const callSuper = await this.actor.processDropItem(dropParams)
 | 
			
		||||
    if (callSuper) {
 | 
			
		||||
      await super._onDropItem(event, dragData)
 | 
			
		||||
    const dropParams = RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor, dragData, this.objetVersConteneur)
 | 
			
		||||
    if (dropParams) {
 | 
			
		||||
      const callSuper = await this.actor.processDropItem(dropParams)
 | 
			
		||||
      if (callSuper) {
 | 
			
		||||
        await super._onDropItem(event, dragData)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -162,31 +164,11 @@ export class RdDActorSheet extends ActorSheet {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor);
 | 
			
		||||
      RdDSheetUtility.splitItem(item, this.actor);
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-edit').click(async event => {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor)
 | 
			
		||||
      item.sheet.render(true)
 | 
			
		||||
    })
 | 
			
		||||
    html.find('.display-label a').click(async event => {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor);
 | 
			
		||||
      item.sheet.render(true);
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-delete').click(async event => {
 | 
			
		||||
      const li = RdDSheetUtility.getEventElement(event);
 | 
			
		||||
      const item = this.actor.getObjet(li.data("item-id"));
 | 
			
		||||
      RdDUtility.confirmerSuppressionItem(this, item, li);
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-vendre').click(async event => {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor);
 | 
			
		||||
      item?.proposerVente();
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-montrer').click(async event => {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor);
 | 
			
		||||
      item?.postItem();
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-action').click(async event => {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor)
 | 
			
		||||
      this.actor.actionItem(item);
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true))
 | 
			
		||||
    html.find('.item-delete').click(async event => RdDUtility.confirmerSuppressionItem(this, RdDSheetUtility.getItem(event, this.actor)));
 | 
			
		||||
    html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente());
 | 
			
		||||
    html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem());
 | 
			
		||||
    html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor));
 | 
			
		||||
    html.find('.subacteur-delete').click(async event => {
 | 
			
		||||
      const li = RdDSheetUtility.getEventElement(event);
 | 
			
		||||
      const actorId = li.data("actor-id");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										282
									
								
								module/actor.js
									
									
									
									
									
								
							
							
						
						@@ -145,7 +145,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
    // Make separate methods for each Actor type (character, npc, etc.) to keep
 | 
			
		||||
    // things organized.
 | 
			
		||||
    if (this.isPersonnage()) this._prepareCharacterData(this)
 | 
			
		||||
    if (this.isCreature()) this._prepareCreatureData(this)
 | 
			
		||||
    if (this.isCreatureEntite()) this._prepareCreatureData(this)
 | 
			
		||||
    if (this.isVehicule()) this._prepareVehiculeData(this)
 | 
			
		||||
    this.computeEtatGeneral();
 | 
			
		||||
  }
 | 
			
		||||
@@ -193,10 +193,36 @@ export class RdDActor extends Actor {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  canReceive(item) {
 | 
			
		||||
    if (this.isCreature()) {
 | 
			
		||||
      return item.type == 'competencecreature' || RdDItem.isItemInventaire(item);
 | 
			
		||||
    }
 | 
			
		||||
    if (this.isEntite()) {
 | 
			
		||||
      return item.type == 'competencecreature';
 | 
			
		||||
    }
 | 
			
		||||
    if (this.isVehicule()) {
 | 
			
		||||
      return RdDItem.isItemInventaire(item);
 | 
			
		||||
    }
 | 
			
		||||
    if (this.isPersonnage()) {
 | 
			
		||||
      switch (item.type) {
 | 
			
		||||
        case 'competencecreature': case 'tarot':
 | 
			
		||||
          return false;
 | 
			
		||||
      }
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  isCreature() {
 | 
			
		||||
  isCreatureEntite() {
 | 
			
		||||
    return this.type == 'creature' || this.type == 'entite';
 | 
			
		||||
  }
 | 
			
		||||
  isCreature() {
 | 
			
		||||
    return this.type == 'creature';
 | 
			
		||||
  }
 | 
			
		||||
  isEntite() {
 | 
			
		||||
    return this.type == 'entite';
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  isPersonnage() {
 | 
			
		||||
    return this.type == 'personnage';
 | 
			
		||||
@@ -224,7 +250,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  getReveActuel() {
 | 
			
		||||
    switch(this.type) {
 | 
			
		||||
    switch (this.type) {
 | 
			
		||||
      case 'personnage':
 | 
			
		||||
        return Misc.toInt(this.system.reve?.reve?.value ?? this.carac.reve.value);
 | 
			
		||||
      case 'creature':
 | 
			
		||||
@@ -232,7 +258,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
        return Misc.toInt(this.system.carac.reve?.value)
 | 
			
		||||
      case 'vehicule':
 | 
			
		||||
      default:
 | 
			
		||||
         return 0;
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -374,8 +400,8 @@ export class RdDActor extends Actor {
 | 
			
		||||
      return duplicate(possessions[0]);
 | 
			
		||||
    }
 | 
			
		||||
    const draconics = [...this.getDraconicList().filter(it => it.system.niveau >= 0),
 | 
			
		||||
       POSSESSION_SANS_DRACONIC]
 | 
			
		||||
       .sort(Misc.descending(it => it.system.niveau));
 | 
			
		||||
      POSSESSION_SANS_DRACONIC]
 | 
			
		||||
      .sort(Misc.descending(it => it.system.niveau));
 | 
			
		||||
    return duplicate(draconics[0]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -594,18 +620,18 @@ export class RdDActor extends Actor {
 | 
			
		||||
      content: 'Remise à neuf de ' + this.name
 | 
			
		||||
    });
 | 
			
		||||
    const updates = {
 | 
			
		||||
      'system.sante.endurance.value' : this.system.sante.endurance.max
 | 
			
		||||
      'system.sante.endurance.value': this.system.sante.endurance.max
 | 
			
		||||
    };
 | 
			
		||||
    if (!this.isEntite([ENTITE_INCARNE, ENTITE_BLURETTE])) {
 | 
			
		||||
      if (this.system.blessures) {
 | 
			
		||||
        updates['system.blessures.legeres.liste'] = [PAS_DE_BLESSURE, PAS_DE_BLESSURE, PAS_DE_BLESSURE, PAS_DE_BLESSURE, PAS_DE_BLESSURE];
 | 
			
		||||
        updates['system.blessures.graves.liste'] =  [PAS_DE_BLESSURE, PAS_DE_BLESSURE];
 | 
			
		||||
        updates['system.blessures.graves.liste'] = [PAS_DE_BLESSURE, PAS_DE_BLESSURE];
 | 
			
		||||
        updates['system.blessures.critiques.liste'] = [PAS_DE_BLESSURE];
 | 
			
		||||
      }
 | 
			
		||||
      updates['system.sante.vie.value'] = this.system.sante.vie.max;
 | 
			
		||||
      updates['system.sante.fatigue.value'] = 0;
 | 
			
		||||
      if (this.isPersonnage()) {
 | 
			
		||||
        updates['system.compteurs.ethylisme'] = { value:1, nb_doses: 0, jet_moral: false};
 | 
			
		||||
        updates['system.compteurs.ethylisme'] = { value: 1, nb_doses: 0, jet_moral: false };
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    await this.update(updates);
 | 
			
		||||
@@ -783,8 +809,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
        name: 'maitrise',
 | 
			
		||||
        label: 'Maîtriser le Rêve de Dragon',
 | 
			
		||||
        callbacks: [
 | 
			
		||||
          { action: async r => 
 | 
			
		||||
            this.resultCombatReveDeDragon(r) }
 | 
			
		||||
          { action: async r => this.resultCombatReveDeDragon(r) }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    );
 | 
			
		||||
@@ -803,11 +828,12 @@ export class RdDActor extends Actor {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async sortMisEnReserve(sort, draconic, coord, ptreve) {
 | 
			
		||||
    await this.createEmbeddedDocuments("Item", [{
 | 
			
		||||
        type: 'sortreserve',
 | 
			
		||||
        name: sort.name,
 | 
			
		||||
        img: sort.img,
 | 
			
		||||
        system: { sortid: sort._id, draconic: (draconic?.name ?? sort.system.draconic), ptreve: ptreve, coord: coord, heurecible: 'Vaisseau' } }],
 | 
			
		||||
        { renderSheet: false});
 | 
			
		||||
      type: 'sortreserve',
 | 
			
		||||
      name: sort.name,
 | 
			
		||||
      img: sort.img,
 | 
			
		||||
      system: { sortid: sort._id, draconic: (draconic?.name ?? sort.system.draconic), ptreve: ptreve, coord: coord, heurecible: 'Vaisseau' }
 | 
			
		||||
    }],
 | 
			
		||||
      { renderSheet: false });
 | 
			
		||||
    this.currentTMR.updateTokens();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -897,7 +923,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    const xpUtilise = Math.max(0, Math.min(stress, xpRequis));
 | 
			
		||||
    const gainNiveau = (xpUtilise >= xpRequis || xpRequis <=0) ? 1 : 0;
 | 
			
		||||
    const gainNiveau = (xpUtilise >= xpRequis || xpRequis <= 0) ? 1 : 0;
 | 
			
		||||
    const nouveauNiveau = niveau + gainNiveau;
 | 
			
		||||
    const nouveauXp = gainNiveau > 0 ? Math.max(competence.system.xp - xpSuivant, 0) : (competence.system.xp + xpUtilise);
 | 
			
		||||
    await competence.update({
 | 
			
		||||
@@ -1002,7 +1028,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
    });
 | 
			
		||||
    await this.update({ [`system.experiencelog`]: expLog });
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  async deleteExperienceLog(from, count) {
 | 
			
		||||
    if (from >= 0 && count > 0) {
 | 
			
		||||
      let expLog = duplicate(this.system.experiencelog);
 | 
			
		||||
@@ -1118,7 +1144,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
      onEnleverDeConteneur();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  /** Ajoute un item dans un conteneur, sur la base
 | 
			
		||||
   * de leurs ID */
 | 
			
		||||
@@ -1132,7 +1158,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
      await this.updateEmbeddedDocuments('Item', [{
 | 
			
		||||
        _id: conteneur.id,
 | 
			
		||||
        'system.contenu': [...conteneur.system.contenu, item.id]
 | 
			
		||||
        }]);
 | 
			
		||||
      }]);
 | 
			
		||||
      onAjouterDansConteneur(item.id, conteneur.id);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -1175,15 +1201,15 @@ export class RdDActor extends Actor {
 | 
			
		||||
    }
 | 
			
		||||
    let result = true;
 | 
			
		||||
    const item = this.getObjet(itemId);
 | 
			
		||||
    if (item?.isEquipement() && sourceActorId == targetActorId) {
 | 
			
		||||
    if (item?.isInventaire() && sourceActorId == targetActorId) {
 | 
			
		||||
      // rangement
 | 
			
		||||
      if (srcId != destId && itemId != destId) { // déplacement de l'objet
 | 
			
		||||
        const src = this.getObjet(srcId);
 | 
			
		||||
        const dest = this.getObjet(destId);
 | 
			
		||||
        const cible = this.getContenantOrParent(dest);
 | 
			
		||||
        const [empilable, message] = item.isEquipementEmpilable(dest);
 | 
			
		||||
        const [empilable, message] = item.isInventaireEmpilable(dest);
 | 
			
		||||
        if (empilable) {
 | 
			
		||||
          await this.regrouperEquipementsSimilaires(item, dest);
 | 
			
		||||
          await dest.empiler(item)
 | 
			
		||||
          result = false;
 | 
			
		||||
        }
 | 
			
		||||
        // changer de conteneur
 | 
			
		||||
@@ -1283,11 +1309,6 @@ export class RdDActor extends Actor {
 | 
			
		||||
    return itemMap;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async regrouperEquipementsSimilaires(item, dest) {
 | 
			
		||||
    await dest.quantiteIncDec(item.system.quantite);
 | 
			
		||||
    await item.delete();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isSurenc() {
 | 
			
		||||
    return this.isPersonnage() ? (this.computeMalusSurEncombrement() < 0) : false
 | 
			
		||||
  }
 | 
			
		||||
@@ -1348,8 +1369,8 @@ export class RdDActor extends Actor {
 | 
			
		||||
  async computeMalusArmure() {
 | 
			
		||||
    if (this.isPersonnage()) {
 | 
			
		||||
      const malusArmure = this.filterItems(it => it.type == 'armure' && it.system.equipe)
 | 
			
		||||
      .map(it => it.system.malus ?? 0)
 | 
			
		||||
      .reduce(Misc.sum(), 0);
 | 
			
		||||
        .map(it => it.system.malus ?? 0)
 | 
			
		||||
        .reduce(Misc.sum(), 0);
 | 
			
		||||
      // Mise à jour éventuelle du malus armure
 | 
			
		||||
      if (this.system.attributs?.malusarmure?.value != malusArmure) {
 | 
			
		||||
        await this.updateAttributeValue("malusarmure", malusArmure);
 | 
			
		||||
@@ -1359,7 +1380,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  computePrixTotalEquipement() {
 | 
			
		||||
    const valeur = this.items.filter(it => it.isEquipement())
 | 
			
		||||
    const valeur = this.items.filter(it => it.isInventaire())
 | 
			
		||||
      .map(it => it.valeurTotale())
 | 
			
		||||
      .reduce(Misc.sum(), 0);
 | 
			
		||||
    return valeur;
 | 
			
		||||
@@ -1434,7 +1455,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async ajouterRefoulement(value = 1, refouler) {
 | 
			
		||||
    const refoulement = this.system.reve.refoulement.value + value;
 | 
			
		||||
@@ -1542,7 +1563,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
  async deleteTMRRencontreAtPosition() {
 | 
			
		||||
    const demiReve = this.getDemiReve()
 | 
			
		||||
    let rencontreIds = this.items.filter(it => it.type == 'rencontre' && it.system.coord == demiReve).map(it => it.id);
 | 
			
		||||
    if (rencontreIds.length>0) {
 | 
			
		||||
    if (rencontreIds.length > 0) {
 | 
			
		||||
      await this.deleteEmbeddedDocuments('Item', rencontreIds);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -1550,7 +1571,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async addTMRRencontre(currentRencontre) {
 | 
			
		||||
    const toCreate = currentRencontre.toObject();
 | 
			
		||||
    console.log('actor.addTMRRencontre(', toCreate,')');
 | 
			
		||||
    console.log('actor.addTMRRencontre(', toCreate, ')');
 | 
			
		||||
    this.createEmbeddedDocuments('Item', [toCreate]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -1779,7 +1800,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
    }
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  async vehicleIncDec(name, inc) {
 | 
			
		||||
    if (!this.isVehicule() || !['resistance', 'structure'].includes(name)) {
 | 
			
		||||
      return
 | 
			
		||||
@@ -1787,7 +1808,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
    const value = this.system.etat[name].value;
 | 
			
		||||
    const max = this.system.etat[name].max;
 | 
			
		||||
    const newValue = value + inc;
 | 
			
		||||
    if (0 <= newValue && newValue <=max) {
 | 
			
		||||
    if (0 <= newValue && newValue <= max) {
 | 
			
		||||
      await this.update({ [`system.etat.${name}.value`]: newValue })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -1923,25 +1944,33 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async actionItem(item, onActionItem = async () => { }) {
 | 
			
		||||
    if (!item.getActionPrincipale()) return;
 | 
			
		||||
    switch (item.type) {
 | 
			
		||||
      case 'nourritureboisson': return await this.actionNourritureboisson(item, onActionItem);
 | 
			
		||||
      case 'potion': return await this.consommerPotion(item, onActionItem);
 | 
			
		||||
      case 'livre': return await this.actionLire(item);
 | 
			
		||||
      case 'conteneur': return await item.sheet.render(true);
 | 
			
		||||
      case 'herbe': {
 | 
			
		||||
        if (item.isHerbeAPotion()) {
 | 
			
		||||
          return this.dialogFabriquerPotion(item);
 | 
			
		||||
        }
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      case 'queue': case 'ombre': return await this.actionRefoulement(item);
 | 
			
		||||
    }
 | 
			
		||||
    item.actionPrincipale(this, onActionItem);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async actionNourritureboisson(item, onActionItem) {
 | 
			
		||||
    const dialog = await DialogConsommer.create(this, item, onActionItem);
 | 
			
		||||
    dialog.render(true);
 | 
			
		||||
    switch (item.isComestible()) {
 | 
			
		||||
      case 'brut': {
 | 
			
		||||
        let d = new Dialog({
 | 
			
		||||
          title: "Nourriture brute",
 | 
			
		||||
          content: `Que faire de  votre ${item.name}`,
 | 
			
		||||
          buttons: {
 | 
			
		||||
            'cuisiner': { icon: '<i class="fas fa-check"></i>', label: 'Cuisiner', callback: async () => await this.preparerNourriture(item) },
 | 
			
		||||
            'manger': { icon: '<i class="fas fa-check"></i>', label: 'Manger cru', callback: async () => await this.mangerNourriture(item, onActionItem) }
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
        d.render(true);
 | 
			
		||||
        return true;
 | 
			
		||||
      }
 | 
			
		||||
      case 'pret':
 | 
			
		||||
        await this.mangerNourriture(item, onActionItem);
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  async mangerNourriture(item, onActionItem) {
 | 
			
		||||
    return (await DialogConsommer.create(this, item, onActionItem)).render(true);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async actionLire(item) {
 | 
			
		||||
@@ -1950,11 +1979,18 @@ export class RdDActor extends Actor {
 | 
			
		||||
      await this.rollTache(tache.id);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  async actionHerbe(item) {
 | 
			
		||||
    if (item.isHerbeAPotion()) {
 | 
			
		||||
      return this.dialogFabriquerPotion(item);
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async consommer(item, choix) {
 | 
			
		||||
    switch (item.type) {
 | 
			
		||||
      case 'nourritureboisson':
 | 
			
		||||
      case 'herbe': case 'faune':
 | 
			
		||||
        return await this.consommerNourritureboisson(item.id, choix);
 | 
			
		||||
      case 'potion':
 | 
			
		||||
        return await this.consommerPotion(item)
 | 
			
		||||
@@ -1962,18 +1998,18 @@ export class RdDActor extends Actor {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async consommerNourritureboisson(itemId, choix = { doses: 1, seForcer: false, supprimerSiZero: false}, userId = undefined) {
 | 
			
		||||
  async consommerNourritureboisson(itemId, choix = { doses: 1, seForcer: false, supprimerSiZero: false }, userId = undefined) {
 | 
			
		||||
    if (userId != undefined && userId != game.user.id) {
 | 
			
		||||
      RdDActor.remoteActorCall({
 | 
			
		||||
        actorId: this.id,
 | 
			
		||||
        method: 'consommerNourritureboisson',
 | 
			
		||||
        args: [itemId, choix, userId]
 | 
			
		||||
      },
 | 
			
		||||
      userId)
 | 
			
		||||
        userId)
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    const item = this.getObjet(itemId)
 | 
			
		||||
    if (item.type != 'nourritureboisson') {
 | 
			
		||||
    if (!item.isComestible()) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    if (choix.doses > item.system.quantite) {
 | 
			
		||||
@@ -2271,9 +2307,9 @@ export class RdDActor extends Actor {
 | 
			
		||||
    if (xpData) {
 | 
			
		||||
      const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-gain-xp.html`, xpData);
 | 
			
		||||
      if (hideChatMessage) {
 | 
			
		||||
        ChatUtility.blindMessageToGM({ content: content});
 | 
			
		||||
        ChatUtility.blindMessageToGM({ content: content });
 | 
			
		||||
      }
 | 
			
		||||
      else{
 | 
			
		||||
      else {
 | 
			
		||||
        ChatMessage.create({
 | 
			
		||||
          whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
 | 
			
		||||
          content: content
 | 
			
		||||
@@ -2557,7 +2593,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async rollCompetence(idOrName, options = {tryTarget: true}) {
 | 
			
		||||
  async rollCompetence(idOrName, options = { tryTarget: true }) {
 | 
			
		||||
    let rollData = {
 | 
			
		||||
      carac: this.system.carac,
 | 
			
		||||
      competence: this.getCompetence(idOrName)
 | 
			
		||||
@@ -2565,14 +2601,14 @@ export class RdDActor extends Actor {
 | 
			
		||||
    if (rollData.competence.type == 'competencecreature') {
 | 
			
		||||
      if (rollData.competence.system.iscombat && options.tryTarget && Targets.hasTargets()) {
 | 
			
		||||
        Targets.selectOneToken(target => {
 | 
			
		||||
            if (rollData.competence.system.ispossession) {
 | 
			
		||||
              RdDPossession.onAttaquePossession(target, this, rollData.competence)
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
              const arme = RdDItemCompetenceCreature.armeNaturelle(rollData.competence)
 | 
			
		||||
              RdDCombat.rddCombatTarget(target, this).attaque(competence, arme)
 | 
			
		||||
            }
 | 
			
		||||
          });
 | 
			
		||||
          if (rollData.competence.system.ispossession) {
 | 
			
		||||
            RdDPossession.onAttaquePossession(target, this, rollData.competence)
 | 
			
		||||
          }
 | 
			
		||||
          else {
 | 
			
		||||
            const arme = RdDItemCompetenceCreature.armeNaturelle(rollData.competence)
 | 
			
		||||
            RdDCombat.rddCombatTarget(target, this).attaque(competence, arme)
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      // Transformer la competence de créature
 | 
			
		||||
@@ -2679,14 +2715,15 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _rollArt(artData, selected, oeuvre, callBackResult = r => this._resultArt(r)) {
 | 
			
		||||
    oeuvre.system.niveau = oeuvre.system.niveau ?? 0;
 | 
			
		||||
    mergeObject(artData,
 | 
			
		||||
      {
 | 
			
		||||
        oeuvre: oeuvre,
 | 
			
		||||
        art: oeuvre.type,
 | 
			
		||||
        competence: duplicate(this.getCompetence(artData.compName ?? oeuvre.system.competence ?? artData.art)),
 | 
			
		||||
        diffLibre: - (oeuvre.system.niveau ?? 0),
 | 
			
		||||
        diffLibre: - oeuvre.system.niveau,
 | 
			
		||||
        diffConditions: 0,
 | 
			
		||||
        use: { libre: false, conditions: true },
 | 
			
		||||
        use: { libre: false, conditions: true, surenc: false },
 | 
			
		||||
        selectedCarac: duplicate(this.system.carac[selected])
 | 
			
		||||
      },
 | 
			
		||||
      { overwrite: false });
 | 
			
		||||
@@ -2695,8 +2732,6 @@ export class RdDActor extends Actor {
 | 
			
		||||
      artData.forceCarac = {};
 | 
			
		||||
      artData.forceCarac[selected] = duplicate(this.system.carac[selected]);
 | 
			
		||||
    }
 | 
			
		||||
    console.log("rollArt !!!", artData);
 | 
			
		||||
 | 
			
		||||
    const dialog = await RdDRoll.create(this, artData,
 | 
			
		||||
      { html: `systems/foundryvtt-reve-de-dragon/templates/dialog-roll-${oeuvre.type}.html` },
 | 
			
		||||
      {
 | 
			
		||||
@@ -2713,8 +2748,9 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _resultArt(artData) {
 | 
			
		||||
    const baseQualite = (artData.rolled.isSuccess ? artData.oeuvre.system.niveau : artData.competence.system.niveau);
 | 
			
		||||
    artData.qualiteFinale = Math.min(baseQualite, artData.oeuvre.system.niveau) + artData.rolled.ptQualite;
 | 
			
		||||
    const niveau = artData.oeuvre.system.niveau ?? 0;
 | 
			
		||||
    const baseQualite = (artData.rolled.isSuccess ? niveau : artData.competence.system.niveau);
 | 
			
		||||
    artData.qualiteFinale = Math.min(baseQualite, niveau) + artData.rolled.ptQualite;
 | 
			
		||||
 | 
			
		||||
    await RdDResolutionTable.displayRollData(artData, this.name, `chat-resultat-${artData.art}.html`);
 | 
			
		||||
  }
 | 
			
		||||
@@ -2768,32 +2804,64 @@ export class RdDActor extends Actor {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _resultRecetteCuisine(artData) {
 | 
			
		||||
    const baseQualite = (artData.rolled.isSuccess ? artData.oeuvre.system.niveau : artData.competence.system.niveau);
 | 
			
		||||
    const sust = artData.oeuvre.system.sust * artData.proportions;
 | 
			
		||||
    artData.qualiteFinale = Math.min(baseQualite, artData.oeuvre.system.niveau) + artData.rolled.ptQualite;
 | 
			
		||||
    artData.exotismeFinal = Math.min(Math.min(artData.qualiteFinale, artData.oeuvre.system.exotisme ?? 0), 0);
 | 
			
		||||
    //console.log("OEUVRE", artData.art, artData)
 | 
			
		||||
  async _resultRecetteCuisine(cuisine) {
 | 
			
		||||
    const niveauRecette = cuisine.oeuvre.system.niveau ?? 0;
 | 
			
		||||
    const baseQualite = (cuisine.rolled.isSuccess ? niveauRecette : cuisine.competence.system.niveau);
 | 
			
		||||
    cuisine.qualiteFinale = Math.min(baseQualite, niveauRecette) + cuisine.rolled.ptQualite;
 | 
			
		||||
    cuisine.exotismeFinal = Math.min(Math.min(cuisine.qualiteFinale, cuisine.oeuvre.system.exotisme ?? 0), 0);
 | 
			
		||||
    cuisine.sust = cuisine.oeuvre.system.sust * Math.min(cuisine.proportions, cuisine.proportionsMax ?? cuisine.proportions)
 | 
			
		||||
    const platCuisine = {
 | 
			
		||||
      name: artData.oeuvre.name,
 | 
			
		||||
      name: cuisine.oeuvre.name,
 | 
			
		||||
      type: 'nourritureboisson',
 | 
			
		||||
      img: 'systems/foundryvtt-reve-de-dragon/icons/objets/provision_cuite.webp',
 | 
			
		||||
      system: {
 | 
			
		||||
        "description": artData.oeuvre.system.description,
 | 
			
		||||
        "sust": Math.min(sust, 1),
 | 
			
		||||
        "qualite": artData.qualiteFinale,
 | 
			
		||||
        "exotisme": artData.exotismeFinal,
 | 
			
		||||
        "description": cuisine.oeuvre.system.description,
 | 
			
		||||
        "sust": 1,
 | 
			
		||||
        "qualite": cuisine.qualiteFinale,
 | 
			
		||||
        "exotisme": cuisine.exotismeFinal,
 | 
			
		||||
        "encombrement": 0.1,
 | 
			
		||||
        "quantite": Math.max(1, Math.floor(sust)),
 | 
			
		||||
        "cout": Math.max(artData.qualiteFinale) * 0.01
 | 
			
		||||
        "quantite": Math.max(1, Math.floor(cuisine.sust)),
 | 
			
		||||
        "cout": Math.max(cuisine.qualiteFinale) * 0.01
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
    if (artData.ajouterEquipement) {
 | 
			
		||||
    }
 | 
			
		||||
    if (cuisine.ajouterEquipement) {
 | 
			
		||||
      await this.createEmbeddedDocuments('Item', [platCuisine]);
 | 
			
		||||
      ui.notifications.info(`${platCuisine.system.quantite} rations de ${platCuisine.name} ont été ajoutés à votre équipement`);
 | 
			
		||||
    }
 | 
			
		||||
    artData.platCuisine = platCuisine;
 | 
			
		||||
    await RdDResolutionTable.displayRollData(artData, this.name, `chat-resultat-${artData.art}.html`);
 | 
			
		||||
    cuisine.platCuisine = platCuisine;
 | 
			
		||||
    await RdDResolutionTable.displayRollData(cuisine, this.name, `chat-resultat-${cuisine.art}.html`);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async preparerNourriture(item) {
 | 
			
		||||
    if (item.isComestible() == 'brut') {
 | 
			
		||||
      const nourriture = {
 | 
			
		||||
        name: 'Plat de ' + item.name,
 | 
			
		||||
        type: 'recettecuisine',
 | 
			
		||||
        img: item.img,
 | 
			
		||||
        system: {
 | 
			
		||||
          sust: 1,
 | 
			
		||||
          exotisme: item.system.exotisme,
 | 
			
		||||
          ingredients: item.name
 | 
			
		||||
        }
 | 
			
		||||
      };
 | 
			
		||||
      const artData = {
 | 
			
		||||
        verbe: 'Préparer',
 | 
			
		||||
        compName: 'cuisine',
 | 
			
		||||
        proportions: 1,
 | 
			
		||||
        proportionsMax: Math.min(50, item.system.sust),
 | 
			
		||||
        ajouterEquipement: true
 | 
			
		||||
      };
 | 
			
		||||
      await this._rollArt(artData, 'odoratgout', nourriture, async (cuisine) => {
 | 
			
		||||
        await this._resultRecetteCuisine(cuisine);
 | 
			
		||||
        const remaining = Math.max(item.system.quantite - cuisine.proportions, 0);
 | 
			
		||||
        if (remaining > 0) {
 | 
			
		||||
          await item.update({ 'system.quantite': remaining })
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
          await this.deleteEmbeddedDocuments('Item', [item.id]);
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -2995,7 +3063,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  getHeureNaissance() {
 | 
			
		||||
    if (this.isCreature()) {
 | 
			
		||||
    if (this.isCreatureEntite()) {
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
    return this.system.heure;
 | 
			
		||||
@@ -3003,7 +3071,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  ajustementAstrologique() {
 | 
			
		||||
    if (this.isCreature()) {
 | 
			
		||||
    if (this.isCreatureEntite()) {
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
    // selon l'heure de naissance...
 | 
			
		||||
@@ -3145,7 +3213,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
    const caracList = Object.entries(carac);
 | 
			
		||||
    let entry = Misc.findFirstLike(name, caracList, { mapper: it => it[0], description: 'caractéristique' });
 | 
			
		||||
    if (!entry || entry.length ==0) {
 | 
			
		||||
    if (!entry || entry.length == 0) {
 | 
			
		||||
      entry = Misc.findFirstLike(name, caracList, { mapper: it => it[1].label, description: 'caractéristique' });
 | 
			
		||||
    }
 | 
			
		||||
    return entry && entry.length > 0 ? carac[entry[0]] : undefined;
 | 
			
		||||
@@ -3181,7 +3249,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
      ui.notifications.warn("Vous êtes déja dans les TMR....");
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
    if (mode != 'visu' &&  this.getEffect(STATUSES.StatusDemiReve)) {
 | 
			
		||||
    if (mode != 'visu' && this.getEffect(STATUSES.StatusDemiReve)) {
 | 
			
		||||
      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
 | 
			
		||||
    }
 | 
			
		||||
@@ -3239,18 +3307,18 @@ export class RdDActor extends Actor {
 | 
			
		||||
        title: 'Ne pas utiliser les automatisation de combat',
 | 
			
		||||
        buttonLabel: "Pas d'automatisation",
 | 
			
		||||
        onAction: async () => {
 | 
			
		||||
          this.rollCompetence(arme.system.competence, {tryTarget: false})
 | 
			
		||||
          this.rollCompetence(arme.system.competence, { tryTarget: false })
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    Targets.selectOneToken(target => {
 | 
			
		||||
      if (Targets.isTargetEntite(target)){
 | 
			
		||||
      if (Targets.isTargetEntite(target)) {
 | 
			
		||||
        ui.notifications.warn(`Vous ne pouvez pas attaquer une entité non incarnée avec votre ${arme.name}!!!!`);
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
  
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      const competence = this.getCompetence(arme.system.competence)
 | 
			
		||||
      if (competence.system.ispossession) {
 | 
			
		||||
        return RdDPossession.onAttaquePossession(target, this, competence);
 | 
			
		||||
@@ -3369,12 +3437,12 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
  async validerEncaissement(rollData, show) {
 | 
			
		||||
    if (ReglesOptionelles.isUsing('validation-encaissement-gr') && !game.user.isGM) {
 | 
			
		||||
        RdDActor.remoteActorCall({
 | 
			
		||||
          actorId: this.id,
 | 
			
		||||
          method: 'validerEncaissement',
 | 
			
		||||
          args: [rollData, show]
 | 
			
		||||
        });
 | 
			
		||||
        return;
 | 
			
		||||
      RdDActor.remoteActorCall({
 | 
			
		||||
        actorId: this.id,
 | 
			
		||||
        method: 'validerEncaissement',
 | 
			
		||||
        args: [rollData, show]
 | 
			
		||||
      });
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    const armure = await this.computeArmure(rollData);
 | 
			
		||||
    if (ReglesOptionelles.isUsing('validation-encaissement-gr')) {
 | 
			
		||||
@@ -3854,7 +3922,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  addSubActeur(subActor) {
 | 
			
		||||
    if(subActor?.id == this.id){
 | 
			
		||||
    if (subActor?.id == this.id) {
 | 
			
		||||
      ui.notifications.warn("Vous ne pouvez pas attacher un acteur à lui même")
 | 
			
		||||
    }
 | 
			
		||||
    else if (!subActor?.isOwner) {
 | 
			
		||||
@@ -4081,10 +4149,10 @@ export class RdDActor extends Actor {
 | 
			
		||||
    }
 | 
			
		||||
    console.log("setEffect", statusId, status)
 | 
			
		||||
    const effect = this.getEffect(statusId);
 | 
			
		||||
    if (!status && effect){
 | 
			
		||||
    if (!status && effect) {
 | 
			
		||||
      await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]);
 | 
			
		||||
    }
 | 
			
		||||
    if (status && !effect ) {
 | 
			
		||||
    if (status && !effect) {
 | 
			
		||||
      await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.status(statusId)]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -4110,7 +4178,6 @@ export class RdDActor extends Actor {
 | 
			
		||||
      await this.checkCompetenceXP(item.name, item.system.xp);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async onCreateItem(item, options, id) {
 | 
			
		||||
    switch (item.type) {
 | 
			
		||||
@@ -4121,6 +4188,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
        await this.onCreateOwnedDraconique(item, options, id);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    await item.onCreateDecoupeComestible(this);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async onDeleteItem(item, options, id) {
 | 
			
		||||
 
 | 
			
		||||
@@ -2,13 +2,13 @@ import { Misc } from "./misc.js";
 | 
			
		||||
 | 
			
		||||
export class DialogConsommer extends Dialog {
 | 
			
		||||
 | 
			
		||||
  static async create(actor, item, onActionItem = async ()=>{}) {
 | 
			
		||||
  static async create(actor, item, onActionItem = async () => { }) {
 | 
			
		||||
    const consommerData = DialogConsommer.prepareData(actor, item);
 | 
			
		||||
    const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-item-consommer.html', consommerData);
 | 
			
		||||
    return new DialogConsommer(actor, item, consommerData, html, onActionItem)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  constructor(actor, item, consommerData, html, onActionItem = async ()=>{}) {
 | 
			
		||||
  constructor(actor, item, consommerData, html, onActionItem = async () => { }) {
 | 
			
		||||
    const options = { classes: ["dialogconsommer"], width: 350, height: 'fit-content', 'z-index': 99999 };
 | 
			
		||||
    let conf = {
 | 
			
		||||
      title: consommerData.title,
 | 
			
		||||
@@ -18,7 +18,8 @@ export class DialogConsommer extends Dialog {
 | 
			
		||||
        [consommerData.buttonName]: {
 | 
			
		||||
          label: consommerData.buttonName, callback: async it => {
 | 
			
		||||
            await this.onConsommer(it);
 | 
			
		||||
            await onActionItem();}
 | 
			
		||||
            await onActionItem();
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
@@ -38,9 +39,8 @@ export class DialogConsommer extends Dialog {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static prepareData(actor, item) {
 | 
			
		||||
    item = duplicate(item);
 | 
			
		||||
    let consommerData = {
 | 
			
		||||
      item: item,
 | 
			
		||||
      item: duplicate(item),
 | 
			
		||||
      cuisine: actor.getCompetence('cuisine'),
 | 
			
		||||
      choix: {
 | 
			
		||||
        doses: 1,
 | 
			
		||||
@@ -48,25 +48,47 @@ export class DialogConsommer extends Dialog {
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    switch (item.type) {
 | 
			
		||||
      case 'herbe': case 'faune':
 | 
			
		||||
        consommerData.title = 'Manger une portion crue: ';
 | 
			
		||||
        consommerData.buttonName = "Manger";
 | 
			
		||||
        break;
 | 
			
		||||
      case 'nourritureboisson':
 | 
			
		||||
        consommerData.title = item.system.boisson ? `${item.name}: boire une dose` : `${item.name}: manger une portion`;
 | 
			
		||||
        consommerData.title = item.system.boisson ? 'Boire une dose: ' : 'Manger une portion: ';
 | 
			
		||||
        consommerData.buttonName = item.system.boisson ? "Boire" : "Manger";
 | 
			
		||||
        break;
 | 
			
		||||
      case 'potion':
 | 
			
		||||
        consommerData.title = `${item.name}: boire la potion`;
 | 
			
		||||
        consommerData.title = 'Boire la potion: ';
 | 
			
		||||
        consommerData.buttonName = "Boire";
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    DialogConsommer.calculDoses(consommerData, consommerData.choix.doses)
 | 
			
		||||
    consommerData.title += item.name;
 | 
			
		||||
    DialogConsommer.calculDoses(consommerData, item)
 | 
			
		||||
    return consommerData;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static calculDoses(consommer) {
 | 
			
		||||
  static calculDoses(consommer, item) {
 | 
			
		||||
    const doses = consommer.choix.doses;
 | 
			
		||||
    consommer.totalSust = Misc.keepDecimals(doses * (consommer.item.system.sust ?? 0), 2);
 | 
			
		||||
    consommer.totalDesaltere = consommer.item.system.boisson
 | 
			
		||||
      ? Misc.keepDecimals(doses * (consommer.item.system.desaltere ?? 0), 2)
 | 
			
		||||
      : 0;
 | 
			
		||||
    switch (item.type) {
 | 
			
		||||
      case 'herbe': case 'faune':
 | 
			
		||||
        consommer.totalSust = doses;
 | 
			
		||||
        consommer.totalDesaltere = 0;
 | 
			
		||||
        consommer.choix.sust = 1;
 | 
			
		||||
        consommer.choix.quantite = 0;
 | 
			
		||||
        consommer.choix.encombrement = Misc.keepDecimals(consommer.item.system.encombrement / item.system.sust, 2);
 | 
			
		||||
        return;
 | 
			
		||||
      case 'nourritureboisson':
 | 
			
		||||
        consommer.choix.sust = consommer.item.system.sust;
 | 
			
		||||
        consommer.choix.quantite = doses;
 | 
			
		||||
        consommer.choix.encombrement = 0
 | 
			
		||||
        consommer.totalSust = Misc.keepDecimals(doses * (consommer.item.system.sust ?? 0), 2);
 | 
			
		||||
        consommer.totalDesaltere = consommer.item.system.boisson
 | 
			
		||||
          ? Misc.keepDecimals(doses * (consommer.item.system.desaltere ?? 0), 2)
 | 
			
		||||
          : 0;
 | 
			
		||||
        break;
 | 
			
		||||
      case 'potion':
 | 
			
		||||
        consommer.totalSust = 0
 | 
			
		||||
        consommer.totalDesaltere = 0
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -84,7 +106,7 @@ export class DialogConsommer extends Dialog {
 | 
			
		||||
 | 
			
		||||
  selectDoses(event) {
 | 
			
		||||
    this.consommerData.choix.doses = Number(event.currentTarget.value);
 | 
			
		||||
    DialogConsommer.calculDoses(this.consommerData);
 | 
			
		||||
    DialogConsommer.calculDoses(this.consommerData, this.item);
 | 
			
		||||
    $(".total-sust").text(this.consommerData.totalSust);
 | 
			
		||||
    $(".total-desaltere").text(this.consommerData.totalDesaltere);
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ const MILIEUX = [
 | 
			
		||||
  "Sous-sols"
 | 
			
		||||
]
 | 
			
		||||
const ITEM_ENVIRONNEMENT_TYPES = [
 | 
			
		||||
  'herbe', 'ingredient'
 | 
			
		||||
  'herbe', 'ingredient', 'faune'
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
export class Environnement {
 | 
			
		||||
@@ -126,22 +126,12 @@ export class Environnement {
 | 
			
		||||
 | 
			
		||||
export class EnvironmentSheetHelper {
 | 
			
		||||
 | 
			
		||||
  static defaultOptions(defaultOptions, type) {
 | 
			
		||||
  static defaultOptions(defaultOptions) {
 | 
			
		||||
    return mergeObject(defaultOptions, {
 | 
			
		||||
      classes: ["rdd", "sheet", "item"],
 | 
			
		||||
      template: `systems/foundryvtt-reve-de-dragon/templates/item-${type}-sheet.html`,
 | 
			
		||||
      width: 500,
 | 
			
		||||
      height: 600,
 | 
			
		||||
      tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "informations" }]
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static getHeaderButtons(sheet, buttons) {
 | 
			
		||||
    buttons.unshift({ class: "post", icon: "fas fa-comment", onclick: ev => sheet.item.postItem() });
 | 
			
		||||
    return buttons;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static setPosition(sheet, superPosition) {
 | 
			
		||||
    const position = superPosition;
 | 
			
		||||
    const sheetHeader = sheet.element.find(".sheet-header");
 | 
			
		||||
@@ -152,22 +142,14 @@ export class EnvironmentSheetHelper {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static async getData(sheet, formData) {
 | 
			
		||||
    const autresMilieux = await game.system.rdd.environnement.autresMilieux(sheet.item);
 | 
			
		||||
    mergeObject(formData, {
 | 
			
		||||
      title: formData.name,
 | 
			
		||||
      isGM: game.user.isGM,
 | 
			
		||||
      owner: sheet.actor?.isOwner,
 | 
			
		||||
      isOwned: sheet.actor ? true : false,
 | 
			
		||||
      actorId: sheet.actor?.id,
 | 
			
		||||
      editable: sheet.isEditable,
 | 
			
		||||
      cssClass: sheet.isEditable ? "editable" : "locked",
 | 
			
		||||
      milieux: autresMilieux
 | 
			
		||||
    return mergeObject(formData, {
 | 
			
		||||
      milieux: await game.system.rdd.environnement.autresMilieux(sheet.item)
 | 
			
		||||
    });
 | 
			
		||||
    return formData;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static activateListeners(sheet, html) {
 | 
			
		||||
    if (!sheet.options.editable) return;
 | 
			
		||||
 | 
			
		||||
    html.find("input.input-selection-milieu").keypress(event => {
 | 
			
		||||
      if (event.keyCode == '13') {
 | 
			
		||||
        EnvironmentSheetHelper.onAddMilieu(html, sheet, event);
 | 
			
		||||
@@ -238,13 +220,4 @@ export class EnvironmentSheetHelper {
 | 
			
		||||
    return $(event.currentTarget)?.parents("div.environnement-milieu").data("milieu");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static template(itemType) {
 | 
			
		||||
    /* -------------------------------------------- */
 | 
			
		||||
    return `systems/foundryvtt-reve-de-dragon/templates/item-${itemType}-sheet.html`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static title(item) {
 | 
			
		||||
    return Misc.typeName('Item', item.type) + ': ' + item.name;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -281,4 +281,36 @@ export class RdDItemCompetence extends Item {
 | 
			
		||||
    return duplicate(limitesArchetypes);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static triVisible(competences) {
 | 
			
		||||
    return competences.filter(it => it.system.isVisible)
 | 
			
		||||
      .sort((a, b) => RdDItemCompetence.compare(a,b))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static $positionTri(comp) {
 | 
			
		||||
    if (comp.name.startsWith("Survie")) {
 | 
			
		||||
      if (comp.name.includes("Cité")) return 0;
 | 
			
		||||
      if (comp.name.includes("Extérieur")) return 1;
 | 
			
		||||
      return 2;
 | 
			
		||||
    }
 | 
			
		||||
    if (comp.system.categorie.startsWith("melee")) {
 | 
			
		||||
      if (comp.name.includes("Corps")) return 0;
 | 
			
		||||
      if (comp.name.includes("Dague")) return 1;
 | 
			
		||||
      if (comp.name.includes("Esquive")) return 2;
 | 
			
		||||
      return 3;
 | 
			
		||||
    }
 | 
			
		||||
    if (comp.system.categorie.startsWith("draconic")) {
 | 
			
		||||
      if (comp.name.includes("Oniros")) return 0;
 | 
			
		||||
      if (comp.name.includes("Hypnos")) return 1;
 | 
			
		||||
      if (comp.name.includes("Narcos")) return 2;
 | 
			
		||||
      if (comp.name.includes("Thanatos")) return 3;
 | 
			
		||||
      return 4;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static compare(a,b) {
 | 
			
		||||
    const diff = RdDItemCompetence.$positionTri(a) - RdDItemCompetence.$positionTri(b);
 | 
			
		||||
    return diff ? diff : a.name.localeCompare(b.name);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										59
									
								
								module/item-conteneur-sheet.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,59 @@
 | 
			
		||||
import { RdDItemSheet } from "./item-sheet.js";
 | 
			
		||||
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
 | 
			
		||||
import { RdDUtility } from "./rdd-utility.js";
 | 
			
		||||
 | 
			
		||||
export class RdDConteneurItemSheet extends RdDItemSheet {
 | 
			
		||||
 | 
			
		||||
  static get ITEM_TYPE() { return "conteneur" };
 | 
			
		||||
 | 
			
		||||
  async getData() {
 | 
			
		||||
    const formData = await super.getData();
 | 
			
		||||
    if (this.actor) {
 | 
			
		||||
      this.prepareConteneurData(formData);
 | 
			
		||||
    }
 | 
			
		||||
    return formData;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  activateListeners(html) {
 | 
			
		||||
    super.activateListeners(html);
 | 
			
		||||
    if (!this.options.editable) return;
 | 
			
		||||
 | 
			
		||||
    html.find('.conteneur-name a').click(async event => {
 | 
			
		||||
      RdDUtility.toggleAfficheContenu(RdDSheetUtility.getItemId(event));
 | 
			
		||||
      this.render(true);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  prepareConteneurData(formData) {
 | 
			
		||||
    RdDUtility.filterEquipementParType(formData, this.actor.itemTypes);
 | 
			
		||||
 | 
			
		||||
    this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
 | 
			
		||||
    formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async _onDragStart(event) {
 | 
			
		||||
    console.log("_onDragStart", event);
 | 
			
		||||
    if (event.target.classList.contains("entity-link")) return;
 | 
			
		||||
 | 
			
		||||
    const itemId = event.srcElement?.attributes["data-item-id"].value;
 | 
			
		||||
    const item = this.actor.items.get(itemId);
 | 
			
		||||
    // Create drag data
 | 
			
		||||
    const dragData = {
 | 
			
		||||
      actorId: this.actor.id,
 | 
			
		||||
      type: "Item",
 | 
			
		||||
      data: item.system
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async _onDropItem(event, dragData) {
 | 
			
		||||
    if (this.actor) {
 | 
			
		||||
      const dropParams = RdDSheetUtility.prepareItemDropParameters(this.item.id, this.actor, dragData, this.objetVersConteneur);
 | 
			
		||||
      await this.actor.processDropItem(dropParams);
 | 
			
		||||
      await this.render(true);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										67
									
								
								module/item-faune-sheet.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,67 @@
 | 
			
		||||
import { EnvironmentSheetHelper } from "./environnement.js";
 | 
			
		||||
import { RdDItemSheet } from "./item-sheet.js";
 | 
			
		||||
import { RdDUtility } from "./rdd-utility.js";
 | 
			
		||||
 | 
			
		||||
export class RdDFauneItemSheet extends RdDItemSheet {
 | 
			
		||||
 | 
			
		||||
  static get ITEM_TYPE() { return "faune" };
 | 
			
		||||
 | 
			
		||||
  static get defaultOptions() {
 | 
			
		||||
    return EnvironmentSheetHelper.defaultOptions(super.defaultOptions);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setPosition(options = {}) {
 | 
			
		||||
    return EnvironmentSheetHelper.setPosition(this, super.setPosition(options));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async getData() {
 | 
			
		||||
    const formData = await super.getData();
 | 
			
		||||
    return await EnvironmentSheetHelper.getData(this, formData);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  activateListeners(html) {
 | 
			
		||||
    super.activateListeners(html);
 | 
			
		||||
    if (!this.options.editable) return;
 | 
			
		||||
 | 
			
		||||
    EnvironmentSheetHelper.activateListeners(this, html);
 | 
			
		||||
 | 
			
		||||
    html.find("a.linked-actor-delete").click(event => this.onDeleteLinkedActor());
 | 
			
		||||
    html.find("a.preparer-nourriture").click(event => this.preparerNourriture(event));
 | 
			
		||||
    html.find("a.manger-nourriture").click(event => this.mangerNourriture(event));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async _onDropActor(event, dragData) {
 | 
			
		||||
    console.log('faune:dropActor', event, dragData)
 | 
			
		||||
    const linkedActor = fromUuidSync(dragData.uuid);
 | 
			
		||||
    if (linkedActor?.pack) {
 | 
			
		||||
      this.item.update({
 | 
			
		||||
        'system.actor.pack': linkedActor.pack,
 | 
			
		||||
        'system.actor.id': linkedActor._id,
 | 
			
		||||
        'system.actor.name': linkedActor.name
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      ui.notifications.warn(`${linkedActor.name} ne provient pas d'un compendium.
 | 
			
		||||
        <br>Choisissez une créature du compendium pour représenter un élément de faune générique`)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  async onDeleteLinkedActor() {
 | 
			
		||||
    this.item.update({
 | 
			
		||||
      'system.actor.pack': '',
 | 
			
		||||
      'system.actor.id': '',
 | 
			
		||||
      'system.actor.name': ''
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async preparerNourriture(event) {
 | 
			
		||||
    if (this.actor) {
 | 
			
		||||
      await this.actor.preparerNourriture(this.item);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  async mangerNourriture(event) {
 | 
			
		||||
    if (this.actor) {
 | 
			
		||||
      await this.actor.mangerNourriture(this.item);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,26 +1,12 @@
 | 
			
		||||
import { SYSTEM_RDD } from "./constants.js";
 | 
			
		||||
import { EnvironmentSheetHelper } from "./environnement.js";
 | 
			
		||||
import { RdDItemSheet } from "./item-sheet.js";
 | 
			
		||||
import { Misc } from "./misc.js";
 | 
			
		||||
 | 
			
		||||
const ITEM_TYPE = 'herbe';
 | 
			
		||||
 | 
			
		||||
export class RdDHerbeItemSheet extends RdDItemSheet {
 | 
			
		||||
 | 
			
		||||
  static register() {
 | 
			
		||||
    Items.registerSheet(SYSTEM_RDD, RdDHerbeItemSheet, {
 | 
			
		||||
      label: Misc.typeName('Item', ITEM_TYPE),
 | 
			
		||||
      types: [ITEM_TYPE],
 | 
			
		||||
      makeDefault: true
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
  static get ITEM_TYPE() { return "herbe" };
 | 
			
		||||
 | 
			
		||||
  static get defaultOptions() {
 | 
			
		||||
    return EnvironmentSheetHelper.defaultOptions(super.defaultOptions, ITEM_TYPE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _getHeaderButtons() {
 | 
			
		||||
    return EnvironmentSheetHelper.getHeaderButtons(this, super._getHeaderButtons());
 | 
			
		||||
    return EnvironmentSheetHelper.defaultOptions(super.defaultOptions);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setPosition(options = {}) {
 | 
			
		||||
@@ -36,12 +22,4 @@ export class RdDHerbeItemSheet extends RdDItemSheet {
 | 
			
		||||
    super.activateListeners(html);
 | 
			
		||||
    EnvironmentSheetHelper.activateListeners(this, html);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get template() {
 | 
			
		||||
    return EnvironmentSheetHelper.template(this.item.type);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get title() {
 | 
			
		||||
    return EnvironmentSheetHelper.title(this.item);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,25 +1,12 @@
 | 
			
		||||
import { SYSTEM_RDD } from "./constants.js";
 | 
			
		||||
import { EnvironmentSheetHelper } from "./environnement.js";
 | 
			
		||||
import { RdDItemSheet } from "./item-sheet.js";
 | 
			
		||||
import { Misc } from "./misc.js";
 | 
			
		||||
 | 
			
		||||
const ITEM_TYPE = 'ingredient';
 | 
			
		||||
export class RdDIngredientItemSheet extends RdDItemSheet {
 | 
			
		||||
 | 
			
		||||
  static register() {
 | 
			
		||||
    Items.registerSheet(SYSTEM_RDD, RdDIngredientItemSheet, {
 | 
			
		||||
      label: Misc.typeName('Item', ITEM_TYPE),
 | 
			
		||||
      types: [ITEM_TYPE],
 | 
			
		||||
      makeDefault: true
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
  static get ITEM_TYPE() { return "ingredient" };
 | 
			
		||||
 | 
			
		||||
  static get defaultOptions() {
 | 
			
		||||
    return EnvironmentSheetHelper.defaultOptions(super.defaultOptions, ITEM_TYPE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _getHeaderButtons() {
 | 
			
		||||
    return EnvironmentSheetHelper.getHeaderButtons(this, super._getHeaderButtons());
 | 
			
		||||
    return EnvironmentSheetHelper.defaultOptions(super.defaultOptions);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setPosition(options = {}) {
 | 
			
		||||
@@ -35,12 +22,4 @@ export class RdDIngredientItemSheet extends RdDItemSheet {
 | 
			
		||||
    super.activateListeners(html);
 | 
			
		||||
    EnvironmentSheetHelper.activateListeners(this, html);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get template() {
 | 
			
		||||
    return EnvironmentSheetHelper.template(this.item.type);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get title() {
 | 
			
		||||
    return EnvironmentSheetHelper.title(this.item);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,16 @@
 | 
			
		||||
import { RdDRencontre } from "./item-rencontre.js";
 | 
			
		||||
import { RdDItemSheet } from "./item-sheet.js";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Item sheet pour configurer les rencontres
 | 
			
		||||
 * @extends {ItemSheet}
 | 
			
		||||
 */
 | 
			
		||||
export class RdDRencontreItemSheet extends ItemSheet {
 | 
			
		||||
export class RdDRencontreItemSheet extends RdDItemSheet {
 | 
			
		||||
  
 | 
			
		||||
  static get ITEM_TYPE() { return "rencontre" };
 | 
			
		||||
 | 
			
		||||
  /** @override */
 | 
			
		||||
  static get defaultOptions() {
 | 
			
		||||
    return mergeObject(super.defaultOptions, {
 | 
			
		||||
      classes: ["rdd", "sheet", "item"],
 | 
			
		||||
      template: "systems/foundryvtt-reve-de-dragon/templates/item-rencontre-sheet.html",
 | 
			
		||||
      width: 500,
 | 
			
		||||
      height: 500,
 | 
			
		||||
      tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }]
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _getHeaderButtons() {
 | 
			
		||||
    let buttons = super._getHeaderButtons();
 | 
			
		||||
    buttons.unshift({ class: "post", icon: "fas fa-comment", onclick: ev => this.item.postItem() });
 | 
			
		||||
    return buttons;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  /** @override */
 | 
			
		||||
  setPosition(options = {}) {
 | 
			
		||||
@@ -34,7 +21,6 @@ export class RdDRencontreItemSheet extends ItemSheet {
 | 
			
		||||
    return position;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async getData() {
 | 
			
		||||
    const formData = duplicate(this.item);
 | 
			
		||||
@@ -96,13 +82,4 @@ export class RdDRencontreItemSheet extends ItemSheet {
 | 
			
		||||
    updates[key] = liste;
 | 
			
		||||
    this.item.update(updates);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get template() {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
    return `systems/foundryvtt-reve-de-dragon/templates/item-rencontre-sheet.html`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get title() {
 | 
			
		||||
    return `Rencontre: ${this.object.name}`;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,30 +9,54 @@ import { ReglesOptionelles } from "./settings/regles-optionelles.js";
 | 
			
		||||
import { SYSTEM_RDD } from "./constants.js";
 | 
			
		||||
import { RdDSheetUtility } from "./rdd-sheet-utility.js";
 | 
			
		||||
import { SystemCompendiums } from "./settings/system-compendiums.js";
 | 
			
		||||
import { Misc } from "./misc.js";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Extend the basic ItemSheet with some very simple modifications
 | 
			
		||||
 * @extends {ItemSheet}
 | 
			
		||||
 * Extend the basic ItemSheet for RdD specific items
 | 
			
		||||
 */
 | 
			
		||||
export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
 | 
			
		||||
  static get ITEM_TYPE() {
 | 
			
		||||
    return undefined
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static defaultTemplate(type) {
 | 
			
		||||
    return type ?
 | 
			
		||||
      `systems/foundryvtt-reve-de-dragon/templates/item-${type}-sheet.html` :
 | 
			
		||||
      "systems/foundryvtt-reve-de-dragon/templates/item-sheet.html";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static register(sheetClass) {
 | 
			
		||||
    Items.registerSheet(SYSTEM_RDD, sheetClass, {
 | 
			
		||||
      label: Misc.typeName('Item', sheetClass.ITEM_TYPE),
 | 
			
		||||
      types: [sheetClass.ITEM_TYPE],
 | 
			
		||||
      makeDefault: true
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /** @override */
 | 
			
		||||
  static get defaultOptions() {
 | 
			
		||||
    return mergeObject(super.defaultOptions, {
 | 
			
		||||
      classes: [SYSTEM_RDD, "sheet", "item"],
 | 
			
		||||
      template: "systems/foundryvtt-reve-de-dragon/templates/item-sheet.html",
 | 
			
		||||
      template: RdDItemSheet.defaultTemplate(RdDItemSheet.ITEM_TYPE),
 | 
			
		||||
      width: 550,
 | 
			
		||||
      height: 550
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  get template() {
 | 
			
		||||
    return RdDItemSheet.defaultTemplate(this.item.type);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get title() {
 | 
			
		||||
    return `${Misc.typeName('Item', this.item.type)}: ${this.item.name}`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _getHeaderButtons() {
 | 
			
		||||
    let buttons = super._getHeaderButtons();
 | 
			
		||||
    // Add "Post to chat" button
 | 
			
		||||
    // We previously restricted this to GM and editable items only. If you ever find this comment because it broke something: eh, sorry!
 | 
			
		||||
    if ("cout" in this.item.system && this.item.isVideOuNonConteneur()) {
 | 
			
		||||
    if (this.item.isInventaire() && this.item.isVideOuNonConteneur()) {
 | 
			
		||||
      buttons.unshift({
 | 
			
		||||
        class: "vendre",
 | 
			
		||||
        icon: "fas fa-comments-dollar",
 | 
			
		||||
@@ -69,18 +93,14 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
      system: this.item.system,
 | 
			
		||||
      isGM: game.user.isGM,
 | 
			
		||||
      actorId: this.actor?.id,
 | 
			
		||||
      isOwned: this.actor ? true : false,
 | 
			
		||||
      owner: this.item.isOwner,
 | 
			
		||||
      editable: this.isEditable,
 | 
			
		||||
      cssClass: this.isEditable ? "editable" : "locked",
 | 
			
		||||
      isSoins: false,
 | 
			
		||||
      description: await TextEditor.enrichHTML(this.item.system.description, {async: true}),
 | 
			
		||||
      descriptionmj: await TextEditor.enrichHTML(this.item.system.descriptionmj, {async: true})
 | 
			
		||||
    }
 | 
			
		||||
    if (this.actor) {
 | 
			
		||||
      formData.isOwned = true;
 | 
			
		||||
      if (this.item.type == 'conteneur') {
 | 
			
		||||
        this.prepareConteneurData(formData);
 | 
			
		||||
      }
 | 
			
		||||
      description: await TextEditor.enrichHTML(this.item.system.description, { async: true }),
 | 
			
		||||
      descriptionmj: await TextEditor.enrichHTML(this.item.system.descriptionmj, { async: true }),
 | 
			
		||||
      isComestible: this.item.isComestible()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const competences = await SystemCompendiums.getCompetences(this.actor?.type);
 | 
			
		||||
@@ -97,18 +117,18 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
      formData.competences = competences.filter(it => RdDItemCompetence.isDraconic(it));
 | 
			
		||||
    }
 | 
			
		||||
    if (this.item.type == 'recettecuisine') {
 | 
			
		||||
      formData.ingredients = await TextEditor.enrichHTML(this.object.system.ingredients, {async: true})
 | 
			
		||||
      formData.ingredients = await TextEditor.enrichHTML(this.object.system.ingredients, { async: true })
 | 
			
		||||
    }
 | 
			
		||||
    if (this.item.type == 'extraitpoetique') {
 | 
			
		||||
      formData.extrait = await TextEditor.enrichHTML(this.object.system.extrait, {async: true})
 | 
			
		||||
      formData.texte = await TextEditor.enrichHTML(this.object.system.texte, {async: true})
 | 
			
		||||
      formData.extrait = await TextEditor.enrichHTML(this.object.system.extrait, { async: true })
 | 
			
		||||
      formData.texte = await TextEditor.enrichHTML(this.object.system.texte, { async: true })
 | 
			
		||||
    }
 | 
			
		||||
    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})
 | 
			
		||||
      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();
 | 
			
		||||
@@ -133,25 +153,10 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
    return formData;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  prepareConteneurData(formData) {
 | 
			
		||||
    RdDUtility.filterEquipementParType(formData, this.actor.itemTypes);
 | 
			
		||||
 | 
			
		||||
    this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
 | 
			
		||||
    formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems;
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  /** @override */
 | 
			
		||||
  activateListeners(html) {
 | 
			
		||||
    super.activateListeners(html);
 | 
			
		||||
 | 
			
		||||
    if (this.item.type == 'conteneur') {
 | 
			
		||||
      this.form.ondragstart = (event) => this._onDragStart(event);
 | 
			
		||||
      this.form.ondrop = (event) => this._onDrop(event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let itemSheetDialog = this;
 | 
			
		||||
 | 
			
		||||
    HtmlUtility._showControlWhen($(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.item.isOwned);
 | 
			
		||||
@@ -159,6 +164,8 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
 | 
			
		||||
    // Everything below here is only needed if the sheet is editable
 | 
			
		||||
    if (!this.options.editable) return;
 | 
			
		||||
    this.form.ondragstart = (event) => this._onDragStart(event);
 | 
			
		||||
    this.form.ondrop = (event) => this._onDrop(event);
 | 
			
		||||
 | 
			
		||||
    // Select competence categorie
 | 
			
		||||
    html.find(".categorie").change(event => this._onSelectCategorie(event));
 | 
			
		||||
@@ -175,64 +182,34 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
      this.dateUpdated = game.system.rdd.calendrier.getIndexFromDate(jour, mois);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    html.find('.creer-tache-livre').click((event) => {
 | 
			
		||||
      let actorId = event.currentTarget.attributes['data-actor-id'].value;
 | 
			
		||||
      let actor = game.actors.get(actorId);
 | 
			
		||||
      actor.creerTacheDepuisLivre(this.item);
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.consommer-potion').click((event) => {
 | 
			
		||||
      let actorId = event.currentTarget.attributes['data-actor-id'].value;
 | 
			
		||||
      let actor = game.actors.get(actorId);
 | 
			
		||||
      actor.consommerPotion(this.item);
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.creer-potion-base').click((event) => {
 | 
			
		||||
      let actorId = event.currentTarget.attributes['data-actor-id'].value;
 | 
			
		||||
      let actor = game.actors.get(actorId);
 | 
			
		||||
      actor.dialogFabriquerPotion(this.item);
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.creer-tache-livre').click((event) => this._getEventActor(event).creerTacheDepuisLivre(this.item));
 | 
			
		||||
    html.find('.consommer-potion').click((event) => this._getEventActor(event).consommerPotion(this.item));
 | 
			
		||||
    html.find('.creer-potion-base').click((event) => this._getEventActor(event).dialogFabriquerPotion(this.item));
 | 
			
		||||
 | 
			
		||||
    html.find('.alchimie-tache a').click((event) => {
 | 
			
		||||
      let actorId = event.currentTarget.attributes['data-actor-id'].value;
 | 
			
		||||
      let recetteId = event.currentTarget.attributes['data-recette-id'].value;
 | 
			
		||||
      let tacheName = event.currentTarget.attributes['data-alchimie-tache'].value;
 | 
			
		||||
      let tacheData = event.currentTarget.attributes['data-alchimie-data'].value;
 | 
			
		||||
      let actor = game.actors.get(actorId);
 | 
			
		||||
      let actor = this._getEventActor(event);
 | 
			
		||||
      if (actor) {
 | 
			
		||||
        let recetteId = event.currentTarget.attributes['data-recette-id'].value;
 | 
			
		||||
        let tacheName = event.currentTarget.attributes['data-alchimie-tache'].value;
 | 
			
		||||
        let tacheData = event.currentTarget.attributes['data-alchimie-data'].value;
 | 
			
		||||
        actor.effectuerTacheAlchimie(recetteId, tacheName, tacheData);
 | 
			
		||||
      } else {
 | 
			
		||||
        ui.notifications.info("Impossible trouver un acteur pour réaliser cette tache Alchimique.");
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    html.find('.item-split').click(async event => {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor);
 | 
			
		||||
      await RdDSheetUtility.splitItem(item, this.actor, async () => itemSheetDialog.render(true));
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-edit').click(async event => {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor);
 | 
			
		||||
      item.sheet.render(true);
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-delete').click(async event => {
 | 
			
		||||
      const li = RdDSheetUtility.getEventElement(event);
 | 
			
		||||
      const item = this.actor.getObjet(li.data("item-id"));
 | 
			
		||||
      RdDUtility.confirmerSuppressionItem(this, item, li);
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-vendre').click(async event => {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor);
 | 
			
		||||
      item?.proposerVente();
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-montrer').click(async event => {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor);
 | 
			
		||||
      item?.postItem();
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-action').click(async event => {
 | 
			
		||||
      const item = RdDSheetUtility.getItem(event, this.actor);
 | 
			
		||||
      this.actor.actionItem(item, async () => itemSheetDialog.render(true));
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.conteneur-name a').click(async event => {
 | 
			
		||||
      RdDUtility.toggleAfficheContenu(RdDSheetUtility.getItemId(event));
 | 
			
		||||
      this.render(true);
 | 
			
		||||
    });
 | 
			
		||||
    html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, async () => itemSheetDialog.render(true)));
 | 
			
		||||
    html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true));
 | 
			
		||||
    html.find('.item-delete').click(async event => RdDUtility.confirmerSuppressionItem(this, RdDSheetUtility.getItem(event, this.actor)));
 | 
			
		||||
    html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente());
 | 
			
		||||
    html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem());
 | 
			
		||||
    html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor, async () => itemSheetDialog.render(true)));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _getEventActor(event) {
 | 
			
		||||
    let actorId = event.currentTarget.attributes['data-actor-id'].value;
 | 
			
		||||
    let actor = game.actors.get(actorId);
 | 
			
		||||
    return actor;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -247,65 +224,51 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  get template() {
 | 
			
		||||
    let type = this.item.type
 | 
			
		||||
    return `systems/foundryvtt-reve-de-dragon/templates/item-${type}-sheet.html`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
  /** @override */
 | 
			
		||||
  _updateObject(event, formData) {
 | 
			
		||||
    // Données de bonus de cases ?
 | 
			
		||||
    formData['system.bonuscase'] = RdDItemSort.buildBonusCaseStringFromFormData(formData.bonusValue, formData.caseValue);
 | 
			
		||||
    if (this.item.type == 'sort') {
 | 
			
		||||
      // Données de bonus de cases ?
 | 
			
		||||
      formData['system.bonuscase'] = RdDItemSort.buildBonusCaseStringFromFormData(formData.bonusValue, formData.caseValue);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return this.item.update(formData);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _onDragStart(event) {
 | 
			
		||||
    console.log("_onDragStart", event);
 | 
			
		||||
    if (event.target.classList.contains("entity-link")) return;
 | 
			
		||||
 | 
			
		||||
    const itemId = event.srcElement?.attributes["data-item-id"].value;
 | 
			
		||||
    const item = this.actor.items.get(itemId);
 | 
			
		||||
    // Create drag data
 | 
			
		||||
    const dragData = {
 | 
			
		||||
      actorId: this.actor.id,
 | 
			
		||||
      type: "Item",
 | 
			
		||||
      data: item.system
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async _onDrop(event) {
 | 
			
		||||
    // Try to extract the dragData
 | 
			
		||||
    let dragData;
 | 
			
		||||
    try {
 | 
			
		||||
      dragData = JSON.parse(event.dataTransfer.getData('text/plain'));
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let dragData = RdDItemSheet.$extractDragData(event);
 | 
			
		||||
    if (!dragData) return false;
 | 
			
		||||
    const allowed = Hooks.call("dropActorSheetData", this.actor, this, dragData);
 | 
			
		||||
    if (allowed === false) return;
 | 
			
		||||
    if (allowed === false) return false;
 | 
			
		||||
 | 
			
		||||
    // Handle different dragData types
 | 
			
		||||
    switch (dragData.type) {
 | 
			
		||||
      case "Item":
 | 
			
		||||
        return this._onDropItem(event, dragData);
 | 
			
		||||
      case "Actor":
 | 
			
		||||
        return this._onDropActor(event, dragData);
 | 
			
		||||
    }
 | 
			
		||||
    return super._onDrop(event);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _onDropItem(event, dragData) {
 | 
			
		||||
    if (this.actor) {
 | 
			
		||||
      const dropParams = RdDSheetUtility.prepareItemDropParameters(this.item.id, this.actor.id, dragData, this.objetVersConteneur);
 | 
			
		||||
      await this.actor.processDropItem(dropParams);
 | 
			
		||||
      await this.render(true);
 | 
			
		||||
    }
 | 
			
		||||
  static $extractDragData(event) {
 | 
			
		||||
    try {
 | 
			
		||||
      const eventData = event?.dataTransfer?.getData('text/plain');
 | 
			
		||||
      if (eventData) {
 | 
			
		||||
        return JSON.parse(eventData);
 | 
			
		||||
      }
 | 
			
		||||
    } catch (err) { }
 | 
			
		||||
    return undefined;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async _onDropItem(event, dragData) {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async _onDropActor(event, dragData) {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,14 @@
 | 
			
		||||
import { SYSTEM_RDD } from "./constants.js";
 | 
			
		||||
import { RdDItemSheet } from "./item-sheet.js";
 | 
			
		||||
import { RdDItemSigneDraconique } from "./item-signedraconique.js";
 | 
			
		||||
import { TMRUtility } from "./tmr-utility.js";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Item sheet pour signes draconiques
 | 
			
		||||
 * @extends {ItemSheet}
 | 
			
		||||
 * @extends {RdDItemSheet}
 | 
			
		||||
 */
 | 
			
		||||
export class RdDSigneDraconiqueItemSheet extends ItemSheet {
 | 
			
		||||
export class RdDSigneDraconiqueItemSheet extends RdDItemSheet {
 | 
			
		||||
 | 
			
		||||
  /** @override */
 | 
			
		||||
  static get defaultOptions() {
 | 
			
		||||
    return mergeObject(super.defaultOptions, {
 | 
			
		||||
      classes: [SYSTEM_RDD, "sheet", "item"],
 | 
			
		||||
      template: "systems/foundryvtt-reve-de-dragon/templates/item-signedraconique-sheet.html",
 | 
			
		||||
      width: 550,
 | 
			
		||||
      height: 550
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _getHeaderButtons() {
 | 
			
		||||
    let buttons = super._getHeaderButtons();
 | 
			
		||||
    buttons.unshift({ class: "post", icon: "fas fa-comment", onclick: ev => this.item.postItem() });
 | 
			
		||||
    return buttons;
 | 
			
		||||
  }
 | 
			
		||||
  static get ITEM_TYPE() { return "signedraconique" }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  /** @override */
 | 
			
		||||
@@ -61,12 +46,13 @@ export class RdDSigneDraconiqueItemSheet extends ItemSheet {
 | 
			
		||||
    if (!this.options.editable) return;
 | 
			
		||||
 | 
			
		||||
    html.find(".signe-aleatoire").click(event => this.setSigneAleatoire());
 | 
			
		||||
    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("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)));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async setSigneAleatoire() {
 | 
			
		||||
    const newSigne = await RdDItemSigneDraconique.randomSigneDraconique();
 | 
			
		||||
    newSigne.name = this.item.name;
 | 
			
		||||
    this.item.update(newSigne);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -88,12 +74,4 @@ export class RdDSigneDraconiqueItemSheet extends ItemSheet {
 | 
			
		||||
    await this.item.update({ 'system.valeur': newValeur });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  get template() {
 | 
			
		||||
    return `systems/foundryvtt-reve-de-dragon/templates/item-signedraconique-sheet.html`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get title() {
 | 
			
		||||
    return `Signe draconique: ${this.object.name}`;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										285
									
								
								module/item.js
									
									
									
									
									
								
							
							
						
						@@ -1,16 +1,17 @@
 | 
			
		||||
import { DialogItemVente } from "./dialog-item-vente.js";
 | 
			
		||||
import { Grammar } from "./grammar.js";
 | 
			
		||||
import { Monnaie } from "./item-monnaie.js";
 | 
			
		||||
import { Misc } from "./misc.js";
 | 
			
		||||
import { RdDHerbes } from "./rdd-herbes.js";
 | 
			
		||||
import { RdDUtility } from "./rdd-utility.js";
 | 
			
		||||
 | 
			
		||||
const typesObjetsEquipement = [
 | 
			
		||||
const typesObjetsInventaire = [
 | 
			
		||||
  "arme",
 | 
			
		||||
  "armure",
 | 
			
		||||
  "conteneur",
 | 
			
		||||
  "gemme",
 | 
			
		||||
  "herbe",
 | 
			
		||||
  "ingredient",
 | 
			
		||||
  "faune",
 | 
			
		||||
  "livre",
 | 
			
		||||
  "monnaie",
 | 
			
		||||
  "munition",
 | 
			
		||||
@@ -36,6 +37,7 @@ export const defaultItemImg = {
 | 
			
		||||
  conteneur: "systems/foundryvtt-reve-de-dragon/icons/objets/sac_a_dos.webp",
 | 
			
		||||
  sort: "systems/foundryvtt-reve-de-dragon/icons/competence_oniros.webp",
 | 
			
		||||
  herbe: "systems/foundryvtt-reve-de-dragon/icons/botanique/Endorlotte.webp",
 | 
			
		||||
  faune: "systems/foundryvtt-reve-de-dragon/icons/faune/rongeur.webp",
 | 
			
		||||
  ingredient: "systems/foundryvtt-reve-de-dragon/icons/objets/sable_poudre.webp",
 | 
			
		||||
  livre: "systems/foundryvtt-reve-de-dragon/icons/objets/livre.webp",
 | 
			
		||||
  potion: "systems/foundryvtt-reve-de-dragon/icons/objets/liqueur_de_bagdol.webp",
 | 
			
		||||
@@ -70,7 +72,11 @@ export class RdDItem extends Item {
 | 
			
		||||
    return defaultItemImg[itemType];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static isEquipementFieldEditable(type, field) {
 | 
			
		||||
  static isItemInventaire(newLocal) {
 | 
			
		||||
    return typesObjetsInventaire.includes(newLocal.type);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static isFieldInventaireModifiable(type, field) {
 | 
			
		||||
    switch (field) {
 | 
			
		||||
      case 'quantite':
 | 
			
		||||
        if (['conteneur'].includes(type)) {
 | 
			
		||||
@@ -78,18 +84,24 @@ export class RdDItem extends Item {
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      case 'cout':
 | 
			
		||||
        if(['monnaie'].includes(type)){
 | 
			
		||||
          return  game.user.isGM;
 | 
			
		||||
        if (['monnaie'].includes(type)) {
 | 
			
		||||
          return game.user.isGM;
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static getUniteQuantite(type) {
 | 
			
		||||
    switch (type) {
 | 
			
		||||
  getUniteQuantite() {
 | 
			
		||||
    switch (this.type) {
 | 
			
		||||
      case "monnaie": return "(Pièces)"
 | 
			
		||||
      case "herbe": return "(Brins)"
 | 
			
		||||
      case "herbe":
 | 
			
		||||
        switch (this.system.categorie) {
 | 
			
		||||
          case 'Alchimie': case 'Repos': case 'Soin':
 | 
			
		||||
            return "(Brins)"
 | 
			
		||||
          case 'Cuisine': return '';
 | 
			
		||||
        }
 | 
			
		||||
        return '';
 | 
			
		||||
      case "ingredient": return "(Pépins ou Brins)"
 | 
			
		||||
    }
 | 
			
		||||
    return '';
 | 
			
		||||
@@ -98,12 +110,12 @@ export class RdDItem extends Item {
 | 
			
		||||
  constructor(itemData, context) {
 | 
			
		||||
    if (!itemData.img) {
 | 
			
		||||
      itemData.img = RdDItem.getDefaultImg(itemData.type);
 | 
			
		||||
    }  
 | 
			
		||||
    }
 | 
			
		||||
    super(itemData, context);
 | 
			
		||||
  }  
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static getTypesObjetsEquipement() {
 | 
			
		||||
    return typesObjetsEquipement
 | 
			
		||||
  static getItemTypesInventaire() {
 | 
			
		||||
    return typesObjetsInventaire
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static getTypesOeuvres() {
 | 
			
		||||
@@ -113,11 +125,14 @@ export class RdDItem extends Item {
 | 
			
		||||
  isCompetencePersonnage() {
 | 
			
		||||
    return this.type == 'competence'
 | 
			
		||||
  }
 | 
			
		||||
  isCompetenceCreature() {
 | 
			
		||||
    return this.type == 'competencecreature'
 | 
			
		||||
  }
 | 
			
		||||
  isCompetence() {
 | 
			
		||||
    return typesObjetsCompetence.includes(this.type)
 | 
			
		||||
  }
 | 
			
		||||
  isEquipement() {
 | 
			
		||||
    return typesObjetsEquipement.includes(this.type)
 | 
			
		||||
  isInventaire() {
 | 
			
		||||
    return RdDItem.isItemInventaire(this)
 | 
			
		||||
  }
 | 
			
		||||
  isOeuvre() {
 | 
			
		||||
    return typesObjetsOeuvres.includes(this.type)
 | 
			
		||||
@@ -136,7 +151,7 @@ export class RdDItem extends Item {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getItemGroup() {
 | 
			
		||||
    if (this.isEquipement()) return "equipement";
 | 
			
		||||
    if (this.isInventaire()) return "equipement";
 | 
			
		||||
    if (this.isOeuvre()) return "oeuvre";
 | 
			
		||||
    if (this.isDraconique()) return "draconique";
 | 
			
		||||
    if (this.isConnaissance()) return "connaissance";
 | 
			
		||||
@@ -157,9 +172,25 @@ export class RdDItem extends Item {
 | 
			
		||||
    return !this.isConteneur() || (this.system.contenu?.length ?? 0) == 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isAlcool() {
 | 
			
		||||
    return this.type == 'nourritureboisson' && this.system.boisson && this.system.alcoolise;
 | 
			
		||||
  isNourritureBoisson() {
 | 
			
		||||
    return this.type == 'nourritureboisson';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isComestible() {
 | 
			
		||||
    switch (this.type) {
 | 
			
		||||
      case 'nourritureboisson': return 'pret';
 | 
			
		||||
      case 'herbe':
 | 
			
		||||
        return this.system.categorie == 'Cuisine' && this.system.sust > 0 ? 'brut' : '';
 | 
			
		||||
      case 'faune':
 | 
			
		||||
        return this.system.sust > 0 ? 'brut' : '';
 | 
			
		||||
    }
 | 
			
		||||
    return '';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isAlcool() {
 | 
			
		||||
    return this.isNourritureBoisson() && this.system.boisson && this.system.alcoolise;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isHerbeAPotion() {
 | 
			
		||||
    return this.type == 'herbe' && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos');
 | 
			
		||||
  }
 | 
			
		||||
@@ -180,18 +211,27 @@ export class RdDItem extends Item {
 | 
			
		||||
 | 
			
		||||
  getEncTotal() {
 | 
			
		||||
    return this.getEnc() * this.getQuantite();
 | 
			
		||||
  }  
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getEnc() {
 | 
			
		||||
    switch (this.type) {
 | 
			
		||||
      case 'herbe':
 | 
			
		||||
        return encBrin;
 | 
			
		||||
        return this.getEncHerbe();
 | 
			
		||||
      case 'gemme':
 | 
			
		||||
        return encPepin * this.system.taille;
 | 
			
		||||
    }
 | 
			
		||||
    return Math.max(this.system.encombrement ?? 0, 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getEncHerbe() {
 | 
			
		||||
    switch (this.system.categorie) {
 | 
			
		||||
      case 'Repos': case 'Soin': case 'Alchimie':
 | 
			
		||||
        return encBrin;
 | 
			
		||||
    }
 | 
			
		||||
    return this.system.encombrement;
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  valeurTotale() {
 | 
			
		||||
    return this.getQuantite() * this.valeur()
 | 
			
		||||
  }
 | 
			
		||||
@@ -202,7 +242,7 @@ export class RdDItem extends Item {
 | 
			
		||||
 | 
			
		||||
  prepareDerivedData() {
 | 
			
		||||
    super.prepareDerivedData();
 | 
			
		||||
    if (this.isEquipement()) {
 | 
			
		||||
    if (this.isInventaire()) {
 | 
			
		||||
      this.system.encTotal = this.getEncTotal();
 | 
			
		||||
      if (this.isPotion()) {
 | 
			
		||||
        this.prepareDataPotion()
 | 
			
		||||
@@ -223,19 +263,43 @@ export class RdDItem extends Item {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getActionPrincipale(options = { warnIfNot: true }) {
 | 
			
		||||
    const warn = 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;
 | 
			
		||||
    }
 | 
			
		||||
    if (this.actor?.isPersonnage()) {
 | 
			
		||||
      const warn = options.warnIfNot;
 | 
			
		||||
      if (this.isComestible() == 'brut') {
 | 
			
		||||
        return 'Utiliser';
 | 
			
		||||
      }
 | 
			
		||||
      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 'herbe': return this.isHerbeAPotion() ? this._actionOrWarnQuantiteZero('Décoction', warn) : undefined;
 | 
			
		||||
        case 'queue': case 'ombre': return this.system.refoulement > 0 ? 'Refouler' : undefined;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return undefined;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async actionPrincipale(actor, onActionItem = async () => { }) {
 | 
			
		||||
    if (!this.getActionPrincipale()) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    if (await actor.actionNourritureboisson(this, onActionItem)) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    switch (this.type) {
 | 
			
		||||
      case 'potion': return await actor.consommerPotion(this, onActionItem);
 | 
			
		||||
      case 'livre': return await actor.actionLire(this);
 | 
			
		||||
      case 'conteneur': return await this.sheet.render(true);
 | 
			
		||||
      case 'herbe': return await actor.actionHerbe(this);
 | 
			
		||||
      case 'queue': case 'ombre': return await actor.actionRefoulement(this);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _actionOrWarnQuantiteZero(actionName, warn){
 | 
			
		||||
  _actionOrWarnQuantiteZero(actionName, warn) {
 | 
			
		||||
    if ((this.system.quantite ?? 0) <= 0) {
 | 
			
		||||
      if (warn) {
 | 
			
		||||
        ui.notifications.warn(`Vous n'avez plus de ${this.name}.`);
 | 
			
		||||
@@ -252,6 +316,42 @@ export class RdDItem extends Item {
 | 
			
		||||
    await this.quantiteIncDec(-nombre, options);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async onCreateDecoupeComestible(actor) {
 | 
			
		||||
    if (actor && this.isComestible() == 'brut' && this.system.sust != 1) {
 | 
			
		||||
      if (this.system.sust < 1) {
 | 
			
		||||
        await actor.updateEmbeddedDocuments('Item', [{
 | 
			
		||||
          _id: this.id,
 | 
			
		||||
          'system.sust': 0
 | 
			
		||||
        }])
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        const sust = Math.floor(this.system.sust);
 | 
			
		||||
        await actor.updateEmbeddedDocuments('Item', [{
 | 
			
		||||
          _id: this.id,
 | 
			
		||||
          'system.quantite': this.system.quantite * sust,
 | 
			
		||||
          'system.encombrement': Misc.keepDecimals(this.system.encombrement / sust, 2),
 | 
			
		||||
          'system.cout': Misc.keepDecimals(this.system.cout / sust, 2),
 | 
			
		||||
          'system.sust': 1
 | 
			
		||||
        }])
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async empiler(item) {
 | 
			
		||||
    if (this.isComestible() == 'brut') {
 | 
			
		||||
      const sust = this.system.sust + item.system.sust;
 | 
			
		||||
      const encombrement = this.system.encombrement + item.system.encombrement;
 | 
			
		||||
      await this.update({
 | 
			
		||||
        "system.sust": sust,
 | 
			
		||||
        "system.encombrement": encombrement
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      await this.quantiteIncDec(item.system.quantite);
 | 
			
		||||
    }
 | 
			
		||||
    await item.delete();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async quantiteIncDec(nombre, options = { diminuerQuantite: true, supprimerSiZero: false }) {
 | 
			
		||||
    const quantite = Number(this.system.quantite ?? -1);
 | 
			
		||||
    if (quantite >= 0) {
 | 
			
		||||
@@ -275,14 +375,13 @@ 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é
 | 
			
		||||
  isEquipementEmpilable(other) {
 | 
			
		||||
    if (!other || !this.isEquipement()) {
 | 
			
		||||
  isInventaireEmpilable(other) {
 | 
			
		||||
    if (!other || !this.isInventaire()) {
 | 
			
		||||
      return [false, undefined];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this.system.quantite == undefined) {
 | 
			
		||||
      return [false, `Impossible de regrouper des ${this.type}, ils ne sont pas empilables`];
 | 
			
		||||
    } 
 | 
			
		||||
    }
 | 
			
		||||
    else if (this.type != other.type) {
 | 
			
		||||
      return [false, `Impossible de regrouper des ${this.type} avec des ${other.type}`];
 | 
			
		||||
    }
 | 
			
		||||
@@ -290,8 +389,13 @@ export class RdDItem extends Item {
 | 
			
		||||
      return [false, `Impossible de regrouper ${this.name} avec ${other.name}`];
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      const differences = Object.entries(this.system)
 | 
			
		||||
        .filter(([key, value]) => !['quantite', 'cout', 'encTotal'].includes(key) && value != other.system[key]);
 | 
			
		||||
      const excludedProperties = ['quantite', 'cout', 'encTotal'];
 | 
			
		||||
      if (this.isComestible()) {
 | 
			
		||||
        excludedProperties.push('sust', 'encombrement');
 | 
			
		||||
      }
 | 
			
		||||
      let differences = Object.entries(this.system)
 | 
			
		||||
        .filter(([key, value]) => !excludedProperties.includes(key))
 | 
			
		||||
        .filter(([key, value]) => value != other.system[key])
 | 
			
		||||
      if (differences.length > 0) {
 | 
			
		||||
        let message = `Impossible de regrouper les ${this.type} ${this.name}: `;
 | 
			
		||||
        for (const [key, value] of differences) {
 | 
			
		||||
@@ -309,7 +413,7 @@ export class RdDItem extends Item {
 | 
			
		||||
      ui.notifications.warn(`Votre ${this.name} n'est pas vide, pas possible de le proposer`);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    await DialogItemVente.display(this, async (vente) =>  {
 | 
			
		||||
    await DialogItemVente.display(this, async (vente) => {
 | 
			
		||||
      vente["properties"] = this.getProprietes();
 | 
			
		||||
      if (vente.isOwned) {
 | 
			
		||||
        if (vente.quantiteNbLots * vente.tailleLot > vente.quantiteMax) {
 | 
			
		||||
@@ -318,7 +422,7 @@ export class RdDItem extends Item {
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      vente.jsondata = JSON.stringify(vente.item);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
      console.log(vente);
 | 
			
		||||
      let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente);
 | 
			
		||||
      ChatMessage.create(RdDUtility.chatDataSetup(html));
 | 
			
		||||
@@ -327,7 +431,7 @@ export class RdDItem extends Item {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  getProprietes() {
 | 
			
		||||
    return this[`_${this.type}ChatData`]();
 | 
			
		||||
    return this[`_${this.type}ChatData`]().filter(it => it != undefined);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -351,29 +455,31 @@ export class RdDItem extends Item {
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static propertyIfDefined(name, val, condition = (it) => true) {
 | 
			
		||||
    return condition ? [`<b>${name}</b>: ${val}`] : [];
 | 
			
		||||
  static propertyIfDefined(name, val, condition = true) {
 | 
			
		||||
    return condition ? `<b>${name}</b>: ${val}` : undefined;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _inventaireTemplateChatData() {
 | 
			
		||||
    return [
 | 
			
		||||
      RdDItem.propertyIfDefined('Qualité', this.system.qualite, this.system.qualite != 0),
 | 
			
		||||
      RdDItem.propertyIfDefined('Encombrement', this.system.encombrement)
 | 
			
		||||
      // cout et quantité masqués
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _objetChatData() {
 | 
			
		||||
    return [].concat(
 | 
			
		||||
      RdDItem.propertyIfDefined('Résistance', this.system.resistance, this.system.resistance),
 | 
			
		||||
      RdDItem.propertyIfDefined('Qualité', this.system.qualite, this.system.qualite),
 | 
			
		||||
      RdDItem.propertyIfDefined('Encombrement', this.system.encombrement),
 | 
			
		||||
    );
 | 
			
		||||
    return this._inventaireTemplateChatData()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _nourritureboissonChatData() {
 | 
			
		||||
    return [].concat(
 | 
			
		||||
    return [
 | 
			
		||||
      RdDItem.propertyIfDefined('Sustentation', this.system.sust, this.system.sust > 0),
 | 
			
		||||
      RdDItem.propertyIfDefined('Désaltère', this.system.desaltere, this.system.boisson),
 | 
			
		||||
      RdDItem.propertyIfDefined('Force alcool', this.system.force, this.system.boisson && this.system.alcoolise),
 | 
			
		||||
      RdDItem.propertyIfDefined('Exotisme', this.system.exotisme, this.system.exotisme < 0),
 | 
			
		||||
      RdDItem.propertyIfDefined('Qualité', this.system.qualite, this.system.qualite),
 | 
			
		||||
      RdDItem.propertyIfDefined('Encombrement', this.system.encombrement),
 | 
			
		||||
    );
 | 
			
		||||
      ...this._inventaireTemplateChatData()
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _armeChatData() {
 | 
			
		||||
@@ -382,21 +488,19 @@ export class RdDItem extends Item {
 | 
			
		||||
      `<b>Dommages</b>: ${this.system.dommages}`,
 | 
			
		||||
      `<b>Force minimum</b>: ${this.system.force}`,
 | 
			
		||||
      `<b>Resistance</b>: ${this.system.resistance}`,
 | 
			
		||||
      `<b>Encombrement</b>: ${this.system.encombrement}`
 | 
			
		||||
      ...this._inventaireTemplateChatData()
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _conteneurChatData() {
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Capacité</b>: ${this.system.capacite} Enc.`,
 | 
			
		||||
      `<b>Encombrement</b>: ${this.system.encombrement}`
 | 
			
		||||
      ...this._inventaireTemplateChatData()
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _munitionChatData() {
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Encombrement</b>: ${this.system.encombrement}`
 | 
			
		||||
    ]
 | 
			
		||||
    return this._inventaireTemplateChatData()
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _armureChatData() {
 | 
			
		||||
@@ -404,7 +508,7 @@ export class RdDItem extends Item {
 | 
			
		||||
      `<b>Protection</b>: ${this.system.protection}`,
 | 
			
		||||
      `<b>Détérioration</b>: ${this.system.deterioration}`,
 | 
			
		||||
      `<b>Malus armure</b>: ${this.system.malus}`,
 | 
			
		||||
      `<b>Encombrement</b>: ${this.system.encombrement}`
 | 
			
		||||
      ...this._inventaireTemplateChatData()
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -438,16 +542,24 @@ export class RdDItem extends Item {
 | 
			
		||||
  _herbeChatData() {
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Milieu</b>: ${this.system.milieu}`,
 | 
			
		||||
      `<b>Rareté</b>: ${this.system.rarete}`,
 | 
			
		||||
      `<b>Catégorie</b>: ${this.system.categorie}`,
 | 
			
		||||
      ...this._inventaireTemplateChatData()
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _ingredientChatData() {
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Milieu</b>: ${this.system.milieu}`,
 | 
			
		||||
      `<b>Rareté</b>: ${this.system.rarete}`,
 | 
			
		||||
      `<b>Catégorie</b>: ${this.system.categorie}`,
 | 
			
		||||
      ...this._inventaireTemplateChatData()
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _fauneChatData() {
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Sustentation</b>: ${this.system.sust}`,
 | 
			
		||||
      `<b>Milieu</b>: ${this.system.milieu}`,
 | 
			
		||||
      ...this._inventaireTemplateChatData()
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -457,12 +569,9 @@ export class RdDItem extends Item {
 | 
			
		||||
      `<b>Compétence</b>: ${this.system.competence}`,
 | 
			
		||||
      `<b>Périodicité</b>: ${this.system.periodicite}`,
 | 
			
		||||
      `<b>Fatigue</b>: ${this.system.fatigue}`,
 | 
			
		||||
      `<b>Difficulté</b>: ${this.system.difficulte}`
 | 
			
		||||
    ].concat([
 | 
			
		||||
      this.system.cacher_points_de_tache ? [] :`<b>Points de Tâche</b>: ${this.system.points_de_tache}`
 | 
			
		||||
    ]).concat([
 | 
			
		||||
      `<b>Difficulté</b>: ${this.system.difficulte}`,
 | 
			
		||||
      RdDItem.propertyIfDefined('Points de Tâche', this.system.points_de_tache, this.system.cacher_points_de_tache),
 | 
			
		||||
      `<b>Points de Tâche atteints</b>: ${this.system.points_de_tache_courant}`]
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _livreChatData() {
 | 
			
		||||
@@ -470,8 +579,8 @@ export class RdDItem extends Item {
 | 
			
		||||
      `<b>Compétence</b>: ${this.system.competence}`,
 | 
			
		||||
      `<b>Auteur</b>: ${this.system.auteur}`,
 | 
			
		||||
      `<b>Difficulté</b>: ${this.system.difficulte}`,
 | 
			
		||||
      `<b>Points de Tâche</b>: ${this.system.points_de_tache}`,
 | 
			
		||||
      `<b>Encombrement</b>: ${this.system.encombrement}`
 | 
			
		||||
      RdDItem.propertyIfDefined('Points de Tâche', this.system.points_de_tache, this.system.cacher_points_de_tache),
 | 
			
		||||
      ...this._inventaireTemplateChatData()
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -479,32 +588,44 @@ export class RdDItem extends Item {
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Rareté</b>: ${this.system.rarete}`,
 | 
			
		||||
      `<b>Catégorie</b>: ${this.system.categorie}`,
 | 
			
		||||
      `<b>Encombrement</b>: ${this.system.encombrement}`,
 | 
			
		||||
      ...this._inventaireTemplateChatData()
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _queueChatData() {
 | 
			
		||||
    function label(categorie) {
 | 
			
		||||
      switch (categorie) {
 | 
			
		||||
        case 'ideefixe': return 'Idée fixe';
 | 
			
		||||
        case 'lancinant': return 'Désir lancinant';
 | 
			
		||||
      }
 | 
			
		||||
      return ''
 | 
			
		||||
    }
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Refoulement</b>: ${this.system.refoulement}`
 | 
			
		||||
      `<b>Refoulement</b>: ${this.system.refoulement}`,
 | 
			
		||||
      `<b>Catégorie</b>: ${label(this.system.categorie)}`,
 | 
			
		||||
      `<b>Affecte</b>: ${this.system.hautrevant ? 'les haut-rêvants' : 'tout le monde'}`,
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _ombreChatData() {
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Refoulement</b>: ${this.system.refoulement}`
 | 
			
		||||
    ]
 | 
			
		||||
    return this._queueChatData()
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _souffleChatData() {
 | 
			
		||||
    return [];
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Affecte</b>: ${this.system.hautrevant ? 'les haut-rêvants' : 'tout le monde'}`,
 | 
			
		||||
    ];
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _teteChatData() {
 | 
			
		||||
    return [];
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Affecte</b>: ${this.system.hautrevant ? 'les haut-rêvants' : 'tout le monde'}`,
 | 
			
		||||
    ];
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _tarotChatData() {
 | 
			
		||||
    return [
 | 
			
		||||
      RdDItem.propertyIfDefined('Carte', RdDUtility.linkCompendium(this.pack, this.id, this.name), this.pack),
 | 
			
		||||
      `<b>Concept</b>: ${this.system.concept}`,
 | 
			
		||||
      `<b>Aspect</b>: ${this.system.aspect}`,
 | 
			
		||||
    ]
 | 
			
		||||
@@ -518,10 +639,7 @@ export class RdDItem extends Item {
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _monnaieChatData() {
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Valeur en Sols</b>: ${this.system.cout}`,
 | 
			
		||||
      `<b>Encombrement</b>: ${this.system.encombrement}`
 | 
			
		||||
    ]
 | 
			
		||||
    return this._inventaireTemplateChatData()
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _meditationChatData() {
 | 
			
		||||
@@ -545,9 +663,9 @@ export class RdDItem extends Item {
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Force</b>: ${this.system.force}`,
 | 
			
		||||
      `<b>Force</b>: ${this.system.formule}`,
 | 
			
		||||
      `<b>Refoulement</b>: ${this.system.refoulement}`,
 | 
			
		||||
      `<b>Présent de cités</b>: ${this.system.presentCite}`,
 | 
			
		||||
      RdDItem.propertyIfDefined('<b>Présent de cités</b>', '', this.system.presentCite),
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -562,15 +680,12 @@ export class RdDItem extends Item {
 | 
			
		||||
    if (!this.system.identifie) {
 | 
			
		||||
      return [`<b>Inconnue</b>`]
 | 
			
		||||
    }
 | 
			
		||||
    let properties = [
 | 
			
		||||
        `<b>Malignité</b>: ${this.system.malignite}`,
 | 
			
		||||
        `<b>Périodicité</b>: ${this.system.periodicite}`,
 | 
			
		||||
        `<b>Dommages</b>: ${this.system.dommages}`
 | 
			
		||||
      ]
 | 
			
		||||
    if (this.system.remedesconnus) {
 | 
			
		||||
      properties.push(`<b>Remedes</b>: ${this.system.remedes}`)
 | 
			
		||||
    }
 | 
			
		||||
    return properties;
 | 
			
		||||
    return [
 | 
			
		||||
      `<b>Malignité</b>: ${this.system.malignite}`,
 | 
			
		||||
      `<b>Périodicité</b>: ${this.system.periodicite}`,
 | 
			
		||||
      `<b>Dommages</b>: ${this.system.dommages}`,
 | 
			
		||||
      RdDItem.propertyIfDefined('<b>Remedes</b>', this.system.remedes, this.system.remedesconnus),
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -585,7 +700,7 @@ export class RdDItem extends Item {
 | 
			
		||||
      `<b>Taille</b>: ${this.system.taille}`,
 | 
			
		||||
      `<b>Inertie</b>: ${this.system.inertie}`,
 | 
			
		||||
      `<b>Enchantabilité</b>: ${this.system.enchantabilite}`,
 | 
			
		||||
      `<b>Prix</b>: ${this.system.cout}`,
 | 
			
		||||
      ...this._inventaireTemplateChatData()
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,8 @@ export class Misc {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static typeName(type, subType) {
 | 
			
		||||
    return game.i18n.localize(`${type.toUpperCase()}.Type${Misc.upperFirst(subType)}`);
 | 
			
		||||
    return subType ? game.i18n.localize(`${type.toUpperCase()}.Type${Misc.upperFirst(subType)}`)
 | 
			
		||||
      : '';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
 
 | 
			
		||||
@@ -246,7 +246,7 @@ export class RdDCombatManager extends Combat {
 | 
			
		||||
    if (actions.length > 0) {
 | 
			
		||||
      return actions;
 | 
			
		||||
    }
 | 
			
		||||
    if (actor.isCreature()) {
 | 
			
		||||
    if (actor.isCreatureEntite()) {
 | 
			
		||||
      actions = actions.concat(RdDCombatManager.listActionsCreature(actor.itemTypes['competencecreature']));
 | 
			
		||||
    } else {
 | 
			
		||||
      // Recupération des items 'arme'
 | 
			
		||||
@@ -821,7 +821,7 @@ export class RdDCombat {
 | 
			
		||||
      essais: {}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (this.attacker.isCreature()) {
 | 
			
		||||
    if (this.attacker.isCreatureEntite()) {
 | 
			
		||||
      RdDItemCompetenceCreature.setRollDataCreature(rollData);
 | 
			
		||||
    }
 | 
			
		||||
    else if (arme) {
 | 
			
		||||
@@ -1079,7 +1079,7 @@ export class RdDCombat {
 | 
			
		||||
      show: {}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (this.defender.isCreature()) {
 | 
			
		||||
    if (this.defender.isCreatureEntite()) {
 | 
			
		||||
      RdDItemCompetenceCreature.setRollDataCreature(defenderRoll);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1158,7 +1158,7 @@ export class RdDCombat {
 | 
			
		||||
      show: {}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (this.defender.isCreature()) {
 | 
			
		||||
    if (this.defender.isCreatureEntite()) {
 | 
			
		||||
      RdDItemCompetenceCreature.setRollDataCreature(rollData);
 | 
			
		||||
    }
 | 
			
		||||
    return rollData;
 | 
			
		||||
 
 | 
			
		||||
@@ -42,6 +42,8 @@ import { TMRRencontres } from "./tmr-rencontres.js";
 | 
			
		||||
import { RdDHerbeItemSheet } from "./item-herbe-sheet.js";
 | 
			
		||||
import { Environnement } from "./environnement.js";
 | 
			
		||||
import { RdDIngredientItemSheet } from "./item-ingredient-sheet.js";
 | 
			
		||||
import { RdDFauneItemSheet } from "./item-faune-sheet.js";
 | 
			
		||||
import { RdDConteneurItemSheet } from "./item-conteneur-sheet.js";
 | 
			
		||||
 | 
			
		||||
/* -------------------------------------------- */
 | 
			
		||||
/*  Foundry VTT Initialization                  */
 | 
			
		||||
@@ -163,8 +165,8 @@ Hooks.once("init", async function () {
 | 
			
		||||
      RdDCombat.onSocketMessage(sockmsg);
 | 
			
		||||
      ChatUtility.onSocketMessage(sockmsg);
 | 
			
		||||
      RdDActor.onSocketMessage(sockmsg);
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
      console.error('game.socket.on(SYSTEM_SOCKET_ID) Exception: ', sockmsg,' => ', e)
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      console.error('game.socket.on(SYSTEM_SOCKET_ID) Exception: ', sockmsg, ' => ', e)
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
@@ -187,28 +189,24 @@ Hooks.once("init", async function () {
 | 
			
		||||
  Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true });
 | 
			
		||||
  Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true });
 | 
			
		||||
  Items.unregisterSheet("core", ItemSheet);
 | 
			
		||||
  Items.registerSheet(SYSTEM_RDD, RdDSigneDraconiqueItemSheet, {
 | 
			
		||||
    label: "Signe draconique",
 | 
			
		||||
    types: ["signedraconique"],
 | 
			
		||||
    makeDefault: true
 | 
			
		||||
  });
 | 
			
		||||
  Items.registerSheet(SYSTEM_RDD, RdDRencontreItemSheet, {
 | 
			
		||||
    label: "Rencontre",
 | 
			
		||||
    types: ["rencontre"],
 | 
			
		||||
    makeDefault: true
 | 
			
		||||
  });
 | 
			
		||||
  RdDHerbeItemSheet.register();
 | 
			
		||||
  RdDIngredientItemSheet.register();
 | 
			
		||||
 | 
			
		||||
  RdDItemSheet.register(RdDSigneDraconiqueItemSheet);
 | 
			
		||||
  RdDItemSheet.register(RdDRencontreItemSheet);
 | 
			
		||||
  RdDItemSheet.register(RdDConteneurItemSheet);
 | 
			
		||||
  RdDItemSheet.register(RdDHerbeItemSheet);
 | 
			
		||||
  RdDItemSheet.register(RdDFauneItemSheet);
 | 
			
		||||
  RdDItemSheet.register(RdDIngredientItemSheet);
 | 
			
		||||
 | 
			
		||||
  Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
 | 
			
		||||
    types: [
 | 
			
		||||
      "competence", "competencecreature",
 | 
			
		||||
      "recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
 | 
			
		||||
      "objet", "arme", "armure", "conteneur", "livre", "potion", "munition",
 | 
			
		||||
      "objet", "arme", "armure", "livre", "potion", "munition",
 | 
			
		||||
      "monnaie", "nourritureboisson", "gemme",
 | 
			
		||||
      "meditation", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve",
 | 
			
		||||
      "nombreastral", "tache", "maladie", "poison", "possession",
 | 
			
		||||
      "tarot", "extraitpoetique"
 | 
			
		||||
  ], makeDefault: true
 | 
			
		||||
    ], makeDefault: true
 | 
			
		||||
  });
 | 
			
		||||
  CONFIG.Combat.documentClass = RdDCombatManager;
 | 
			
		||||
 | 
			
		||||
@@ -247,8 +245,8 @@ function messageDeBienvenue() {
 | 
			
		||||
 | 
			
		||||
/* -------------------------------------------- */
 | 
			
		||||
// Register world usage statistics
 | 
			
		||||
function registerUsageCount( registerKey ) {
 | 
			
		||||
  if ( game.user.isGM ) {
 | 
			
		||||
function registerUsageCount(registerKey) {
 | 
			
		||||
  if (game.user.isGM) {
 | 
			
		||||
    game.settings.register("world", "world-key", {
 | 
			
		||||
      name: "Unique world key",
 | 
			
		||||
      scope: "world",
 | 
			
		||||
@@ -258,9 +256,9 @@ function registerUsageCount( registerKey ) {
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    let worldKey = game.settings.get("world", "world-key")
 | 
			
		||||
    if ( worldKey == undefined || worldKey == "" ) {
 | 
			
		||||
    if (worldKey == undefined || worldKey == "") {
 | 
			
		||||
      worldKey = randomID(32)
 | 
			
		||||
      game.settings.set("world", "world-key", worldKey )
 | 
			
		||||
      game.settings.set("world", "world-key", worldKey)
 | 
			
		||||
    }
 | 
			
		||||
    let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
 | 
			
		||||
    $.ajax(regURL)
 | 
			
		||||
@@ -300,7 +298,7 @@ Hooks.once("ready", async function () {
 | 
			
		||||
  }
 | 
			
		||||
  if (Misc.isUniqueConnectedGM()) {
 | 
			
		||||
    messageDeBienvenue();
 | 
			
		||||
    registerUsageCount( SYSTEM_RDD );
 | 
			
		||||
    registerUsageCount(SYSTEM_RDD);
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,7 @@ export class RdDPossession {
 | 
			
		||||
      defender: defender,
 | 
			
		||||
      targetToken: Targets.extractTokenData(target)
 | 
			
		||||
    };
 | 
			
		||||
    if (attacker.isCreature()) {
 | 
			
		||||
    if (attacker.isCreatureEntite()) {
 | 
			
		||||
      RdDItemCompetenceCreature.setRollDataCreature(rollData)
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 
 | 
			
		||||
@@ -19,17 +19,23 @@ export class RdDSheetUtility {
 | 
			
		||||
    return $(event.currentTarget)?.parents(".item");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static prepareItemDropParameters(destItemId, actorId, dragData, objetVersConteneur) {
 | 
			
		||||
  static prepareItemDropParameters(destItemId, actor, dragData, objetVersConteneur) {
 | 
			
		||||
    const item = fromUuidSync(dragData.uuid)
 | 
			
		||||
    return {
 | 
			
		||||
      destId: destItemId,
 | 
			
		||||
      targetActorId: actorId,
 | 
			
		||||
      itemId: item.id,
 | 
			
		||||
      sourceActorId: item.actor?.id,
 | 
			
		||||
      srcId: objetVersConteneur[item.id],
 | 
			
		||||
      onEnleverConteneur: () => { delete objetVersConteneur[item.id]; },
 | 
			
		||||
      onAjouterDansConteneur: (itemId, conteneurId) => { objetVersConteneur[itemId] = conteneurId; }
 | 
			
		||||
    if (actor.canReceive(item)) {
 | 
			
		||||
      return {
 | 
			
		||||
        destId: destItemId,
 | 
			
		||||
        targetActorId: actor.id,
 | 
			
		||||
        itemId: item.id,
 | 
			
		||||
        sourceActorId: item.actor?.id,
 | 
			
		||||
        srcId: objetVersConteneur[item.id],
 | 
			
		||||
        onEnleverConteneur: () => { delete objetVersConteneur[item.id]; },
 | 
			
		||||
        onAjouterDansConteneur: (itemId, conteneurId) => { objetVersConteneur[itemId] = conteneurId; }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      ui.notifications.warn(`Impossible de donner ${item.name} à ${actor.name}: ${item.type} / ${actor.type}`);
 | 
			
		||||
    }
 | 
			
		||||
    return undefined;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static async splitItem(item, actor, onSplit = () => { }) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
/* Common useful functions shared between objects */
 | 
			
		||||
 | 
			
		||||
import { ChatUtility } from "./chat-utility.js";
 | 
			
		||||
import { RdDCombat } from "./rdd-combat.js";
 | 
			
		||||
import { Misc } from "./misc.js";
 | 
			
		||||
@@ -14,8 +13,8 @@ import { RdDPossession } from "./rdd-possession.js";
 | 
			
		||||
import { RdDNameGen } from "./rdd-namegen.js";
 | 
			
		||||
import { RdDConfirm } from "./rdd-confirm.js";
 | 
			
		||||
import { RdDCalendrier } from "./rdd-calendrier.js";
 | 
			
		||||
import { RdDCarac } from "./rdd-carac.js";
 | 
			
		||||
import { Environnement } from "./environnement.js";
 | 
			
		||||
import { RdDItemCompetence } from "./item-competence.js";
 | 
			
		||||
 | 
			
		||||
/* -------------------------------------------- */
 | 
			
		||||
// This table starts at 0 -> niveau -10
 | 
			
		||||
@@ -172,6 +171,7 @@ export class RdDUtility {
 | 
			
		||||
      //Items
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete-script.hbs',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete.hbs',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item/boutons-comestible.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item/partial-inventaire.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item/partial-environnement.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item/partial-tab-environnement.html',
 | 
			
		||||
@@ -185,6 +185,7 @@ export class RdDUtility {
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item-sort-sheet.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item-herbe-sheet.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item-ingredient-sheet.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item-faune-sheet.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item-livre-sheet.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item-tache-sheet.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/item-potion-sheet.html',
 | 
			
		||||
@@ -220,6 +221,7 @@ export class RdDUtility {
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/enum-tmr-type.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/enum-tmr-effet.html',
 | 
			
		||||
      // Partials
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/common/compendium-link.hbs',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/partial-description-overflow.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/partial-description-sort.html',
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/partial-roll-ajustements.html',
 | 
			
		||||
@@ -279,6 +281,7 @@ export class RdDUtility {
 | 
			
		||||
      'systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html'
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    Handlebars.registerHelper('either', (a, b) => a ?? b);
 | 
			
		||||
    Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null'));
 | 
			
		||||
    Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null'));
 | 
			
		||||
    Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL');
 | 
			
		||||
@@ -296,46 +299,22 @@ export class RdDUtility {
 | 
			
		||||
    Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
 | 
			
		||||
    Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionelles.isUsing(option));
 | 
			
		||||
    Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name)));
 | 
			
		||||
    Handlebars.registerHelper('filtreTriCompetences', competences => competences.filter(it => it.system.isVisible)
 | 
			
		||||
    .sort((a, b) => {
 | 
			
		||||
        if (a.name.startsWith("Survie") && b.name.startsWith("Survie")) {
 | 
			
		||||
          if (a.name.includes("Cité")) return -1;
 | 
			
		||||
          if (b.name.includes("Cité")) return 1;
 | 
			
		||||
          if (a.name.includes("Extérieur")) return -1;
 | 
			
		||||
          if (b.name.includes("Extérieur")) return 1;
 | 
			
		||||
          return a.name.localeCompare(b.name);
 | 
			
		||||
        }
 | 
			
		||||
        if (a.system.categorie.startsWith("melee") && b.system.categorie.startsWith("melee")) {
 | 
			
		||||
          if (a.name.includes("Corps")) return -1;
 | 
			
		||||
          if (b.name.includes("Corps")) return 1;
 | 
			
		||||
          if (a.name.includes("Dague")) return -1;
 | 
			
		||||
          if (b.name.includes("Dague")) return 1;
 | 
			
		||||
          if (a.name.includes("Esquive")) return -1;
 | 
			
		||||
          if (b.name.includes("Esquive")) return 1;
 | 
			
		||||
          return a.name.localeCompare(b.name);
 | 
			
		||||
        }
 | 
			
		||||
        if (a.name.startsWith("Voie") && b.name.startsWith("Voie")) {
 | 
			
		||||
          if (a.name.includes("Oniros")) return -1;
 | 
			
		||||
          if (b.name.includes("Oniros")) return 1;
 | 
			
		||||
          if (a.name.includes("Hypnos")) return -1;
 | 
			
		||||
          if (b.name.includes("Hypnos")) return 1;
 | 
			
		||||
          if (a.name.includes("Narcos")) return -1;
 | 
			
		||||
          if (b.name.includes("Narcos")) return 1;
 | 
			
		||||
          if (a.name.includes("Thanatos")) return -1;
 | 
			
		||||
          if (b.name.includes("Thanatos")) return 1;
 | 
			
		||||
          return a.name.localeCompare(b.name);
 | 
			
		||||
        }
 | 
			
		||||
        return a.name.localeCompare(b.name);
 | 
			
		||||
      })
 | 
			
		||||
      );
 | 
			
		||||
    Handlebars.registerHelper('linkCompendium', (compendium, id, name) => `@Compendium[${compendium}.${id}]{${name}}`);
 | 
			
		||||
    Handlebars.registerHelper('uniteQuantite', (type) => RdDItem.getUniteQuantite(type));
 | 
			
		||||
    Handlebars.registerHelper('isEquipementFieldEditable', (type, field) => RdDItem.isEquipementFieldEditable(type, field));
 | 
			
		||||
    Handlebars.registerHelper('filtreTriCompetences', competences => RdDItemCompetence.triVisible(competences));
 | 
			
		||||
    Handlebars.registerHelper('linkCompendium', (pack, id, name) => RdDUtility.linkCompendium(pack, id, name));
 | 
			
		||||
    Handlebars.registerHelper('uniteQuantite', (itemId, actorId) => RdDUtility.getItem(itemId, actorId)?.getUniteQuantite());
 | 
			
		||||
    Handlebars.registerHelper('isFieldInventaireModifiable', (type, field) => RdDItem.isFieldInventaireModifiable(type, field));
 | 
			
		||||
    Handlebars.registerHelper('getFrequenceRarete', (rarete, field) => Environnement.getFrequenceRarete(rarete, field));
 | 
			
		||||
    Handlebars.registerHelper('either', (a, b) => a ?? b);
 | 
			
		||||
    return loadTemplates(templatePaths);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static getItem(itemId, actorId = undefined) {
 | 
			
		||||
    return actorId ? game.actors.get(actorId)?.getObjet(itemId) : game.items.get(itemId);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static linkCompendium(pack, id, name) {
 | 
			
		||||
    return `@Compendium[${pack}.${id}]{${name}}`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static async creerObjet(actorSheet) {
 | 
			
		||||
    let itemType = $(".item-type").val();
 | 
			
		||||
@@ -344,7 +323,7 @@ export class RdDUtility {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static async selectObjetType(actorSheet) {
 | 
			
		||||
    let typeObjets = RdDItem.getTypesObjetsEquipement();
 | 
			
		||||
    let typeObjets = RdDItem.getItemTypesInventaire();
 | 
			
		||||
    let options = `<span class="competence-label">Selectionnez le type d'équipement</span><select class="item-type">`;
 | 
			
		||||
    for (let typeName of typeObjets) {
 | 
			
		||||
      options += `<option value="${typeName}">${typeName}</option>`
 | 
			
		||||
@@ -466,9 +445,9 @@ export class RdDUtility {
 | 
			
		||||
    formData.livres = this.arrayOrEmpty(itemTypes['livre']);
 | 
			
		||||
    formData.potions = this.arrayOrEmpty(itemTypes['potion']);
 | 
			
		||||
    formData.ingredients = this.arrayOrEmpty(itemTypes['ingredient']);
 | 
			
		||||
    formData.faunes = this.arrayOrEmpty(itemTypes['faune']);
 | 
			
		||||
    formData.herbes = this.arrayOrEmpty(itemTypes['herbe']);
 | 
			
		||||
    formData.monnaie = this.arrayOrEmpty(itemTypes['monnaie']);
 | 
			
		||||
    formData.monnaie.sort(Monnaie.triValeurEntiere());
 | 
			
		||||
    formData.monnaie = this.arrayOrEmpty(itemTypes['monnaie']).sort(Monnaie.triValeurEntiere());
 | 
			
		||||
    formData.nourritureboissons = this.arrayOrEmpty(itemTypes['nourritureboisson']);
 | 
			
		||||
    formData.gemmes = this.arrayOrEmpty(itemTypes['gemme']);
 | 
			
		||||
 | 
			
		||||
@@ -481,6 +460,7 @@ export class RdDUtility {
 | 
			
		||||
      .concat(formData.potions)
 | 
			
		||||
      .concat(formData.ingredients)
 | 
			
		||||
      .concat(formData.herbes)
 | 
			
		||||
      .concat(formData.faunes)
 | 
			
		||||
      .concat(formData.monnaie)
 | 
			
		||||
      .concat(formData.nourritureboissons)
 | 
			
		||||
      .concat(formData.gemmes);
 | 
			
		||||
@@ -996,7 +976,7 @@ export class RdDUtility {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static slideOnDelete(sheet, htmlToDelete) {
 | 
			
		||||
    return htmlToDelete.slideUp(200, () => sheet.render(false));
 | 
			
		||||
    return htmlToDelete?.slideUp(200, () => sheet.render(false));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
 
 | 
			
		||||
@@ -63,7 +63,7 @@ export const referenceAjustements = {
 | 
			
		||||
  },
 | 
			
		||||
  encTotal: {
 | 
			
		||||
    isVisible: (rollData, actor) => RdDCarac.isAgiliteOuDerivee(rollData.selectedCarac) && RdDItemCompetence.isMalusEncombrementTotal(rollData.competence),
 | 
			
		||||
    isUsed: (rollData, actor) => RdDCarac.isAgiliteOuDerivee(rollData.selectedCarac) && RdDItemCompetence.isMalusEncombrementTotal(rollData.competence) && rollData.use.encTotal,
 | 
			
		||||
    isUsed: (rollData, actor) => !rollData.oeuvre && RdDCarac.isAgiliteOuDerivee(rollData.selectedCarac) && RdDItemCompetence.isMalusEncombrementTotal(rollData.competence) && rollData.use.encTotal,
 | 
			
		||||
    getLabel: (rollData, actor) => 'Encombrement total',
 | 
			
		||||
    getValue: (rollData, actor) => -actor.getEncTotal()
 | 
			
		||||
  },
 | 
			
		||||
 
 | 
			
		||||
@@ -497,8 +497,7 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.foundryvtt-reve-de-dragon .sheet-body,
 | 
			
		||||
.foundryvtt-reve-de-dragon .sheet-body .tab,
 | 
			
		||||
.foundryvtt-reve-de-dragon .sheet-body .tab .editor {
 | 
			
		||||
.foundryvtt-reve-de-dragon .sheet-body .tab {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -543,7 +542,7 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
 | 
			
		||||
 | 
			
		||||
.editor {
 | 
			
		||||
  border: 2;
 | 
			
		||||
  height: 300px;
 | 
			
		||||
  height: 10rem;
 | 
			
		||||
  padding: 0 3px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
  "id": "foundryvtt-reve-de-dragon",
 | 
			
		||||
  "title": "Rêve de Dragon",
 | 
			
		||||
  "version": "10.3.4",
 | 
			
		||||
  "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.3.4.zip",
 | 
			
		||||
  "version": "10.3.6",
 | 
			
		||||
  "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.3.6.zip",
 | 
			
		||||
  "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v10/system.json",
 | 
			
		||||
  "compatibility": {
 | 
			
		||||
    "minimum": "10",
 | 
			
		||||
 
 | 
			
		||||
@@ -572,7 +572,7 @@
 | 
			
		||||
    "types": [
 | 
			
		||||
        "competence", "competencecreature",
 | 
			
		||||
        "recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre",
 | 
			
		||||
        "objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition",
 | 
			
		||||
        "objet", "arme", "armure", "conteneur", "herbe", "ingredient", "faune", "livre", "potion", "munition",
 | 
			
		||||
        "monnaie", "nourritureboisson", "gemme",
 | 
			
		||||
        "meditation", "rencontre", "queue", "ombre", "souffle", "tete", "casetmr", "signedraconique", "sort", "sortreserve",
 | 
			
		||||
        "nombreastral", "tache", "maladie", "poison", "possession",
 | 
			
		||||
@@ -595,6 +595,10 @@
 | 
			
		||||
      "environnement": {
 | 
			
		||||
        "milieu": "",
 | 
			
		||||
        "environnement": []
 | 
			
		||||
      },
 | 
			
		||||
      "comestible": {
 | 
			
		||||
        "sust": 0,
 | 
			
		||||
        "exotisme": 0  
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "competence": {
 | 
			
		||||
@@ -699,13 +703,12 @@
 | 
			
		||||
      "templates": [ "description", "inventaire" ]
 | 
			
		||||
    },
 | 
			
		||||
    "nourritureboisson": {
 | 
			
		||||
      "templates": [ "description", "inventaire" ],
 | 
			
		||||
      "sust": 0,
 | 
			
		||||
      "templates": [ "description", "inventaire", "comestible"],
 | 
			
		||||
      "cuisinier": "",
 | 
			
		||||
      "boisson": false,
 | 
			
		||||
      "desaltere": 0,
 | 
			
		||||
      "alcoolise": false,
 | 
			
		||||
      "force": 0,
 | 
			
		||||
      "exotisme": 0
 | 
			
		||||
      "force": 0
 | 
			
		||||
    },
 | 
			
		||||
    "herbe": {
 | 
			
		||||
      "templates": [ "description", "inventaire", "environnement"],
 | 
			
		||||
@@ -714,11 +717,20 @@
 | 
			
		||||
      "categorie": ""
 | 
			
		||||
    },
 | 
			
		||||
    "ingredient": {
 | 
			
		||||
      "templates": [ "description", "inventaire", "environnement" ],
 | 
			
		||||
      "templates": [ "description", "inventaire", "environnement", "comestible"],
 | 
			
		||||
      "niveau": 0,
 | 
			
		||||
      "base": 0,
 | 
			
		||||
      "categorie": ""
 | 
			
		||||
    },
 | 
			
		||||
    "faune": {
 | 
			
		||||
      "templates": [ "description", "inventaire", "environnement", "comestible"],
 | 
			
		||||
      "categorie": "",
 | 
			
		||||
      "actor": {
 | 
			
		||||
        "id": "",
 | 
			
		||||
        "pack": "",
 | 
			
		||||
        "name": ""
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "livre": {
 | 
			
		||||
      "templates": [ "description", "inventaire" ],
 | 
			
		||||
      "competence": "",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
<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">
 | 
			
		||||
  <span class="item-edit flex-grow">
 | 
			
		||||
    {{#if (eq queue.type 'ombre')}}
 | 
			
		||||
    <img class="sheet-competence-img" src="systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp" />
 | 
			
		||||
    {{/if}}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
  {{#each souffles as |souffle key|}}
 | 
			
		||||
  <li class="item flexrow" data-attribute={{key}} data-item-id="{{souffle._id}}">
 | 
			
		||||
    <img class="sheet-competence-img" src="{{souffle.img}}" />
 | 
			
		||||
    <span class="display-label flex-grow"><a>{{souffle.name}}</a></span>
 | 
			
		||||
    <span class="item-edit flex-grow"><a>{{souffle.name}}</a></span>
 | 
			
		||||
    <div class="item-controls flex-shrink">
 | 
			
		||||
      <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
 | 
			
		||||
    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
  {{#each tetes as |tete key|}}
 | 
			
		||||
  <li class="item flexrow" data-attribute={{key}} data-item-id="{{tete._id}}">
 | 
			
		||||
    <img class="sheet-competence-img" src="{{tete.img}}" />
 | 
			
		||||
    <span class="display-label flex-grow"><a>{{tete.name}}</a></span>
 | 
			
		||||
    <span class="item-edit flex-grow"><a>{{tete.name}}</a></span>
 | 
			
		||||
    <div class="item-controls flex-shrink">
 | 
			
		||||
      <a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
 | 
			
		||||
    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    {{#each casestmr as |casetmr key|}}
 | 
			
		||||
    <li class="item list-item flexrow" data-item-id="{{casetmr.id}}" data-attribute="{{key}}">
 | 
			
		||||
      <img class="sheet-competence-img" src="{{casetmr.img}}" />
 | 
			
		||||
      <span class="display-label"><a>{{casetmr.name}}</a></span>
 | 
			
		||||
      <span class="item-edit"><a>{{casetmr.name}}</a></span>
 | 
			
		||||
      <span>{{casetmr.system.coord}} - {{caseTmr-label casetmr.system.coord}}</span> 
 | 
			
		||||
      <div class="item-controls flex-shrink">
 | 
			
		||||
        <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
  {{#each rencontres as |rencontre key|}}
 | 
			
		||||
  <li class="item flexrow" data-item-id="{{rencontre._id}}" data-attribute="{{key}}">
 | 
			
		||||
    <img class="sheet-competence-img" src="{{rencontre.img}}" />
 | 
			
		||||
    <span class="display-label flex-grow"><a>
 | 
			
		||||
    <span class="item-edit flex-grow"><a>
 | 
			
		||||
      {{rencontre.name}} r{{rencontre.system.force}} ({{rencontre.system.coord}} - {{caseTmr-label rencontre.system.coord}})
 | 
			
		||||
    </a></span> 
 | 
			
		||||
    {{#if rencontre.system.date}}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
  {{#each signesdraconiques as |signe key|}}
 | 
			
		||||
    <li class="item list-item flexrow" data-item-id="{{signe._id}}" data-attribute="{{key}}">
 | 
			
		||||
      <img class="sheet-competence-img" src="{{signe.img}}" />
 | 
			
		||||
      <span class="display-label flex-grow"><a>{{signe.name}}</a></span> 
 | 
			
		||||
      <span class="item-edit flex-grow"><a>{{signe.name}}</a></span> 
 | 
			
		||||
      <span class="flex-shrink">{{signe.system.difficulte}}</span>
 | 
			
		||||
      <div class="item-controls flex-shrink">
 | 
			
		||||
        <a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
  {{#each sortsReserve as |sort key|}}
 | 
			
		||||
  <li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}">
 | 
			
		||||
    <img class="sheet-competence-img" src="{{sort.img}}" />
 | 
			
		||||
    <span class="display-label"><a>{{#if sort.system.echectotal}}Echec total: {{/if}}{{sort.name}} r{{sort.system.ptreve}}</a></span> 
 | 
			
		||||
    <span class="item-edit"><a>{{#if sort.system.echectotal}}Echec total: {{/if}}{{sort.name}} r{{sort.system.ptreve}}</a></span> 
 | 
			
		||||
    <span>{{sort.system.coord}} - {{caseTmr-label sort.system.coord}}</span> 
 | 
			
		||||
    <div class="item-controls flex-shrink">
 | 
			
		||||
      <a class="item-delete flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
  {{#each sorts as |sort key|}}
 | 
			
		||||
  <li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}">
 | 
			
		||||
    <img class="sheet-competence-img" src="{{sort.img}}" />
 | 
			
		||||
    <span class="display-label flex-grow-2">
 | 
			
		||||
    <span class="item-edit flex-grow-2">
 | 
			
		||||
      <a data-item-id="{{sort._id}}">{{sort.name}}
 | 
			
		||||
        - {{#if sort.system.caseTMRspeciale}}{{sort.system.caseTMRspeciale}}{{else}}{{upperFirst sort.system.caseTMR}}{{/if}}
 | 
			
		||||
      </a>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								templates/common/compendium-link.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
<a class="content-link" draggable="true" data-pack="{{pack}}" data-uuid="Compendium.{{pack}}.{{id}}" data-id="{{id}}"><i class="fas fa-suitcase"></i>{{name}}</a>
 | 
			
		||||
							
								
								
									
										52
									
								
								templates/item-faune-sheet.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,52 @@
 | 
			
		||||
<form class="{{cssClass}}" autocomplete="off">
 | 
			
		||||
  <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>
 | 
			
		||||
      {{>'systems/foundryvtt-reve-de-dragon/templates/item/boutons-comestible.html'}}
 | 
			
		||||
    </div>
 | 
			
		||||
  </header>
 | 
			
		||||
 | 
			
		||||
  <nav class="sheet-tabs tabs" data-group="primary">
 | 
			
		||||
    <a class="item" data-tab="informations">Informations</a>
 | 
			
		||||
    {{>"systems/foundryvtt-reve-de-dragon/templates/item/partial-tab-environnement.html"}}
 | 
			
		||||
  </nav>
 | 
			
		||||
 | 
			
		||||
  <section class="sheet-body">
 | 
			
		||||
    <div class="tab items" data-group="primary" data-tab="informations">
 | 
			
		||||
      <div class="flexcol">
 | 
			
		||||
        <div class="form-group">
 | 
			
		||||
          <label for="system.sust">Sustentation (si applicable)</label>
 | 
			
		||||
          <input class="attribute-value" type="number" name="system.sust" value="{{system.sust}}" data-dtype="Number" min="0"/>
 | 
			
		||||
        </div>
 | 
			
		||||
        {{#if (gt system.sust 0)}}
 | 
			
		||||
        <div class="form-group">
 | 
			
		||||
          <label for="system.exotisme">Exotisme</label>
 | 
			
		||||
          <input class="attribute-value" type="number" name="system.exotisme" value="{{system.exotisme}}" data-dtype="Number" min="-10" max="0"/>
 | 
			
		||||
        </div>
 | 
			
		||||
        {{/if}}
 | 
			
		||||
        <div class="form-group">
 | 
			
		||||
          <label>Créature correspondante</label>
 | 
			
		||||
          <div>
 | 
			
		||||
          {{#if system.actor.id}}
 | 
			
		||||
            {{#if isGM}}
 | 
			
		||||
            <label>
 | 
			
		||||
              {{>'systems/foundryvtt-reve-de-dragon/templates/common/compendium-link.hbs'
 | 
			
		||||
                pack=system.actor.pack id=system.actor.id name=system.actor.name}}
 | 
			
		||||
            </label>
 | 
			
		||||
            <a class="linked-actor-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
 | 
			
		||||
            {{else}}
 | 
			
		||||
            <label>{{system.actor.name}}</label>
 | 
			
		||||
            {{/if}}
 | 
			
		||||
          {{else}}
 | 
			
		||||
            <label>Pas de fiche de créature</label>
 | 
			
		||||
          {{/if}}
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        {{>"systems/foundryvtt-reve-de-dragon/templates/item/partial-inventaire.html"}}
 | 
			
		||||
        {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    {{>"systems/foundryvtt-reve-de-dragon/templates/item/partial-environnement.html"}}
 | 
			
		||||
  </section>
 | 
			
		||||
</form>
 | 
			
		||||
@@ -5,9 +5,10 @@
 | 
			
		||||
      <h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
 | 
			
		||||
      {{#if isIngredientPotionBase}}
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <span for="xp"><a class="creer-potion-base chat-card-button" data-actor-id="{{actorId}}">Fabriquer une potion depuis cette plante</a></span>
 | 
			
		||||
        <span><a class="creer-potion-base chat-card-button" data-actor-id="{{actorId}}">Fabriquer une potion depuis cette plante</a></span>
 | 
			
		||||
      </div>
 | 
			
		||||
      {{/if}}
 | 
			
		||||
      {{>'systems/foundryvtt-reve-de-dragon/templates/item/boutons-comestible.html'}}
 | 
			
		||||
    </div>
 | 
			
		||||
  </header>
 | 
			
		||||
 | 
			
		||||
@@ -19,10 +20,6 @@
 | 
			
		||||
  <section class="sheet-body">
 | 
			
		||||
    <div class="tab items" data-group="primary" data-tab="informations">
 | 
			
		||||
      <div class="flexcol">
 | 
			
		||||
        <div class="form-group">
 | 
			
		||||
          <label>Niveau (si applicable)</label>
 | 
			
		||||
          <input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number" />
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="form-group">
 | 
			
		||||
          <label>Catégorie</label>
 | 
			
		||||
          <select name="system.categorie" class="categorie" data-dtype="String">
 | 
			
		||||
@@ -31,7 +28,24 @@
 | 
			
		||||
            {{/select}}
 | 
			
		||||
          </select>
 | 
			
		||||
        </div>
 | 
			
		||||
        
 | 
			
		||||
        {{#if (eq isComestible 'brut')}}
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label for="system.sust">Sustentation</label>
 | 
			
		||||
            <input class="attribute-value" type="number" name="system.sust" value="{{system.sust}}" data-dtype="Number" min="0"/>
 | 
			
		||||
          </div>
 | 
			
		||||
          {{#if (gt system.sust 0)}}
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label for="system.exotisme">Exotisme</label>
 | 
			
		||||
            <input class="attribute-value" type="number" name="system.exotisme" value="{{system.exotisme}}" data-dtype="Number" min="-10" max="0"/>
 | 
			
		||||
          </div>
 | 
			
		||||
          {{/if}}
 | 
			
		||||
        {{else}}
 | 
			
		||||
        <div class="form-group">
 | 
			
		||||
          <label>Niveau (si applicable)</label>
 | 
			
		||||
          <input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number" />
 | 
			
		||||
        </div>
 | 
			
		||||
        {{/if}}
 | 
			
		||||
 | 
			
		||||
        {{>"systems/foundryvtt-reve-de-dragon/templates/item/partial-inventaire.html"}}
 | 
			
		||||
        {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
 | 
			
		||||
      </div>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								templates/item/boutons-comestible.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,8 @@
 | 
			
		||||
{{#if (and isOwned isComestible)}}
 | 
			
		||||
<div class="form-group">
 | 
			
		||||
  {{#if (eq isComestible 'brut')}}
 | 
			
		||||
  <span><a class="preparer-nourriture chat-card-button" data-actor-id="{{actorId}}">Cuisiner</a></span>
 | 
			
		||||
  {{/if}}
 | 
			
		||||
  <span><a class="manger-nourriture chat-card-button" data-actor-id="{{actorId}}">Manger cru</a></span>
 | 
			
		||||
</div>
 | 
			
		||||
{{/if}}
 | 
			
		||||
@@ -1,20 +1,20 @@
 | 
			
		||||
<div class="form-group">
 | 
			
		||||
  <label for="system.qualite">Qualité</label>
 | 
			
		||||
  <input class="attribute-value" type="text" name="system.qualite" value="{{system.qualite}}" data-dtype="Number"
 | 
			
		||||
    {{#unless (isEquipementFieldEditable type 'qualite')}}disabled{{/unless}}/>
 | 
			
		||||
    {{#unless (isFieldInventaireModifiable type 'qualite')}}disabled{{/unless}}/>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="form-group">
 | 
			
		||||
  <label for="system.encombrement">Encombrement</label>
 | 
			
		||||
  <input class="attribute-value" type="text" name="system.encombrement" value="{{system.encombrement}}" data-dtype="Number"
 | 
			
		||||
    {{#unless (isEquipementFieldEditable type 'encombrement')}}disabled{{/unless}}/>
 | 
			
		||||
    {{#unless (isFieldInventaireModifiable type 'encombrement')}}disabled{{/unless}}/>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="form-group">
 | 
			
		||||
  <label for="system.quantite">Quantité {{uniteQuantite type}}</label>
 | 
			
		||||
  <label for="system.quantite">Quantité {{uniteQuantite id actorId}}</label>
 | 
			
		||||
  <input class="attribute-value" type="text" name="system.quantite" value="{{system.quantite}}" data-dtype="Number"
 | 
			
		||||
    {{#unless (isEquipementFieldEditable type 'quantite')}}disabled{{/unless}}/>
 | 
			
		||||
  {{#unless (isFieldInventaireModifiable type 'quantite')}}disabled{{/unless}}/>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="form-group item-cout">
 | 
			
		||||
  <label for="system.cout">Prix (sols) </label>
 | 
			
		||||
  <input class="attribute-value" type="text" name="system.cout" value="{{system.cout}}" data-dtype="Number"
 | 
			
		||||
    {{#unless (isEquipementFieldEditable type 'cout')}}disabled{{/unless}}/>
 | 
			
		||||
    {{#unless (isFieldInventaireModifiable type 'cout')}}disabled{{/unless}}/>
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||