Merge branch 'v1.4-equipement' into 'v1.4'
Petites corrections See merge request LeRatierBretonnien/foundryvtt-reve-de-dragon!228
This commit is contained in:
		@@ -37,7 +37,8 @@ export class RdDActorCreatureSheet extends RdDActorSheet {
 | 
			
		||||
    formData.calc.surEncombrementMessage = (formData.data.compteurs.surenc.value < 0) ? "Sur-Encombrement!" : "";
 | 
			
		||||
 | 
			
		||||
    RdDUtility.filterItemsPerTypeForSheet(formData);
 | 
			
		||||
    RdDUtility.buildArbreDeConteneur(this, formData);
 | 
			
		||||
    this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
 | 
			
		||||
    formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
 | 
			
		||||
 | 
			
		||||
    console.log("Creature : ", this.objetVersConteneur, formData);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -112,7 +112,9 @@ export class RdDActorSheet extends ActorSheet {
 | 
			
		||||
      cacheTMR: this.actor.isTMRCache()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RdDUtility.buildArbreDeConteneur(this, formData);
 | 
			
		||||
    this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
 | 
			
		||||
    formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
 | 
			
		||||
 | 
			
		||||
    formData.subacteurs = {
 | 
			
		||||
      vehicules: this.actor.listeVehicules(),
 | 
			
		||||
      montures: this.actor.listeMontures(),
 | 
			
		||||
@@ -130,10 +132,17 @@ export class RdDActorSheet extends ActorSheet {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _onDrop(event) {
 | 
			
		||||
    let toSuper = await this.actor.processItemDropEvent(event, this.objetVersConteneur);
 | 
			
		||||
    if (toSuper) {
 | 
			
		||||
      super._onDrop(event);
 | 
			
		||||
  async _onDropActor(event, dragData) {
 | 
			
		||||
    console.log("DRAG", this.actor.id, dragData);
 | 
			
		||||
    this.actor.addSubacteur(dragData.id || dragData.data._id);
 | 
			
		||||
    super._onDropActor(event, dragData);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _onDropItem(event, dragData) {
 | 
			
		||||
    const callSuper = await this.actor.processDropItem(event, dragData, this.objetVersConteneur);
 | 
			
		||||
    if (callSuper) {
 | 
			
		||||
      await super._onDropItem(event, dragData)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -221,14 +230,11 @@ export class RdDActorSheet extends ActorSheet {
 | 
			
		||||
      const item = this.actor.items.get(li.data("item-id"));
 | 
			
		||||
      item.sheet.render(true);
 | 
			
		||||
    });
 | 
			
		||||
    // Update Inventory Item
 | 
			
		||||
    html.find('.rencontre-delete').click(ev => {
 | 
			
		||||
      const li = $(ev.currentTarget).parents(".item");
 | 
			
		||||
      const rencontreKey = li.data("item-id");
 | 
			
		||||
      this.actor.deleteTMRRencontre(rencontreKey);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Delete Inventory Item
 | 
			
		||||
    html.find('.item-delete').click(ev => {
 | 
			
		||||
      const li = $(ev.currentTarget).parents(".item");
 | 
			
		||||
      RdDUtility.confirmerSuppression(this, li);
 | 
			
		||||
@@ -623,11 +629,10 @@ export class RdDActorSheet extends ActorSheet {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async _onSplitItem(item, split) {
 | 
			
		||||
    const itemData = Misc.data(item);
 | 
			
		||||
    if (split >= 1 && split < itemData.data.quantite) {
 | 
			
		||||
    if (split >= 1 && split < Misc.data(item).data.quantite) {
 | 
			
		||||
      await item.diminuerQuantite(split);
 | 
			
		||||
      const itemData = duplicate( Misc.data(item));
 | 
			
		||||
      itemData.data.quantite = split;
 | 
			
		||||
      itemData.id = undefined;
 | 
			
		||||
      await this.actor.createEmbeddedDocuments('Item', [itemData])
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,8 @@ export class RdDActorVehiculeSheet extends ActorSheet {
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    RdDUtility.filterItemsPerTypeForSheet(formData);
 | 
			
		||||
    RdDUtility.buildArbreDeConteneur(this, formData);
 | 
			
		||||
    this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets);
 | 
			
		||||
    formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
 | 
			
		||||
 | 
			
		||||
    formData.options.isGM = game.user.isGM;
 | 
			
		||||
 | 
			
		||||
@@ -67,10 +68,10 @@ export class RdDActorVehiculeSheet extends ActorSheet {
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _onDrop(event) {
 | 
			
		||||
    let toSuper = await this.actor.processItemDropEvent(event, this.objetVersConteneur);
 | 
			
		||||
    if ( toSuper) {
 | 
			
		||||
      super._onDrop(event);
 | 
			
		||||
  async _onDropItem(event, dragData) {
 | 
			
		||||
    const callSuper = await this.actor.processDropItem(event, dragData, this.objetVersConteneur);
 | 
			
		||||
    if (callSuper) {
 | 
			
		||||
      await super._onDropItem(event, dragData)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										111
									
								
								module/actor.js
									
									
									
									
									
								
							
							
						
						
									
										111
									
								
								module/actor.js
									
									
									
									
									
								
							@@ -349,7 +349,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async verifierPotionsEnchantees() {
 | 
			
		||||
    let potionsEnchantees = this.filterItemsData(it => it.type == 'potion' && it.data.isEnchante);
 | 
			
		||||
    let potionsEnchantees = this.filterItemsData(it => it.type == 'potion' && it.data.magique);
 | 
			
		||||
    for (let potion of potionsEnchantees) {
 | 
			
		||||
      if (!potion.prpermanent) {
 | 
			
		||||
        console.log(potion);
 | 
			
		||||
@@ -920,28 +920,29 @@ export class RdDActor extends Actor {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  /** Supprime un item d'un conteneur, sur la base
 | 
			
		||||
   * de leurs ID */
 | 
			
		||||
  async enleverDeConteneur(itemId, conteneur) {
 | 
			
		||||
    if (conteneur?.isConteneur()) { // Si présent
 | 
			
		||||
  async enleverDeConteneur(item, conteneur, objetVersConteneur) {
 | 
			
		||||
    if (conteneur?.isConteneur()) {
 | 
			
		||||
      let data2use = duplicate(Misc.data(conteneur));
 | 
			
		||||
      //console.log("Suppression du conteneur1", conteneurId, itemId,  data2use.data.contenu);
 | 
			
		||||
      let contenu = data2use.data.contenu;
 | 
			
		||||
      let index = contenu.indexOf(itemId);
 | 
			
		||||
      let index = contenu.indexOf(item.id);
 | 
			
		||||
      while (index >= 0) { // Force cleanup, itemId is unique
 | 
			
		||||
        contenu.splice(index, 1);
 | 
			
		||||
        index = contenu.indexOf(itemId);
 | 
			
		||||
        index = contenu.indexOf(item.id);
 | 
			
		||||
      }
 | 
			
		||||
      await this.updateEmbeddedDocuments('Item', [data2use]);
 | 
			
		||||
      delete objetVersConteneur[item.id];
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  /** Ajoute un item dans un conteneur, sur la base
 | 
			
		||||
   * de leurs ID */
 | 
			
		||||
  async ajouterDansConteneur(itemId, conteneur) {
 | 
			
		||||
  async ajouterDansConteneur(item, conteneur, objetVersConteneur) {
 | 
			
		||||
    if (conteneur?.isConteneur()) {
 | 
			
		||||
      let data2use = duplicate(Misc.data(conteneur));
 | 
			
		||||
      data2use.data.contenu.push(itemId);
 | 
			
		||||
      data2use.data.contenu.push(item.id);
 | 
			
		||||
      await this.updateEmbeddedDocuments('Item', [data2use]);
 | 
			
		||||
      objetVersConteneur[item.id] = conteneur.id;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -959,54 +960,52 @@ export class RdDActor extends Actor {
 | 
			
		||||
      await this.updateEmbeddedDocuments('Item', conteneurFixedList);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async processItemDropEvent(event, objetVersConteneur) {
 | 
			
		||||
    let dragData = JSON.parse(event.dataTransfer.getData("text/plain"));
 | 
			
		||||
  async processDropItem(event, dragData, objetVersConteneur) {
 | 
			
		||||
    console.log("DRAG", this.id, dragData);
 | 
			
		||||
    let itemId = dragData.id || dragData.data._id;
 | 
			
		||||
    if (dragData.type == 'Item') {
 | 
			
		||||
    const droppedItemId = dragData.id || dragData.data._id;
 | 
			
		||||
    if (dragData.actorId && dragData.actorId != this.id) {
 | 
			
		||||
      console.log("Moving objects", dragData);
 | 
			
		||||
        this.moveItemsBetweenActors(itemId, dragData.actorId);
 | 
			
		||||
      this.moveItemsBetweenActors(droppedItemId, dragData.actorId);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
      if (dragData.actorId == this.id) {
 | 
			
		||||
        // rangement
 | 
			
		||||
        const destId = $(event.target).parents(".item").attr("data-item-id");
 | 
			
		||||
        const srcId = objetVersConteneur[itemId];
 | 
			
		||||
        if (srcId != destId && itemId != destId) { // déplacement de l'objet
 | 
			
		||||
          const item = this.getObjet(itemId);
 | 
			
		||||
          const dest = this.getObjet(destId);
 | 
			
		||||
          const src = this.getObjet(srcId);
 | 
			
		||||
          if (!dest) {
 | 
			
		||||
            // on peut toujours vider son sac
 | 
			
		||||
            await this.enleverDeConteneur(itemId, src);
 | 
			
		||||
          }
 | 
			
		||||
          else if (!dest.isConteneur()) {
 | 
			
		||||
            // regrouper?
 | 
			
		||||
            await this.regrouperEquipementsSimilaires(item, dest);
 | 
			
		||||
          }
 | 
			
		||||
          else if (this.conteneurPeutContenir(dest, item)) {
 | 
			
		||||
            // déplacer?
 | 
			
		||||
            await this.enleverDeConteneur(itemId, src);
 | 
			
		||||
            await this.ajouterDansConteneur(itemId, dest);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      this.computeEncombrementTotalEtMalusArmure();
 | 
			
		||||
    }
 | 
			
		||||
    if (dragData.type == "Actor") {
 | 
			
		||||
      this.addSubacteur(itemId);
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    let result = true;
 | 
			
		||||
    const destId = $(event.target).parents(".item").attr("data-item-id");
 | 
			
		||||
    const itemId = dragData.id || dragData.data._id;
 | 
			
		||||
    const item = this.getObjet(itemId);
 | 
			
		||||
    if (item.isEquipement()) {
 | 
			
		||||
      if (dragData.actorId == this.id) {
 | 
			
		||||
        // rangement
 | 
			
		||||
        const srcId = objetVersConteneur[itemId];
 | 
			
		||||
        if (srcId != destId && itemId != destId) { // déplacement de l'objet
 | 
			
		||||
          const dest = this.getObjet(destId);
 | 
			
		||||
          const src = this.getObjet(srcId);
 | 
			
		||||
          if (dest?.isConteneur()) {
 | 
			
		||||
            if (this.conteneurPeutContenir(dest, item)) {
 | 
			
		||||
              await this.enleverDeConteneur(item, src, objetVersConteneur);
 | 
			
		||||
              await this.ajouterDansConteneur(item, dest, objetVersConteneur);
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          else {
 | 
			
		||||
            if (src?.isConteneur() && !item?.isConteneur()) {
 | 
			
		||||
              await this.enleverDeConteneur(item, src, objetVersConteneur);
 | 
			
		||||
              // simuler la re-création
 | 
			
		||||
              dragData.actorId = null;
 | 
			
		||||
              await this.deleteEmbeddedDocuments('Item', [item.id]);
 | 
			
		||||
            }
 | 
			
		||||
            else if (dest?.isEquipementSimilaire(item)) {
 | 
			
		||||
              await this.regrouperEquipementsSimilaires(item, dest);
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      await this.computeEncombrementTotalEtMalusArmure();
 | 
			
		||||
    }
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  conteneurPeutContenir(dest, item) {
 | 
			
		||||
    const destData = Misc.data(dest);
 | 
			
		||||
    if (destData?.type != 'conteneur') {
 | 
			
		||||
      ui.notifications.warn(`Impossible de déplacer un objet (${item.name}) vers un ${destData.type} qui n'est pas un conteneur (${dest.name}) !`);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    if (this._isConteneurContenu(item, dest)) {
 | 
			
		||||
      ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${destData.name} !`);
 | 
			
		||||
      return false; // Loop detected !
 | 
			
		||||
@@ -1061,11 +1060,9 @@ export class RdDActor extends Actor {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async regrouperEquipementsSimilaires(item, dest) {
 | 
			
		||||
    if (item.isEquipementSimilaire(dest)) {
 | 
			
		||||
    await dest.quantiteIncDec(Misc.templateData(item).quantite);
 | 
			
		||||
    await this.deleteEmbeddedDocuments('Item', [item.id]);
 | 
			
		||||
  }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  detectSurEncombrement() {
 | 
			
		||||
@@ -1474,7 +1471,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async santeIncDec(name, inc, isCritique = false) {
 | 
			
		||||
  async santeIncDec(name, inc, options = {isCritique: false, ethylisme: false}) {
 | 
			
		||||
 | 
			
		||||
    const sante = duplicate(Misc.templateData(this).sante);
 | 
			
		||||
    let compteur = sante[name];
 | 
			
		||||
@@ -1491,7 +1488,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
    //console.log("New value ", inc, minValue, result.newValue);
 | 
			
		||||
    let fatigue = 0;
 | 
			
		||||
    if (name == "endurance" && !this.isEntiteCauchemar()) {
 | 
			
		||||
      if (result.newValue == 0 && inc < 0 && !isCritique) { // perte endurance et endurance devient 0 (sauf critique) -> -1 vie
 | 
			
		||||
      if (result.newValue == 0 && inc < 0 && !options.isCritique) { // perte endurance et endurance devient 0 (sauf critique) -> -1 vie
 | 
			
		||||
        sante.vie.value--;
 | 
			
		||||
      }
 | 
			
		||||
      result.newValue = Math.max(0, result.newValue);
 | 
			
		||||
@@ -1499,7 +1496,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
        result.newValue = Math.min(result.newValue, this._computeEnduranceMax())
 | 
			
		||||
      }
 | 
			
		||||
      const perte = compteur.value - result.newValue;
 | 
			
		||||
      if (perte > 1) {
 | 
			
		||||
      if (perte > 1 && !options.ethylisme) {
 | 
			
		||||
        // Peut-être sonné si 2 points d'endurance perdus d'un coup
 | 
			
		||||
        const testIsSonne = await this.testSiSonne(sante, result.newValue);
 | 
			
		||||
        result.sonne = testIsSonne.sonne;
 | 
			
		||||
@@ -1669,7 +1666,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
 | 
			
		||||
      let enduranceLost = new Roll("1d6").roll().total;
 | 
			
		||||
      rollDataView.enduranceLost = enduranceLost;
 | 
			
		||||
      await this.santeIncDec("endurance", -enduranceLost, false);
 | 
			
		||||
      await this.santeIncDec("endurance", -enduranceLost, {ethylisme:true});
 | 
			
		||||
      // Qui a bu boira (p 164)
 | 
			
		||||
      let rollVolonte = await RdDResolutionTable.roll(actorData.data.carac.volonte.value, Math.min(ethylisme.value, 0) + actorData.data.compteurs.moral.value);
 | 
			
		||||
      rollDataView.rollVolonteIsSuccess = rollVolonte.isSuccess;
 | 
			
		||||
@@ -2948,7 +2945,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
    const perteVie = this.isEntiteCauchemar()
 | 
			
		||||
      ? { newValue: 0 }
 | 
			
		||||
      : await this.santeIncDec("vie", - encaissement.vie);
 | 
			
		||||
    const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, (encaissement.critiques > 0));
 | 
			
		||||
    const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, {critiques: encaissement.critiques > 0});
 | 
			
		||||
 | 
			
		||||
    this.computeEtatGeneral();
 | 
			
		||||
    this.sheet.render(false);
 | 
			
		||||
@@ -3444,7 +3441,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
    potionData.alias = this.name;
 | 
			
		||||
    potionData.supprimer = true;
 | 
			
		||||
 | 
			
		||||
    if (potionData.data.isEnchante) {
 | 
			
		||||
    if (potionData.data.magique) {
 | 
			
		||||
      ChatMessage.create({
 | 
			
		||||
        whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
 | 
			
		||||
        content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-soin.html`, potionData)
 | 
			
		||||
@@ -3476,7 +3473,7 @@ export class RdDActor extends Actor {
 | 
			
		||||
    potionData.alias = this.name;
 | 
			
		||||
    potionData.supprimer = true;
 | 
			
		||||
 | 
			
		||||
    if (potionData.data.isEnchante) {
 | 
			
		||||
    if (potionData.data.magique) {
 | 
			
		||||
      ChatMessage.create({
 | 
			
		||||
        whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
 | 
			
		||||
        content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.html`, potionData)
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,8 @@ import { RdDAlchimie } from "./rdd-alchimie.js";
 | 
			
		||||
import { RdDItemCompetence } from "./item-competence.js";
 | 
			
		||||
import { RdDHerbes } from "./rdd-herbes.js";
 | 
			
		||||
import { Misc } from "./misc.js";
 | 
			
		||||
import { HtmlUtility } from "./html-utility.js";
 | 
			
		||||
import { ReglesOptionelles } from "./regles-optionelles.js";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Extend the basic ItemSheet with some very simple modifications
 | 
			
		||||
@@ -62,8 +64,7 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
      owner: this.document.isOwner,
 | 
			
		||||
      editable: this.isEditable,
 | 
			
		||||
      cssClass: this.isEditable ? "editable" : "locked",
 | 
			
		||||
      isSoins: false,
 | 
			
		||||
      isEnchante: false
 | 
			
		||||
      isSoins: false
 | 
			
		||||
    }
 | 
			
		||||
    if ( this.actor ) {
 | 
			
		||||
      formData.isOwned = true;
 | 
			
		||||
@@ -102,12 +103,14 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
	activateListeners(html) {
 | 
			
		||||
    super.activateListeners(html);
 | 
			
		||||
 | 
			
		||||
    HtmlUtility._showControlWhen($(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.object.isOwned);
 | 
			
		||||
 | 
			
		||||
    // Everything below here is only needed if the sheet is editable
 | 
			
		||||
    if (!this.options.editable) return;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Select competence categorie
 | 
			
		||||
    html.find(".categorie").on("click", this._onClickSelectCategorie.bind(this) );
 | 
			
		||||
    html.find(".categoriepotion").on("click", this.render(true) );
 | 
			
		||||
    html.find(".categorie").change(event => this._onSelectCategorie(event));
 | 
			
		||||
 | 
			
		||||
    html.find('.sheet-competence-xp').change((event) => {
 | 
			
		||||
      if ( this.object.data.type == 'competence') { 
 | 
			
		||||
@@ -153,13 +156,15 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _onClickSelectCategorie(event) {
 | 
			
		||||
  async _onSelectCategorie(event) {
 | 
			
		||||
    event.preventDefault();
 | 
			
		||||
 | 
			
		||||
    if (this.object.isCompetence()){
 | 
			
		||||
      let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value);
 | 
			
		||||
      Misc.templateData(this.object).base = level;
 | 
			
		||||
      $("#base").val(level);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  get template()
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,10 @@ export class RdDItem extends Item {
 | 
			
		||||
    return typesObjetsOeuvres;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isCompetence() {
 | 
			
		||||
    return Misc.data(this).type == 'competence';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isConteneur() {
 | 
			
		||||
    return Misc.data(this).type == 'conteneur';
 | 
			
		||||
  }
 | 
			
		||||
@@ -39,6 +43,9 @@ export class RdDItem extends Item {
 | 
			
		||||
    return itemData.type == 'objet' && Grammar.toLowerCaseNoAccent(itemData.name) == 'cristal alchimique' && itemData.data.quantite > 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isMagique(){
 | 
			
		||||
    return Misc.templateData(this.object).magique;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getEnc() {
 | 
			
		||||
    const itemData = Misc.data(this);
 | 
			
		||||
@@ -64,8 +71,8 @@ export class RdDItem extends Item {
 | 
			
		||||
  prepareDataPotion() {
 | 
			
		||||
    const tplData = Misc.templateData(this);
 | 
			
		||||
    const categorie = Grammar.toLowerCaseNoAccent(tplData.categorie);
 | 
			
		||||
    tplData.isEnchante = categorie.includes('enchante');
 | 
			
		||||
    if (tplData.isEnchante) {
 | 
			
		||||
    tplData.magique = categorie.includes('enchante');
 | 
			
		||||
    if (tplData.magique) {
 | 
			
		||||
      if (categorie.includes('soin') || categorie.includes('repos')) {
 | 
			
		||||
        tplData.puissance = tplData.herbebonus * tplData.pr;
 | 
			
		||||
      }
 | 
			
		||||
@@ -144,7 +151,7 @@ export class RdDItem extends Item {
 | 
			
		||||
    if (tplData.quantite == undefined) return false;
 | 
			
		||||
 | 
			
		||||
    for (const [key, value] of Object.entries(tplData)) {
 | 
			
		||||
      if (['quantite', 'encTotal', 'prixTotal'].includes(key)) continue;
 | 
			
		||||
      if (['quantite', 'encTotal', 'prixTotal', 'cout'].includes(key)) continue;
 | 
			
		||||
      if (value != otherTplData[key]) return false;
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -63,9 +63,9 @@ export class Misc {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static classify(items, classifier = it => it.type, transform = it => it) {
 | 
			
		||||
  static classify(items, classifier = it => it.type) {
 | 
			
		||||
    let itemsBy = {};
 | 
			
		||||
    Misc.classifyInto(itemsBy, items, classifier, transform);
 | 
			
		||||
    Misc.classifyInto(itemsBy, items, classifier);
 | 
			
		||||
    return itemsBy;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -80,7 +80,7 @@ export class Misc {
 | 
			
		||||
    return itemsBy;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static classifyInto(itemsBy, items, classifier = it => it.type, transform = it => it) {
 | 
			
		||||
  static classifyInto(itemsBy, items, classifier = it => it.type) {
 | 
			
		||||
    for (const item of items) {
 | 
			
		||||
      const classification = classifier(item);
 | 
			
		||||
      let list = itemsBy[classification];
 | 
			
		||||
@@ -88,11 +88,8 @@ export class Misc {
 | 
			
		||||
        list = [];
 | 
			
		||||
        itemsBy[classification] = list;
 | 
			
		||||
      }
 | 
			
		||||
      list.push(transform(item));
 | 
			
		||||
      list.push(item);
 | 
			
		||||
    }
 | 
			
		||||
    for (const [key, list] of Object.entries(itemsBy)) {
 | 
			
		||||
      list.sort();
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static rollOneOf(array) {
 | 
			
		||||
 
 | 
			
		||||
@@ -257,7 +257,7 @@ export class RdDUtility {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static filterItemsPerTypeForSheet(formData, itemsByType) {
 | 
			
		||||
  static filterItemsPerTypeForSheet(formData) {
 | 
			
		||||
    formData.materiel = this.checkNull(formData.itemsByType['objet']);
 | 
			
		||||
    formData.conteneurs = this.checkNull(formData.itemsByType['conteneur']);
 | 
			
		||||
    formData.armes = this.checkNull(formData.itemsByType['arme']);
 | 
			
		||||
@@ -296,30 +296,34 @@ export class RdDUtility {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static buildArbreDeConteneur(actorSheet, formData) {
 | 
			
		||||
    actorSheet.objetVersConteneur = {}; // Table de hash locale pour recupération rapide du conteneur parent (si existant)    
 | 
			
		||||
  static buildArbreDeConteneurs(conteneurs, objets) {
 | 
			
		||||
    let objetVersConteneur = {};
 | 
			
		||||
    // Attribution des objets aux conteneurs
 | 
			
		||||
    for (let conteneur of formData.conteneurs) {
 | 
			
		||||
    for (let conteneur of conteneurs) {
 | 
			
		||||
      conteneur.subItems = [];
 | 
			
		||||
      if (!conteneur.data.encTotal) conteneur.data.encTotal = 0;
 | 
			
		||||
      if (!conteneur.data.encTotal)
 | 
			
		||||
        conteneur.data.encTotal = 0;
 | 
			
		||||
      //conteneur.data.encTotal = ; Deja calculé
 | 
			
		||||
      if (conteneur.data.contenu) {
 | 
			
		||||
        for (let id of conteneur.data.contenu) {
 | 
			
		||||
          let objet = formData.objets.find(objet => (id == objet._id));
 | 
			
		||||
          let objet = objets.find(objet => (id == objet._id));
 | 
			
		||||
          if (objet) {
 | 
			
		||||
            if (!objet.data.encombrement) objet.data.encombrement = 0; // Auto-fix
 | 
			
		||||
            if (!objet.data.encombrement)
 | 
			
		||||
              objet.data.encombrement = 0; // Auto-fix
 | 
			
		||||
            objet.estContenu = true; // Permet de filtrer ce qifui est porté dans le template
 | 
			
		||||
            actorSheet.objetVersConteneur[id] = conteneur._id;
 | 
			
		||||
            objetVersConteneur[id] = conteneur._id;
 | 
			
		||||
            conteneur.data.encTotal += Number(objet.data.encombrement) * Number(((objet.data.quantite) ? objet.data.quantite : 1));
 | 
			
		||||
            conteneur.subItems.push(objet);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return objetVersConteneur;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  // Construit la liste des conteneurs de niveau 1 (c'est à dire non contenu eux-même dans un conteneur)
 | 
			
		||||
    let newConteneurs = formData.conteneurs.filter(function (conteneur, index, arr) { return !conteneur.estContenu });
 | 
			
		||||
    formData.conteneurs = newConteneurs;
 | 
			
		||||
    //console.log(newConteneurs);
 | 
			
		||||
  static conteneursRacine(conteneurs) {
 | 
			
		||||
    return conteneurs.filter( (conteneur, index, arr) => !conteneur.estContenu);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,8 @@ const listeReglesOptionelles = [
 | 
			
		||||
  { name: 'defenseurDesarme', group: 'combat', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" },
 | 
			
		||||
  { name: 'categorieParade', group: 'combat', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" },
 | 
			
		||||
  { name: 'tripleSignificative', group: 'combat', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" },
 | 
			
		||||
  {name:'astrologie', group:'generale', descr:"Appliquer les ajustements astrologiques aux jets de chance et aux rituels"}
 | 
			
		||||
  { name: 'astrologie', group: 'generale', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels", default: true },
 | 
			
		||||
  { name: 'afficher-prix-joueurs', group: 'generale', descr: "Afficher le prix de l'équipement des joueurs", default: true }
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
export class ReglesOptionelles extends FormApplication {
 | 
			
		||||
@@ -14,7 +15,7 @@ export class ReglesOptionelles extends FormApplication {
 | 
			
		||||
    for (const regle of listeReglesOptionelles) {
 | 
			
		||||
      const name = regle.name;
 | 
			
		||||
      const id = ReglesOptionelles._getIdRegle(name);
 | 
			
		||||
      game.settings.register("foundryvtt-reve-de-dragon", id, { name: id, scope: "world", config: false, default: regle.default??true, type: Boolean });
 | 
			
		||||
      game.settings.register("foundryvtt-reve-de-dragon", id, { name: id, scope: "world", config: false, default: regle.default == undefined ? true : regle.default, type: Boolean });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    game.settings.registerMenu("foundryvtt-reve-de-dragon", "rdd-options-regles", {
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
<div data-combatid="{{combatId}}" data-combatmessage="actor-turn-summary">{{blessuresStatus}}</div>
 | 
			
		||||
<div>Son état général est de : {{etatGeneral}} {{#if isSonne}} et est <strong>sonné</strong>{{/if}}</div>
 | 
			
		||||
{{#if isGrave}}
 | 
			
		||||
<div>{{alias}} souffre de Blessure(s) Grave(s) : n'oubliez pas de faire un Je de Vie toutes les SC ({{SConst}}) minutes.</div>
 | 
			
		||||
<div>{{alias}} souffre de Blessure(s) Grave(s) : n'oubliez pas de faire un Jet de Vie toutes les SC ({{SConst}}) minutes, et de retirer 1 point d'endurance par blessure grave.</div>
 | 
			
		||||
{{/if}}
 | 
			
		||||
{{#if isCritique}}
 | 
			
		||||
<div>{{alias}} souffre d'une <strong>Blessure Critique</strong> : faites un <a id="chat-jet-vie" data-actorId="{{actorId}}">Jet de Vie.<a></div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" />
 | 
			
		||||
<h4>
 | 
			
		||||
  {{alias}} consomme sa <b>Potion {{#if data.isEnchante}}enchantée{{/if}}</b> de {{name}}.
 | 
			
		||||
  {{alias}} consomme sa <b>Potion {{#if data.magique}}enchantée{{/if}}</b> de {{name}}.
 | 
			
		||||
</h4>
 | 
			
		||||
<hr>
 | 
			
		||||
<div>
 | 
			
		||||
  Les effets de la potions sont à gérer manuellement, en fonction de sa nature{{#if data.isEnchante}} et de son enchantement ({{data.pr}} Points de Rêve){{/if}}.
 | 
			
		||||
  Les effets de la potions sont à gérer manuellement, en fonction de sa nature{{#if data.magique}} et de son enchantement ({{data.pr}} Points de Rêve){{/if}}.
 | 
			
		||||
  <br>La potion a été supprimée de l'équipement.
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" />
 | 
			
		||||
<h4>
 | 
			
		||||
  {{alias}} consomme sa <b>Potion de Repos {{#if data.isEnchante}}enchantée{{/if}}</b> de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins).
 | 
			
		||||
  {{alias}} consomme sa <b>Potion de Repos {{#if data.magique}}enchantée{{/if}}</b> de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins).
 | 
			
		||||
</h4>
 | 
			
		||||
<hr>
 | 
			
		||||
<div>
 | 
			
		||||
  {{#if data.isEnchante}}
 | 
			
		||||
  {{#if data.magique}}
 | 
			
		||||
  Elle permet de récupérer jusqu'à {{data.puissance}} cases de repos.
 | 
			
		||||
  {{else}}
 | 
			
		||||
  Une fois consommée vers fin Lyre, elle vous octroie un bonus de {{data.herbebonus}} segments de fatigue récupérés en plus à la fin de Chateau Dormant (à gérer manuellement).
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de soin" />
 | 
			
		||||
<h4>
 | 
			
		||||
  {{alias}} consomme sa <b>Potion de soins {{#if data.isEnchante}}enchantée{{/if}}</b> de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins).
 | 
			
		||||
  {{alias}} consomme sa <b>Potion de soins {{#if data.magique}}enchantée{{/if}}</b> de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins).
 | 
			
		||||
</h4>
 | 
			
		||||
<hr>
 | 
			
		||||
<div>
 | 
			
		||||
  {{#if data.isEnchante}}
 | 
			
		||||
  {{#if data.magique}}
 | 
			
		||||
  Elle permet de guérir {{data.puissance}} Points de Guérison.
 | 
			
		||||
  {{else}}
 | 
			
		||||
  Lors de votre prochain jet de récupération à Chateau Dormant, vous bénéficierez d'un bonus de {{data.herbebonus}} (appliqué automatiquement).
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    {{!-- Sheet Body --}}
 | 
			
		||||
    <section class="sheet-body">
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label>Compétence associée</label>
 | 
			
		||||
        <label for="data.competence">Compétence associée</label>
 | 
			
		||||
        <select name="data.competence" id="competence" data-dtype="String">
 | 
			
		||||
          {{#select data.competence}}
 | 
			
		||||
          {{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html"}}
 | 
			
		||||
@@ -17,15 +17,15 @@
 | 
			
		||||
        </select>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="niveau">Dommmages </label>
 | 
			
		||||
        <label for="data.dommages">Dommages </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.dommages" value="{{data.dommages}}" data-dtype="String"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">Résistance </label>
 | 
			
		||||
        <label for="data.resistance">Résistance </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.resistance" value="{{data.resistance}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label>Catégorie parade </label>
 | 
			
		||||
        <label for="data.categorie_parade">Catégorie parade </label>
 | 
			
		||||
        <select name="data.categorie_parade" id="categorie_parade" data-dtype="String">
 | 
			
		||||
          {{#select data.categorie_parade}}
 | 
			
		||||
          {{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-parade.html"}}
 | 
			
		||||
@@ -33,59 +33,59 @@
 | 
			
		||||
        </select>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">Encombrement </label>
 | 
			
		||||
        <label for="data.encombrement">Encombrement </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.encombrement" value="{{data.encombrement}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">Force min. </label>
 | 
			
		||||
        <label for="data.force">Force min. </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.force" value="{{data.force}}" data-dtype="String"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">Arme rapide ? </label>
 | 
			
		||||
        <label for="data.rapide">Arme rapide ? </label>
 | 
			
		||||
        <input class="attribute-value" type="checkbox" name="data.rapide"  {{#if data.rapide}}checked{{/if}}/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">A Une main ? </label>
 | 
			
		||||
        <label for="data.unemain">A Une main ? </label>
 | 
			
		||||
        <input class="attribute-value" type="checkbox" name="data.unemain"  {{#if data.unemain}}checked{{/if}}/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">A Deux mains ? </label>
 | 
			
		||||
        <label for="data.deuxmains">A Deux mains ? </label>
 | 
			
		||||
        <input class="attribute-value" type="checkbox" name="data.deuxmains"  {{#if data.deuxmains}}checked{{/if}}/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">Portée courte </label>
 | 
			
		||||
        <label for="data.portee_courte">Portée courte </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.portee_courte" value="{{data.portee_courte}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">Portée moyenne </label>
 | 
			
		||||
        <label for="data.portee_moyenne">Portée moyenne </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.portee_moyenne" value="{{data.portee_moyenne}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">Portée extrême </label>
 | 
			
		||||
        <label for="data.portee_extreme">Portée extrême </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.portee_extreme" value="{{data.portee_extreme}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="penetration">Pénétration </label>
 | 
			
		||||
        <label for="data.penetration">Pénétration </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.penetration" value="{{data.penetration}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">Prix (sols) </label>
 | 
			
		||||
      <div class="form-group item-cout">
 | 
			
		||||
        <label for="data.cout">Prix (sols) </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="xp">Magique ? </label>
 | 
			
		||||
        <label for="data.magique">Magique ? </label>
 | 
			
		||||
        <input class="attribute-value" type="checkbox" name="data.magique"  {{#if data.magique}}checked{{/if}}/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="penetration">Résistance magique </label>
 | 
			
		||||
      <div class="form-group item-magique">
 | 
			
		||||
        <label for="data.resistance_magique">Résistance magique </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.resistance_magique" value="{{data.resistance_magique}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="penetration">Nombre d'Ecailles d'Efficacité </label>
 | 
			
		||||
      <div class="form-group item-magique">
 | 
			
		||||
        <label for="data.ecaille_efficacite">Nombre d'Ecailles d'Efficacité </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.ecaille_efficacite" value="{{data.ecaille_efficacite}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
        <label for="penetration">Classe d'initiative au premier round (mêlée seulement) </label>
 | 
			
		||||
        <label for="data.initpremierround">Classe d'initiative au premier round (mêlée seulement) </label>
 | 
			
		||||
        <select name="data.initpremierround" id="initpremierround" data-dtype="String">
 | 
			
		||||
          {{#select data.initpremierround}}
 | 
			
		||||
          {{>"systems/foundryvtt-reve-de-dragon/templates/enum-initpremierround.html"}}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
        <label for="xp">Malus Armure </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.malus" value="{{data.malus}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
      <div class="form-group item-cout">
 | 
			
		||||
        <label for="xp">Prix (sols) </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
        <label for="xp">Qualité</label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
      <div class="form-group item-cout">
 | 
			
		||||
        <label for="xp">Prix (sols) </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@
 | 
			
		||||
        <label>Quantité (Pépins ou Brins)</label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
      <div class="form-group item-cout">
 | 
			
		||||
        <label>Prix (sols)</label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
 | 
			
		||||
      </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
        <label>Encombrement</label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.encombrement" value="{{data.encombrement}}" data-dtype="Number" />
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
      <div class="form-group item-cout">
 | 
			
		||||
        <label>Prix (sols)</label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
 | 
			
		||||
      </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,7 @@
 | 
			
		||||
        <label>Quantité </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
      <div class="form-group item-cout">
 | 
			
		||||
        <label for="xp">Prix (sols) </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
        <label for="xp">Qualité</label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
      <div class="form-group item-cout">
 | 
			
		||||
        <label for="xp">Prix (sols) </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@
 | 
			
		||||
      <label>Quantité </label>
 | 
			
		||||
      <input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
    <div class="form-group item-cout">
 | 
			
		||||
      <label>Prix (sols) </label>
 | 
			
		||||
      <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
 | 
			
		||||
    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
        <label for="xp">Qualité</label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.qualite" value="{{data.qualite}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="form-group">
 | 
			
		||||
      <div class="form-group item-cout">
 | 
			
		||||
        <label for="xp">Prix (sols) </label>
 | 
			
		||||
        <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number"/>
 | 
			
		||||
      </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
      <label>Quantité </label>
 | 
			
		||||
      <input class="attribute-value" type="text" name="data.quantite" value="{{data.quantite}}" data-dtype="Number" />
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
    <div class="form-group item-cout">
 | 
			
		||||
      <label>Prix (sols)</label>
 | 
			
		||||
      <input class="attribute-value" type="text" name="data.cout" value="{{data.cout}}" data-dtype="Number" />
 | 
			
		||||
    </div>
 | 
			
		||||
@@ -77,7 +77,7 @@
 | 
			
		||||
      <input class="attribute-value" type="checkbox" name="data.reposalchimique"  {{#if data.reposalchimique}}checked{{/if}}/>
 | 
			
		||||
    </div>
 | 
			
		||||
    {{/if}}
 | 
			
		||||
    {{#if data.isEnchante}}
 | 
			
		||||
    {{#if data.magique}}
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
      <label>Points de rêve</label>
 | 
			
		||||
      <input class="attribute-value" type="text" name="data.pr" value="{{data.pr}}" data-dtype="Number" />
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user