Compare commits
	
		
			43 Commits
		
	
	
		
			foundryvtt
			...
			16e40b0ed8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 16e40b0ed8 | |||
| 427a950954 | |||
| a7b20bdd35 | |||
| 3b18e0b919 | |||
| ff8a5d7ba3 | |||
| 3aa8c0f0af | |||
| 8d9f09c18c | |||
| 9d654246c2 | |||
| 111fac2b2d | |||
| 3e99265125 | |||
| 28878b74fc | |||
| ba8276ef37 | |||
| b9e8c24461 | |||
| 8754ea9f5f | |||
| f56ddb4a1b | |||
| e80dbc7332 | |||
| 4c82d85e6a | |||
| 538058ecc6 | |||
| 70e42ea631 | |||
| 15525ef8cc | |||
| 5a4ef6da7e | |||
| ab698b2124 | |||
| 4cc6e86d79 | |||
| 8f3d56a830 | |||
| 8561e3f8bc | |||
| f207cb7325 | |||
| b9e911a588 | |||
| 92e9be8b02 | |||
| 50a86e751d | |||
| 1725d4c17b | |||
| 3e33053ed4 | |||
| baa3729568 | |||
| 99f29cb95b | |||
| 7d19860f5f | |||
| 40987149cc | |||
| 49d7c4f71d | |||
| 23582984cf | |||
| 638459049d | |||
| 366ca981ca | |||
| c0e54c2369 | |||
| f95f5b2b81 | |||
| d30226cb33 | |||
| 5cf7dda76c | 
							
								
								
									
										80
									
								
								changelog.md
									
									
									
									
									
								
							
							
						
						
									
										80
									
								
								changelog.md
									
									
									
									
									
								
							@@ -1,16 +1,72 @@
 | 
			
		||||
# 12.0
 | 
			
		||||
## 12.0.8 - La quincaillerie d'Astrobazzarh
 | 
			
		||||
- le propriétaire est indiqué dans les feuilles d'équipements/compétences/...
 | 
			
		||||
- Ecaille d'efficacité
 | 
			
		||||
  - l'écaille d'efficacité est prise en compte même si on n'utilise pas le ciblage en combat
 | 
			
		||||
  - l'écaille d'efficacité est prise en compte pour l'initiative
 | 
			
		||||
- Corrections
 | 
			
		||||
  - l'état général est pris en compte pour les initiatives
 | 
			
		||||
  - le tooltip de l'initiative affiche correctement l'initiative
 | 
			
		||||
 | 
			
		||||
## 12.0.7 - La propriété d'Astrobazzarh
 | 
			
		||||
- correction des opérations faites à la création d'un Item:
 | 
			
		||||
  - la durée des queues/rencontres/souffles
 | 
			
		||||
  - les effets draconiques d'un souffle/queue
 | 
			
		||||
  - mise à jour des points de tâche des blessures lors des soins
 | 
			
		||||
- pas d'expérience sur les particulières quand aucun MJ n'est connecté
 | 
			
		||||
- Le drag&drop d'un acteur depuis la liste des acteurs sur la fiche
 | 
			
		||||
  d'une entité incarnée permet d'accorder le personnage
 | 
			
		||||
- Les messages pour résister aux possessions/conjuration sont envoyées
 | 
			
		||||
  au défenseur
 | 
			
		||||
- Les messages pour résister aux empoignades sont envoyées au défenseur
 | 
			
		||||
- la commande /voyage affiche maintenant le total de fatigue pour chaque voyageur
 | 
			
		||||
- la commande /voyage affiche maintenant les compétences liées au terrain
 | 
			
		||||
 | 
			
		||||
## 12.0.6 - Le bazar d'Astrobazzarh
 | 
			
		||||
- Corrections de l'inventaire en bazar:
 | 
			
		||||
  - un problème pouvait survenir en déplaçant les objets 
 | 
			
		||||
    l'inventaire, qui fait qu'un conteneur se retrouve récursivement dans son
 | 
			
		||||
    propre contenu, ce qui empêche d'ouvrir la feuille d'acteur.
 | 
			
		||||
  - un objet non-conteneur pouvait dans certains cas avoir un pseudo contenu
 | 
			
		||||
  - un objet pouvait être considéré comme contenu, sans être présent dans un
 | 
			
		||||
    conteneur (et donc non affiché)
 | 
			
		||||
  - vider les conteneurs supprime correctement toutes les informations liées
 | 
			
		||||
    aux conteneurs/contenus
 | 
			
		||||
- Les messages pour les tirages dans le compendium utilisent le "roll mode" 
 | 
			
		||||
  courant pour leur visibilité
 | 
			
		||||
- Fix: restaurer la compatibilité Foundry 11
 | 
			
		||||
 | 
			
		||||
## 12.0.5 - Les mauvais jours d'Astrobazzarh
 | 
			
		||||
- Fix: on peut de nouveau ouvrir l'édition de calendrier
 | 
			
		||||
- Fix: on ne peut plus ouvrir plusieurs fenêtres de lancer de sort
 | 
			
		||||
- Fix: Failed to execute 'getComputedStyle' on 'Window'
 | 
			
		||||
 | 
			
		||||
## 12.0.4 - La plaie d'Astrobazzarh
 | 
			
		||||
- **Support V12**
 | 
			
		||||
  - Fix: les boutons d'encaissement dans le tchat fonctionnent de nouveau
 | 
			
		||||
  - Fix warnings sur "Die" et AudioHelper
 | 
			
		||||
 | 
			
		||||
## 12.0.3 - L'hémorragie d'Astrobazzarh
 | 
			
		||||
- **Support V12**
 | 
			
		||||
  - On peut de nouveau ouvrir un acteur blessé après redémarrage du monde
 | 
			
		||||
  - On peut de nouveau ouvrir les Items avec une rareté par environnement
 | 
			
		||||
  - Le choix de ne plus afficher les demandes de suppression est bien pris en compte
 | 
			
		||||
 | 
			
		||||
## 12.0.2 - Les pluies d'Astrobazzarh
 | 
			
		||||
- **Support V12**
 | 
			
		||||
  - correction des actions techniques déleguées au MJ qui bloquaient les fenêtre de lancer de dés des joueurs (et plein d'autres)
 | 
			
		||||
  - la fenêtre de calendrier s'ouvre correctement
 | 
			
		||||
  - les dés draconiques peuvent de nouveau faire plus que 0
 | 
			
		||||
  - adaptation de la fenêtre de recherche
 | 
			
		||||
  - correction des comparaisons de version pour les migrations automatiques
 | 
			
		||||
  - correction des roll.eveluate: l'option async est maintenant standard
 | 
			
		||||
  - correction des templates liés aux selections
 | 
			
		||||
  - correction de l'ajustement de luminosité de la scène selon l'heure
 | 
			
		||||
  - correction des images d'effets sur les tokens
 | 
			
		||||
  - correction de la vente par le tchat: seul le premier acheteur pouvait acheter
 | 
			
		||||
  - correction d'erreurs intempestives 'User ... lacks permission to update ...'
 | 
			
		||||
 | 
			
		||||
# 11.2
 | 
			
		||||
## 11.2.22 - Le futur d'Akarlikarlikar
 | 
			
		||||
- correction de la vente par le tchat: seul le premier acheteur pouvait acheter
 | 
			
		||||
- correction d'erreurs intempestives 'User ... lacks permission to update ...'
 | 
			
		||||
 | 
			
		||||
### Support V12
 | 
			
		||||
- adaptation fenêtre de recherche
 | 
			
		||||
- correction des comparaisons de version pour les migrations automatiques
 | 
			
		||||
- correction des roll.eveluate: l'option async est maintenant standard
 | 
			
		||||
- correction des templates liés aux selections
 | 
			
		||||
- correction de l'ajustement de luminosité de la scène selon l'heure
 | 
			
		||||
- correction des images d'effets sur les tokens
 | 
			
		||||
 | 
			
		||||
## 11.2.21 - Le questionnement d'Akarlikarlikar
 | 
			
		||||
- Une confirmation spécifique est demandée pour monter dans les terres médianes en cas de rencontre en attente
 | 
			
		||||
- L'expérience en caractéristique sur les jets de chance et rêve actuels est mise dans la caractéristique correspondante
 | 
			
		||||
 
 | 
			
		||||
@@ -1146,8 +1146,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
      diffNbDoses: -Number(this.system.compteurs.ethylisme.nb_doses || 0),
 | 
			
		||||
      finalLevel: 0,
 | 
			
		||||
      diffConditions: 0,
 | 
			
		||||
      ajustementsForce: CONFIG.RDD.difficultesLibres,
 | 
			
		||||
      config: game.system.rdd.config
 | 
			
		||||
      ajustementsForce: CONFIG.RDD.difficultesLibres
 | 
			
		||||
    }
 | 
			
		||||
    let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-ethylisme.html', rollData);
 | 
			
		||||
    new RdDRollDialogEthylisme(html, rollData, this, r => this.saouler(r.forceAlcool)).render(true);
 | 
			
		||||
@@ -1549,6 +1548,9 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async appliquerAjoutExperience(rollData, hideChatMessage = 'show') {
 | 
			
		||||
    if (!Misc.firstConnectedGM()){
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
    hideChatMessage = hideChatMessage == 'hide' || (Misc.isRollModeHiddenToPlayer() && !game.user.isGM)
 | 
			
		||||
    let xpData = await this._appliquerExperience(rollData.rolled, rollData.selectedCarac.label, rollData.competence, rollData.jetResistance);
 | 
			
		||||
    if (xpData.length) {
 | 
			
		||||
 
 | 
			
		||||
@@ -318,10 +318,10 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async rollCompetence(idOrName, options = { tryTarget: true }) {
 | 
			
		||||
  async rollCompetence(idOrName, options = { tryTarget: true, arme: undefined }) {
 | 
			
		||||
    RdDEmpoignade.checkEmpoignadeEnCours(this)
 | 
			
		||||
    const competence = this.getCompetence(idOrName);
 | 
			
		||||
    let rollData = { carac: this.system.carac, competence: competence }
 | 
			
		||||
    let rollData = { carac: this.system.carac, competence: competence, arme: options.arme }
 | 
			
		||||
    if (competence.type == TYPES.competencecreature) {
 | 
			
		||||
      const arme = RdDItemCompetenceCreature.armeCreature(competence)
 | 
			
		||||
      if (arme && options.tryTarget && Targets.hasTargets()) {
 | 
			
		||||
@@ -361,7 +361,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
			
		||||
   * @returns 
 | 
			
		||||
   */
 | 
			
		||||
  rollArme(arme, categorieArme = "competence") {
 | 
			
		||||
    let compToUse = this.$getCompetenceArme(arme, categorieArme)
 | 
			
		||||
    const compToUse = this.$getCompetenceArme(arme, categorieArme)
 | 
			
		||||
    if (!RdDItemArme.isArmeUtilisable(arme)) {
 | 
			
		||||
      ui.notifications.warn(`Arme inutilisable: ${arme.name} a une résistance de 0 ou moins`)
 | 
			
		||||
      return
 | 
			
		||||
@@ -375,7 +375,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
			
		||||
        title: 'Ne pas utiliser les automatisation de combat',
 | 
			
		||||
        buttonLabel: "Pas d'automatisation",
 | 
			
		||||
        onAction: async () => {
 | 
			
		||||
          this.rollCompetence(compToUse, { tryTarget: false })
 | 
			
		||||
          this.rollCompetence(compToUse, { tryTarget: false, arme: arme })
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
      return
 | 
			
		||||
@@ -508,8 +508,8 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
			
		||||
 | 
			
		||||
  isEntiteAccordee(attacker) { return true }
 | 
			
		||||
 | 
			
		||||
  async setEntiteReveAccordee(attacker) {
 | 
			
		||||
    ui.notifications.error("Impossible de s'accorder à " + this.name + ": ce n'est pas une entite de cauchemer/rêve");
 | 
			
		||||
  async setEntiteReveAccordee(actor) {
 | 
			
		||||
    ui.notifications.error("Impossible de s'accorder à " + this.name + ": ce n'est pas une entité incarnée");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -38,8 +38,7 @@ export class RdDBaseActorSheet extends ActorSheet {
 | 
			
		||||
      description: await TextEditor.enrichHTML(this.actor.system.description, { async: true }),
 | 
			
		||||
      notesmj: await TextEditor.enrichHTML(this.actor.system.notesmj, { async: true }),
 | 
			
		||||
      options: RdDSheetUtility.mergeDocumentRights(this.options, this.actor, this.isEditable),
 | 
			
		||||
      effects: this.actor.effects,
 | 
			
		||||
      config: game.system.rdd.config
 | 
			
		||||
      effects: this.actor.effects
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
 | 
			
		||||
 
 | 
			
		||||
@@ -121,6 +121,7 @@ export class RdDBaseActor extends Actor {
 | 
			
		||||
        return new ActorConstructor(docData, context);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    context.rdd = undefined
 | 
			
		||||
    super(docData, context);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -231,11 +232,13 @@ export class RdDBaseActor extends Actor {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async cleanupConteneurs() {
 | 
			
		||||
    let updates = this.itemTypes['conteneur']
 | 
			
		||||
      .filter(c => c.system.contenu.filter(id => this.getItem(id) == undefined).length > 0)
 | 
			
		||||
      .map(c => { return { _id: c._id, 'system.contenu': c.system.contenu.filter(id => this.getItem(id) != undefined) } });
 | 
			
		||||
    if (updates.length > 0) {
 | 
			
		||||
      await this.updateEmbeddedDocuments("Item", updates)
 | 
			
		||||
    if (Misc.isOwnerPlayerOrUniqueConnectedGM(this)) {
 | 
			
		||||
      let updates = this.itemTypes['conteneur']
 | 
			
		||||
        .filter(c => c.system.contenu.filter(id => this.getItem(id) == undefined).length > 0)
 | 
			
		||||
        .map(c => { return { _id: c._id, 'system.contenu': c.system.contenu.filter(id => this.getItem(id) != undefined) } });
 | 
			
		||||
      if (updates.length > 0) {
 | 
			
		||||
        await this.updateEmbeddedDocuments("Item", updates)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -554,15 +557,15 @@ export class RdDBaseActor extends Actor {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  /** Ajoute un item dans un conteneur, sur la base de leurs ID */
 | 
			
		||||
  async ajouterDansConteneur(item, conteneur, onAjouterDansConteneur) {
 | 
			
		||||
    if (!conteneur) {
 | 
			
		||||
      // TODO: afficher
 | 
			
		||||
      item.estContenu = false;
 | 
			
		||||
    }
 | 
			
		||||
    else if (conteneur.isConteneur()) {
 | 
			
		||||
    if (conteneur?.isConteneur()) {
 | 
			
		||||
      item.estContenu = true;
 | 
			
		||||
      const nouveauContenu = [...conteneur.system.contenu, item.id];
 | 
			
		||||
      await conteneur.update({ 'system.contenu': nouveauContenu });
 | 
			
		||||
      onAjouterDansConteneur(item.id, conteneur.id);
 | 
			
		||||
      onAjouterDansConteneur(item.id, conteneur.id)
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      item.estContenu = false;
 | 
			
		||||
      await conteneur?.update({ 'system.-=contenu': undefined })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -580,8 +583,13 @@ export class RdDBaseActor extends Actor {
 | 
			
		||||
          if (item.estContenu) {
 | 
			
		||||
            item.estContenu = undefined;
 | 
			
		||||
          }
 | 
			
		||||
          if (item.type == 'conteneur' && item.system.contenu.length > 0) {
 | 
			
		||||
            corrections.push({ _id: item.id, 'system.contenu': [] });
 | 
			
		||||
          if (item.system.contenu != undefined) {
 | 
			
		||||
            if (item.type == 'conteneur') {
 | 
			
		||||
              corrections.push({ _id: item.id, 'system.contenu': [] });
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
              corrections.push({ _id: item.id, 'system.-=contenu': undefined });
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if (corrections.length > 0) {
 | 
			
		||||
@@ -616,15 +624,21 @@ export class RdDBaseActor extends Actor {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  /** Supprime un item d'un conteneur, sur la base
 | 
			
		||||
   * de leurs ID */
 | 
			
		||||
  /**
 | 
			
		||||
   * Supprime un item d'un conteneur, sur la base de leurs ID
 | 
			
		||||
   */
 | 
			
		||||
  async enleverDeConteneur(item, conteneur, onEnleverDeConteneur) {
 | 
			
		||||
    if (conteneur?.isConteneur()) {
 | 
			
		||||
      item.estContenu = false;
 | 
			
		||||
      const contenu = conteneur.system.contenu.filter(id => id != item.id);
 | 
			
		||||
      await conteneur.update({ 'system.contenu': contenu });
 | 
			
		||||
      onEnleverDeConteneur();
 | 
			
		||||
    if (conteneur) {
 | 
			
		||||
      if (conteneur.isConteneur()) {
 | 
			
		||||
        const contenu = conteneur.system.contenu.filter(id => id != item.id);
 | 
			
		||||
        await conteneur.update({ 'system.contenu': contenu });
 | 
			
		||||
        onEnleverDeConteneur();
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        await conteneur.update({ 'system.-=contenu': undefined })
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    item.estContenu = false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
 
 | 
			
		||||
@@ -33,27 +33,4 @@ export class RdDCreature extends RdDBaseActorSang {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isEntiteAccordee(attacker) {
 | 
			
		||||
    if (this.isEntite([ENTITE_INCARNE])) {
 | 
			
		||||
      let resonnance = this.system.sante.resonnance
 | 
			
		||||
      return (resonnance.actors.find(it => it == attacker.id))
 | 
			
		||||
    }
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async setEntiteReveAccordee(attacker) {
 | 
			
		||||
    if (this.isEntite([ENTITE_INCARNE])) {
 | 
			
		||||
      let resonnance = foundry.utils.duplicate(this.system.sante.resonnance);
 | 
			
		||||
      if (resonnance.actors.find(it => it == attacker.id)) {
 | 
			
		||||
        // déjà accordé
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      await this.update({ "system.sante.resonnance": [...resonnance, attacker.id] });
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      super.setEntiteReveAccordee(attacker)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -54,6 +54,12 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async _onDropActor(event, dragData) {
 | 
			
		||||
    const dropActor = fromUuidSync(dragData.uuid)
 | 
			
		||||
    await this.actor.setEntiteReveAccordee(dropActor)
 | 
			
		||||
    super._onDropActor(event, dragData)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async deleteSubActeur(actorId) {
 | 
			
		||||
    let newResonances = this.actor.system.sante.resonnance.actors.filter(id => id != actorId);
 | 
			
		||||
    await this.actor.update({ 'system.sante.resonnance.actors': newResonances }, { renderSheet: false });
 | 
			
		||||
 
 | 
			
		||||
@@ -67,7 +67,7 @@ export class RdDEntite extends RdDBaseActorReve {
 | 
			
		||||
    if (this.isNonIncarnee()) {
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
    await RdDEncaisser.encaisser(this) 
 | 
			
		||||
    await RdDEncaisser.encaisser(this)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isEffectAllowed(effectId) {
 | 
			
		||||
@@ -91,20 +91,16 @@ export class RdDEntite extends RdDBaseActorReve {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async setEntiteReveAccordee(attacker) {
 | 
			
		||||
  async setEntiteReveAccordee(actor) {
 | 
			
		||||
    if (this.isEntite([ENTITE_INCARNE])) {
 | 
			
		||||
      let resonnance = foundry.utils.duplicate(this.system.sante.resonnance);
 | 
			
		||||
      if (resonnance.actors.find(it => it == attacker.id)) {
 | 
			
		||||
      if (this.system.sante.resonnance.actors.find(it => it == actor.id)) {
 | 
			
		||||
        // déjà accordé
 | 
			
		||||
        return;
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      resonnance.actors.push(attacker.id);
 | 
			
		||||
      await this.update({ "system.sante.resonnance": resonnance });
 | 
			
		||||
      await this.update({ "system.sante.resonnance.actors": [...this.system.sante.resonnance.actors, actor.id] })
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      super.setEntiteReveAccordee(attacker)
 | 
			
		||||
      super.setEntiteReveAccordee(actor)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -53,7 +53,8 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get title() {
 | 
			
		||||
    return `${Misc.typeName('Item', this.item.type)}: ${this.item.name}`;
 | 
			
		||||
    const owner = (this.item.parent instanceof Actor) ? `(${this.item.parent.name})` : '';
 | 
			
		||||
    return `${Misc.typeName('Item', this.item.type)}: ${this.item.name} ${owner}`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -98,7 +99,7 @@ export class RdDItemSheet extends ItemSheet {
 | 
			
		||||
      description: await TextEditor.enrichHTML(this.item.system.description, { async: true }),
 | 
			
		||||
      descriptionmj: await TextEditor.enrichHTML(this.item.system.descriptionmj, { async: true }),
 | 
			
		||||
      isComestible: this.item.getUtilisationCuisine(),
 | 
			
		||||
      options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable)
 | 
			
		||||
      options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable),
 | 
			
		||||
    }
 | 
			
		||||
    if (this.item.type == TYPES.competencecreature) {
 | 
			
		||||
      formData.isparade = RdDItemCompetenceCreature.isParade(this.item)
 | 
			
		||||
 
 | 
			
		||||
@@ -189,6 +189,7 @@ export class RdDItem extends Item {
 | 
			
		||||
    if (!docData.img) {
 | 
			
		||||
      docData.img = RdDItem.getDefaultImg(docData.type);
 | 
			
		||||
    }
 | 
			
		||||
    context.rdd = undefined
 | 
			
		||||
    super(docData, context);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -569,7 +569,7 @@ export class Migrations {
 | 
			
		||||
    }
 | 
			
		||||
    if (foundry.utils.isNewerVersion(game.system.version, currentVersion)) {
 | 
			
		||||
      // if (true) { /* comment previous and uncomment here to test before upgrade  */
 | 
			
		||||
      const migrations = Migrations.getMigrations().filter(m => isNewerVersion(m.version, currentVersion));
 | 
			
		||||
      const migrations = Migrations.getMigrations().filter(m => foundry.utils.isNewerVersion(m.version, currentVersion));
 | 
			
		||||
      if (migrations.length > 0) {
 | 
			
		||||
        migrations.sort((a, b) => this.compareVersions(a, b));
 | 
			
		||||
        migrations.forEach(async (m) => {
 | 
			
		||||
 
 | 
			
		||||
@@ -166,8 +166,12 @@ export class Misc {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static firstConnectedGM() {
 | 
			
		||||
    return game.users.sort(Misc.ascending(u => u.id)).find(u => u.isGM && u.active);
 | 
			
		||||
    if (foundry.utils.isNewerVersion(game.release.version, '12.0')) {
 | 
			
		||||
      return game.users.activeGM
 | 
			
		||||
    } 
 | 
			
		||||
    return game.users.find(u => u.isGM && u.active);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static connectedGMs() {
 | 
			
		||||
    return game.users.filter(u => u.isGM && u.active);
 | 
			
		||||
  }
 | 
			
		||||
@@ -185,16 +189,20 @@ export class Misc {
 | 
			
		||||
   *  and there is no connected GM
 | 
			
		||||
   */
 | 
			
		||||
  static documentIfResponsible(document) {
 | 
			
		||||
    if (document instanceof Document) {
 | 
			
		||||
      if (Misc.isUniqueConnectedGM() || (Misc.connectedGMs().length == 0 && Misc.isOwnerPlayer(document))) {
 | 
			
		||||
    if (foundry.utils.isNewerVersion(game.release.version, '12.0')) {
 | 
			
		||||
      if (game.users.activeGM || (Misc.connectedGMs().length == 0 && Misc.isOwnerPlayer(document)))
 | 
			
		||||
      {
 | 
			
		||||
        return document
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    else if (Misc.isUniqueConnectedGM() || (Misc.connectedGMs().length == 0 && Misc.isOwnerPlayer(document))) {
 | 
			
		||||
      return document
 | 
			
		||||
    }
 | 
			
		||||
    return undefined
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static isOwnerPlayer(actor) {
 | 
			
		||||
    return actor.testUserPermission(game.user, CONST.DOCUMENT_PERMISSION_LEVELS.OWNER)
 | 
			
		||||
  static isOwnerPlayer(document) {
 | 
			
		||||
    return document.testUserPermission && document.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static isOwnerPlayerOrUniqueConnectedGM(actor) {
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ export class RdDAudio {
 | 
			
		||||
      if ( audioData ) {
 | 
			
		||||
        let audioPath = "systems/foundryvtt-reve-de-dragon/sounds/" + audioData.file;
 | 
			
		||||
        console.log(`foundryvtt-reve-de-dragon | Playing Sound: ${audioPath}`)
 | 
			
		||||
        AudioHelper.play({ src: audioPath }, audioData.isGlobal);
 | 
			
		||||
        foundry.audio.AudioHelper.play({ src: audioPath }, audioData.isGlobal);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -75,6 +75,12 @@ export class RdDCombatManager extends Combat {
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  static calculAjustementInit(actor, arme) {
 | 
			
		||||
    const efficacite = (arme?.system.magique) ? arme.system.ecaille_efficacite : 0
 | 
			
		||||
    const etatGeneral = actor.getEtatGeneral() ?? 0
 | 
			
		||||
    return efficacite + etatGeneral
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /************************************************************************************/
 | 
			
		||||
  async rollInitiative(ids, formula = undefined, messageOptions = {}) {
 | 
			
		||||
@@ -84,12 +90,14 @@ export class RdDCombatManager extends Combat {
 | 
			
		||||
    // calculate initiative
 | 
			
		||||
    for (let cId = 0; cId < ids.length; cId++) {
 | 
			
		||||
      const combatant = this.combatants.get(ids[cId]);
 | 
			
		||||
      let rollFormula = formula ?? RdDCombatManager.formuleInitiative(2, 10, 0, 0);
 | 
			
		||||
      const ajustement = RdDCombatManager.calculAjustementInit(combatant.actor, undefined);
 | 
			
		||||
      let rollFormula = formula ?? RdDCombatManager.formuleInitiative(2, 10, 0, ajustement);
 | 
			
		||||
 | 
			
		||||
      if (!formula) {
 | 
			
		||||
        if (combatant.actor.type == 'creature' || combatant.actor.type == 'entite') {
 | 
			
		||||
          const competence = combatant.actor.items.find(it => RdDItemCompetenceCreature.isCompetenceAttaque(it))
 | 
			
		||||
          if (competence) {
 | 
			
		||||
            rollFormula = RdDCombatManager.formuleInitiative(2, competence.system.carac_value, competence.system.niveau, 0);
 | 
			
		||||
            rollFormula = RdDCombatManager.formuleInitiative(2, competence.system.carac_value, competence.system.niveau, etatGeneral);
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          const armeCombat = combatant.actor.itemTypes['arme'].find(it => it.system.equipe)
 | 
			
		||||
@@ -109,8 +117,9 @@ export class RdDCombatManager extends Combat {
 | 
			
		||||
          if (competence && competence.system.defaut_carac) {
 | 
			
		||||
            const carac = combatant.actor.system.carac[competence.system.defaut_carac].value;
 | 
			
		||||
            const niveau = competence.system.niveau;
 | 
			
		||||
            const bonusEcaille = (armeCombat?.system.magique) ? armeCombat.system.ecaille_efficacite : 0;
 | 
			
		||||
            rollFormula = RdDCombatManager.formuleInitiative(2, carac, niveau, bonusEcaille);
 | 
			
		||||
 | 
			
		||||
            const ajustement = RdDCombatManager.calculAjustementInit(combatant.actor, armeCombat)
 | 
			
		||||
            rollFormula = RdDCombatManager.formuleInitiative(2, carac, niveau, ajustement);
 | 
			
		||||
          } else {
 | 
			
		||||
            ui.notifications.warn(`Votre arme ${armeCombat.name} n'a pas de compétence renseignée`);
 | 
			
		||||
          }
 | 
			
		||||
@@ -214,13 +223,16 @@ export class RdDCombatManager extends Combat {
 | 
			
		||||
 | 
			
		||||
  static $prepareAttaqueArme(infoAttaque) {
 | 
			
		||||
    const comp = infoAttaque.competences.find(c => c.name == infoAttaque.competence);
 | 
			
		||||
    const attaque = foundry.utils.duplicate(infoAttaque.arme);
 | 
			
		||||
    const arme = infoAttaque.arme;
 | 
			
		||||
    const attaque = foundry.utils.duplicate(arme);
 | 
			
		||||
    attaque.action = 'attaque';
 | 
			
		||||
    attaque.system.competence = infoAttaque.competence;
 | 
			
		||||
    attaque.system.dommagesReels = infoAttaque.dommagesReel;
 | 
			
		||||
    attaque.system.infoMain = infoAttaque.infoMain;
 | 
			
		||||
    attaque.system.niveau = comp.system.niveau;
 | 
			
		||||
    attaque.system.initiative = RdDCombatManager.calculInitiative(comp.system.niveau, infoAttaque.carac[comp.system.defaut_carac].value);
 | 
			
		||||
 | 
			
		||||
    const ajustement = (arme?.parent?.getEtatGeneral() ?? 0) + (arme?.system.magique) ? arme.system.ecaille_efficacite : 0;
 | 
			
		||||
    attaque.system.initiative = RdDCombatManager.calculInitiative(comp.system.niveau, infoAttaque.carac[comp.system.defaut_carac].value, ajustement);
 | 
			
		||||
    return attaque;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -335,7 +347,6 @@ export class RdDCombatManager extends Combat {
 | 
			
		||||
      ui.notifications.warn(`Le combatant ${combatant.name} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
 | 
			
		||||
      return [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let initInfo = "";
 | 
			
		||||
    let initOffset = 0;
 | 
			
		||||
    let caracForInit = 0;
 | 
			
		||||
@@ -370,9 +381,9 @@ export class RdDCombatManager extends Combat {
 | 
			
		||||
      initOffset = RdDCombatManager._baseInitOffset(compData.system.categorie, action);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let malus = combatant.actor.getEtatGeneral(); // Prise en compte état général 
 | 
			
		||||
    // Cas des créatures et entités vs personnages
 | 
			
		||||
    let rollFormula = RdDCombatManager.formuleInitiative(initOffset, caracForInit, compNiveau, malus);
 | 
			
		||||
    const ajustement = RdDCombatManager.calculAjustementInit(combatant.actor, action)
 | 
			
		||||
    let rollFormula = RdDCombatManager.formuleInitiative(initOffset, caracForInit, compNiveau, ajustement);
 | 
			
		||||
    // Garder la trace de l'arme/compétence utilisée pour l'iniative
 | 
			
		||||
    combatant.initiativeData = { arme: action } // pour reclasser l'init au round 0
 | 
			
		||||
    game.combat.rollInitiative(combatantId, rollFormula, { initInfo: initInfo });
 | 
			
		||||
@@ -787,7 +798,7 @@ export class RdDCombat {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _prepareAttaque(competence, arme) {
 | 
			
		||||
    let rollData = {
 | 
			
		||||
      passeArme: randomID(16),
 | 
			
		||||
      passeArme: foundry.utils.randomID(16),
 | 
			
		||||
      mortalite: arme?.system.mortalite,
 | 
			
		||||
      competence: competence,
 | 
			
		||||
      surprise: this.attacker.getSurprise(true),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,11 @@
 | 
			
		||||
import { Grammar } from "./grammar.js";
 | 
			
		||||
import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
 | 
			
		||||
 | 
			
		||||
export class RdDConfirm {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static confirmer(options, autresActions) {
 | 
			
		||||
    if (options.settingConfirmer && !ReglesOptionnelles.isSet(options.settingConfirmer)) {
 | 
			
		||||
      return options.onAction()
 | 
			
		||||
    }
 | 
			
		||||
    let buttons = {
 | 
			
		||||
      "action": RdDConfirm._createButtonAction(options),
 | 
			
		||||
      "cancel": RdDConfirm._createButtonCancel()
 | 
			
		||||
 
 | 
			
		||||
@@ -36,8 +36,8 @@ export class DeTMR extends Die {
 | 
			
		||||
    super(termData);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async evaluate() {
 | 
			
		||||
    super.evaluate();
 | 
			
		||||
  async evaluate(options) {
 | 
			
		||||
    await super.evaluate(options);
 | 
			
		||||
    this.explode("x=8");
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
@@ -73,8 +73,8 @@ export class DeDraconique extends Die {
 | 
			
		||||
    super(termData);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async evaluate() {
 | 
			
		||||
    super.evaluate();
 | 
			
		||||
  async evaluate(options) {
 | 
			
		||||
    await super.evaluate(options);
 | 
			
		||||
    this.explode("x=7");
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -248,7 +248,7 @@ export class RdDEmpoignade {
 | 
			
		||||
    if (rollData.rolled.isPart) {
 | 
			
		||||
      rollData.particuliere = "finesse";
 | 
			
		||||
    }
 | 
			
		||||
    let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-resultat.html');
 | 
			
		||||
    let msg = await RdDResolutionTable.displayRollData(rollData, defender, 'chat-empoignade-resultat.html');
 | 
			
		||||
    RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -427,7 +427,7 @@ export class RdDEmpoignade {
 | 
			
		||||
      name: "Empoignade en cours de " + attacker.name + ' sur ' + defender.name,
 | 
			
		||||
      type: 'empoignade',
 | 
			
		||||
      img: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
 | 
			
		||||
      system: { description: "", empoignadeid: randomID(16), compteempoigne: 0, empoigneurid: attacker.id, empoigneid: defender.id, ptsemp: 0, empoigneurname: attacker.name, empoignename: defender.name }
 | 
			
		||||
      system: { description: "", empoignadeid: foundry.utils.randomID(16), compteempoigne: 0, empoigneurid: attacker.id, empoigneid: defender.id, ptsemp: 0, empoigneurname: attacker.name, empoignename: defender.name }
 | 
			
		||||
    },
 | 
			
		||||
      {
 | 
			
		||||
        temporary: true
 | 
			
		||||
 
 | 
			
		||||
@@ -71,15 +71,16 @@ import { RdDTMRDialog } from "./rdd-tmr-dialog.js";
 | 
			
		||||
 * Software License: GNU GPLv3
 | 
			
		||||
 */
 | 
			
		||||
export class SystemReveDeDragon {
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  static start() {
 | 
			
		||||
    const system = new SystemReveDeDragon()
 | 
			
		||||
    Hooks.once('init', async () => await system.onInit())
 | 
			
		||||
    Hooks.once('diceSoNiceReady', (dice3d) => RdDDice.diceSoNiceReady(dice3d))
 | 
			
		||||
    Hooks.once('ready', () => system.onReady())
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  constructor() {
 | 
			
		||||
    this.config = RDD_CONFIG; 
 | 
			
		||||
    this.RdDUtility = RdDUtility;
 | 
			
		||||
    this.RdDHotbar = RdDHotbar;
 | 
			
		||||
    this.itemClasses = {
 | 
			
		||||
@@ -108,7 +109,6 @@ export class SystemReveDeDragon {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async onInit() {
 | 
			
		||||
    game.system.rdd = this;
 | 
			
		||||
    game.system.rdd.config = RDD_CONFIG; 
 | 
			
		||||
    this.AppAstrologie = AppAstrologie;    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -131,7 +131,7 @@ export class RdDPossession {
 | 
			
		||||
    }
 | 
			
		||||
    const possession = (rollData.isECNIDefender ? rollData.attacker : rollData.defender).getPossession(rollData.possession.system.possessionid)
 | 
			
		||||
    RdDPossession.storePossessionAttaque(possession, rollData)
 | 
			
		||||
    await RdDResolutionTable.displayRollData(rollData, rollData.attacker, 'chat-resultat-possession.html');
 | 
			
		||||
    await RdDResolutionTable.displayRollData(rollData, rollData.defender, 'chat-resultat-possession.html');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -171,7 +171,7 @@ export class RdDPossession {
 | 
			
		||||
    rollData.possession = possession
 | 
			
		||||
    RdDPossession.$updateEtatPossession(rollData.possession)
 | 
			
		||||
 | 
			
		||||
    await RdDResolutionTable.displayRollData(rollData, rollData.defender, 'chat-resultat-possession.html')
 | 
			
		||||
    await RdDResolutionTable.displayRollData(rollData, rollData.attacker, 'chat-resultat-possession.html')
 | 
			
		||||
    if (rollData.possession.isPosseder || rollData.possession.isConjurer) {
 | 
			
		||||
      // conjuration
 | 
			
		||||
      victime.deleteEmbeddedDocuments("Item", [rollData.possession._id])
 | 
			
		||||
@@ -230,7 +230,7 @@ export class RdDPossession {
 | 
			
		||||
      system: {
 | 
			
		||||
        description: "", typepossession: attacker.name,
 | 
			
		||||
        possede: false,
 | 
			
		||||
        possessionid: randomID(16),
 | 
			
		||||
        possessionid: foundry.utils.randomID(16),
 | 
			
		||||
        entite: { actorid: attacker.id },
 | 
			
		||||
        victime: { actorid: defender.id },
 | 
			
		||||
        compteur: 0
 | 
			
		||||
 
 | 
			
		||||
@@ -97,7 +97,7 @@ export class RdDResolutionTable {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static actorChatName(actor) {
 | 
			
		||||
    return actor?.userName ?? game.user.name;
 | 
			
		||||
    return actor?.name ?? game.user.name;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
 
 | 
			
		||||
@@ -129,7 +129,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    this.html.find('form.tmr-dialog *').click(event => this.subdialog?.bringToTop());
 | 
			
		||||
 | 
			
		||||
    // Roll Sort
 | 
			
		||||
    this.html.find('.lancer-sort').click(event => this.actor.rollUnSort(this._getCoordActor()));
 | 
			
		||||
    this.html.find('.lancer-sort').click(event => this.lancerUnSort());
 | 
			
		||||
    this.html.find('.lire-signe-draconique').click(event => this.actor.rollLireSigneDraconique(this._getCoordActor()));
 | 
			
		||||
 | 
			
		||||
    this.html.find('img.tmr-move').click(event => this.deplacementTMR(this.html.find(event.currentTarget)?.data('move')));
 | 
			
		||||
@@ -142,6 +142,13 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    this.updateValuesDisplay();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  lancerUnSort() {
 | 
			
		||||
    if (this.subdialog) {
 | 
			
		||||
      return this.forceTMRContinueAction();
 | 
			
		||||
    }
 | 
			
		||||
    return this.actor.rollUnSort(this._getCoordActor());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async onDeplacement() {
 | 
			
		||||
    await this.manageRencontre(TMRUtility.getTMR(this._getCoordActor()));
 | 
			
		||||
  }
 | 
			
		||||
@@ -164,23 +171,25 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
  async forceTMRDisplay() {
 | 
			
		||||
    if (this.rendered) {
 | 
			
		||||
      this.bringToTop()
 | 
			
		||||
      if (this.subdialog?.bringToTop) {
 | 
			
		||||
        this.subdialog.bringToTop();
 | 
			
		||||
      }
 | 
			
		||||
      this.bringSubDialogToTop();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bringSubDialogToTop() {
 | 
			
		||||
    if (this.subdialog?.bringToTop && this.subdialog?.element[0]) {
 | 
			
		||||
      this.subdialog.bringToTop();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async restoreTMRAfterAction() {
 | 
			
		||||
    this.subdialog = undefined
 | 
			
		||||
    await this.maximize();
 | 
			
		||||
    this.bringToTop();
 | 
			
		||||
    await this.maximize()
 | 
			
		||||
    this.bringToTop()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  forceTMRContinueAction() {
 | 
			
		||||
    ui.notifications.warn('Vous devez finir votre action avant de continuer dans les TMR');
 | 
			
		||||
    if (this.subdialog?.bringToTop) {
 | 
			
		||||
      this.subdialog.bringToTop();
 | 
			
		||||
    }
 | 
			
		||||
    this.bringSubDialogToTop();
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -302,7 +311,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    }
 | 
			
		||||
    const coord = this._getCoordActor();
 | 
			
		||||
    HtmlUtility.showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(coord));
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    let ptsreve = document.getElementById("tmr-pointsreve-value");
 | 
			
		||||
    ptsreve.innerHTML = this.actor.system.reve.reve.value;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ import { RdDEmpoignade } from "./rdd-empoignade.js";
 | 
			
		||||
import { ExperienceLog } from "./actor/experience-log.js";
 | 
			
		||||
import { RdDCoeur } from "./coeur/rdd-coeur.js";
 | 
			
		||||
import { APP_ASTROLOGIE_REFRESH } from "./sommeil/app-astrologie.js";
 | 
			
		||||
import { RDD_CONFIG } from "./constants.js";
 | 
			
		||||
 | 
			
		||||
/* -------------------------------------------- */
 | 
			
		||||
// This table starts at 0 -> niveau -10
 | 
			
		||||
@@ -262,8 +263,6 @@ export class RdDUtility {
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    Handlebars.registerHelper('either', (a, b) => a ?? b);
 | 
			
		||||
    Handlebars.registerHelper('computeResolutionScore', (row, col) => RdDResolutionTable.computePercentage(row, col));
 | 
			
		||||
    Handlebars.registerHelper('computeResolutionChances', (row, col) => RdDResolutionTable.computeChances(row, col));
 | 
			
		||||
    Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null'));
 | 
			
		||||
    Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null'));
 | 
			
		||||
    Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? '');
 | 
			
		||||
@@ -272,6 +271,10 @@ export class RdDUtility {
 | 
			
		||||
    Handlebars.registerHelper('apostrophe', (article, str) => Grammar.apostrophe(article, str));
 | 
			
		||||
    Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str));
 | 
			
		||||
    Handlebars.registerHelper('accord', (genre, ...args) => Grammar.accord(genre, args));
 | 
			
		||||
 | 
			
		||||
    Handlebars.registerHelper('RDD_CONFIG', path => RDD_CONFIG[path])
 | 
			
		||||
    Handlebars.registerHelper('computeResolutionScore', (row, col) => RdDResolutionTable.computePercentage(row, col));
 | 
			
		||||
    Handlebars.registerHelper('computeResolutionChances', (row, col) => RdDResolutionTable.computeChances(row, col));
 | 
			
		||||
    Handlebars.registerHelper('buildLigneInventaire', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildLigneInventaire(item, options)); });
 | 
			
		||||
    Handlebars.registerHelper('buildInventaireConteneur', (actorId, itemId, options) => { return new Handlebars.SafeString(RdDUtility.buildInventaireConteneur(actorId, itemId, options)); });
 | 
			
		||||
    Handlebars.registerHelper('buildContenuConteneur', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildContenuConteneur(item, options)); });
 | 
			
		||||
@@ -301,12 +304,12 @@ export class RdDUtility {
 | 
			
		||||
    Handlebars.registerHelper('experienceLog-topic', topic => ExperienceLog.labelTopic(topic));
 | 
			
		||||
 | 
			
		||||
    // Handle v12 removal of this helper
 | 
			
		||||
    Handlebars.registerHelper('select', function (selected, options) { 
 | 
			
		||||
    Handlebars.registerHelper('select', function (selected, options) {
 | 
			
		||||
      const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected));
 | 
			
		||||
      const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']');
 | 
			
		||||
      const html = options.fn(this);
 | 
			
		||||
      return html.replace(rgx, "$& selected");    
 | 
			
		||||
    }); 
 | 
			
		||||
      return html.replace(rgx, "$& selected");
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    return loadTemplates(templatePaths);
 | 
			
		||||
  }
 | 
			
		||||
@@ -355,13 +358,15 @@ export class RdDUtility {
 | 
			
		||||
    let objetVersConteneur = {};
 | 
			
		||||
    // Attribution des objets aux conteneurs
 | 
			
		||||
    for (let conteneur of conteneurs) {
 | 
			
		||||
      conteneur.subItems = [];
 | 
			
		||||
      for (let id of conteneur.system.contenu ?? []) {
 | 
			
		||||
        let objet = inventaires.find(objet => (id == objet._id));
 | 
			
		||||
        if (objet) {
 | 
			
		||||
          objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template
 | 
			
		||||
          objetVersConteneur[id] = conteneur._id;
 | 
			
		||||
          conteneur.subItems.push(objet);
 | 
			
		||||
      if (conteneur.isConteneur()) {
 | 
			
		||||
        conteneur.subItems = [];
 | 
			
		||||
        for (let id of conteneur.system.contenu ?? []) {
 | 
			
		||||
          let objet = inventaires.find(objet => (id == objet._id));
 | 
			
		||||
          if (objet) {
 | 
			
		||||
            objet.estContenu = true;
 | 
			
		||||
            objetVersConteneur[id] = conteneur._id;
 | 
			
		||||
            conteneur.subItems.push(objet);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
@@ -764,7 +769,7 @@ export class RdDUtility {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static createMonnaie(name, cout, img = "", enc = 0.01) {
 | 
			
		||||
    let piece = {
 | 
			
		||||
      name: name, type: 'monnaie', img: img, _id: randomID(16),
 | 
			
		||||
      name: name, type: 'monnaie', img: img, _id: foundry.utils.randomID(16),
 | 
			
		||||
      dasystemta: {
 | 
			
		||||
        quantite: 0,
 | 
			
		||||
        cout: cout,
 | 
			
		||||
 
 | 
			
		||||
@@ -111,7 +111,7 @@ export const referenceAjustements = {
 | 
			
		||||
    isVisible: (rollData, actor) => rollData.arme?.system.magique && Number(rollData.arme?.system.ecaille_efficacite) > 0,
 | 
			
		||||
    isUsed: (rollData, actor) => rollData.arme?.system.magique && Number(rollData.arme?.system.ecaille_efficacite) > 0,
 | 
			
		||||
    getLabel: (rollData, actor) => "Ecaille d'Efficacité: ",
 | 
			
		||||
    getValue: (rollData, actor) => Math.max(Number(rollData.arme?.system.ecaille_efficacite), 0),
 | 
			
		||||
    getValue: (rollData, actor) => rollData.arme?.system.magique ? Math.max(Number(rollData.arme?.system.ecaille_efficacite), 0) : 0,
 | 
			
		||||
  },
 | 
			
		||||
  finesse: {
 | 
			
		||||
    isUsed: (rollData, actor) => RdDBonus.isDefenseAttaqueFinesse(rollData),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import { ChatUtility } from "../chat-utility.js";
 | 
			
		||||
import { HIDE_DICE, SYSTEM_RDD } from "../constants.js";
 | 
			
		||||
import { RdDItem } from "../item.js";
 | 
			
		||||
import { Misc } from "../misc.js";
 | 
			
		||||
@@ -290,7 +291,7 @@ export class CompendiumTableHelpers {
 | 
			
		||||
      sound: CONFIG.sounds.dice,
 | 
			
		||||
      content: flavorContent
 | 
			
		||||
    };
 | 
			
		||||
    ChatMessage.create(messageData, { rollMode: "gmroll" });
 | 
			
		||||
    await ChatUtility.createChatWithRollMode(game.user.id, messageData)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -306,7 +307,7 @@ export class CompendiumTableHelpers {
 | 
			
		||||
      whisper: game.user.id,
 | 
			
		||||
      content: flavorContent
 | 
			
		||||
    };
 | 
			
		||||
    ChatMessage.create(messageData, { rollMode: "gmroll" });
 | 
			
		||||
    await ChatUtility.createChatWithRollMode(game.user.id, messageData)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -123,9 +123,9 @@ export class RdDCalendrier extends Application {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  fillCalendrierData(formData = {}) {
 | 
			
		||||
    foundry.utils.mergeObject(formData, this.timestamp.toCalendrier());
 | 
			
		||||
    formData.isGM = game.user.isGM;
 | 
			
		||||
    formData.isGM = game.user.isGM
 | 
			
		||||
    formData.heures = RdDTimestamp.definitions()
 | 
			
		||||
    formData.horlogeAnalogique = this.horlogeAnalogique;
 | 
			
		||||
    formData.horlogeAnalogique = this.horlogeAnalogique
 | 
			
		||||
    formData.autoDarkness = AutoAdjustDarkness.isAuto()
 | 
			
		||||
    return formData;
 | 
			
		||||
  }
 | 
			
		||||
@@ -372,7 +372,7 @@ export class RdDCalendrier extends Application {
 | 
			
		||||
      game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_app_astrologie_refresh", data: {} })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  async addNbAstralJoueur(actor, date, nbAstral, isValid) {
 | 
			
		||||
    const nombresAstraux = this.getNombresAstraux()
 | 
			
		||||
    const astralData = nombresAstraux.find(it => it.index == date)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
import { TYPES } from "../item.js"
 | 
			
		||||
import { RdDItemCompetence } from "../item-competence.js"
 | 
			
		||||
import { ChatUtility } from "../chat-utility.js"
 | 
			
		||||
import { Misc } from "../misc.js"
 | 
			
		||||
 | 
			
		||||
const CODES_COMPETENCES_VOYAGE = ['Extérieur', 'Forêt', 'Montagne', 'Marais', 'Glace', 'Equitation']
 | 
			
		||||
const TABLEAU_FATIGUE_MARCHE = [
 | 
			
		||||
@@ -36,7 +37,7 @@ export class DialogFatigueVoyage extends Dialog {
 | 
			
		||||
      const parameters = {
 | 
			
		||||
        tableauFatigueMarche: TABLEAU_FATIGUE_MARCHE,
 | 
			
		||||
        playerActors: game.actors.filter(actor => actor.isPersonnageJoueur())
 | 
			
		||||
          .map(actor => DialogFatigueVoyage.prepareActor(actor)),
 | 
			
		||||
          .map(actor => DialogFatigueVoyage.prepareActorParameters(actor)),
 | 
			
		||||
        nombreHeures: 1,
 | 
			
		||||
      }
 | 
			
		||||
      DialogFatigueVoyage.setModeDeplacement(parameters, undefined, undefined)
 | 
			
		||||
@@ -53,21 +54,37 @@ export class DialogFatigueVoyage extends Dialog {
 | 
			
		||||
    parameters.typeTerrain = ligneFatigueMarche
 | 
			
		||||
    parameters.vitesseDeplacement = rythme.vitesse
 | 
			
		||||
    parameters.fatigueHoraire = rythme.fatigue
 | 
			
		||||
    parameters.playerActors.forEach(voyageur =>
 | 
			
		||||
      DialogFatigueVoyage.selectSurvie(voyageur, parameters.typeTerrain.code)
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static prepareActor(actor) {
 | 
			
		||||
    const competencesVoyage = {}
 | 
			
		||||
    CODES_COMPETENCES_VOYAGE.forEach(codeSurvie =>
 | 
			
		||||
      competencesVoyage[codeSurvie] = RdDItemCompetence.findCompetence(actor.itemTypes[TYPES.competence], codeSurvie, { onMessage: () => { } })
 | 
			
		||||
    )
 | 
			
		||||
    return {
 | 
			
		||||
  static prepareActorParameters(actor) {
 | 
			
		||||
    const actorParameters = {
 | 
			
		||||
      id: actor.id,
 | 
			
		||||
      actor: actor,
 | 
			
		||||
      selected: true,
 | 
			
		||||
      ajustementFatigue: 0,
 | 
			
		||||
      competencesVoyage: competencesVoyage
 | 
			
		||||
      survies: {}
 | 
			
		||||
    }
 | 
			
		||||
    const competencesVoyage = {}
 | 
			
		||||
    CODES_COMPETENCES_VOYAGE.forEach(codeSurvie => {
 | 
			
		||||
      competencesVoyage[codeSurvie] = RdDItemCompetence.findCompetence(actor.itemTypes[TYPES.competence], codeSurvie, { onMessage: () => { } })
 | 
			
		||||
    })
 | 
			
		||||
    TABLEAU_FATIGUE_MARCHE.forEach(terrain => {
 | 
			
		||||
      actorParameters.survies[terrain.code] = Misc.join(
 | 
			
		||||
        terrain.survies.map(survie => {
 | 
			
		||||
          const niveau = competencesVoyage[survie]?.system.niveau
 | 
			
		||||
          return `${survie}: ${niveau}`
 | 
			
		||||
        }),
 | 
			
		||||
        ', ')
 | 
			
		||||
    })
 | 
			
		||||
    return actorParameters
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static selectSurvie(actorParameters, code) {
 | 
			
		||||
    actorParameters.survieCourante = actorParameters.survies[code]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  constructor(html, parameters) {
 | 
			
		||||
    const options = {
 | 
			
		||||
@@ -97,6 +114,7 @@ export class DialogFatigueVoyage extends Dialog {
 | 
			
		||||
    this.html.find('select[name="code-terrain"]').change(event => this.changeParameters())
 | 
			
		||||
    this.html.find('select[name="vitesse-deplacement"]').change(event => this.changeParameters())
 | 
			
		||||
    this.html.find('input[name="nombre-heures"]').change(event => this.changeParameters())
 | 
			
		||||
    this.html.find('.list-item input[name="ajustement-fatigue"]').change(event => this.changeParameters())
 | 
			
		||||
    this.html.find('button[name="appliquer-fatigue"]').click(event => this.appliquerFatigue())
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -118,6 +136,10 @@ export class DialogFatigueVoyage extends Dialog {
 | 
			
		||||
        selectVitesseDeplacement.append(await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/voyage/option-vitesse-fatigue.hbs', rythme))
 | 
			
		||||
      })
 | 
			
		||||
      selectVitesseDeplacement.val(this.parameters.vitesseDeplacement).change()
 | 
			
		||||
 | 
			
		||||
      Promise.all(this.getActorRows()
 | 
			
		||||
        .map(async row => row.find('label.voyage-liste-survies').text(this.$extractActorParameters(row).survieCourante)
 | 
			
		||||
        ))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -132,16 +154,24 @@ export class DialogFatigueVoyage extends Dialog {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async setFatigue() {
 | 
			
		||||
    this.html.find('input[name="base-fatigue"]').val(this.parameters.nombreHeures * this.parameters.fatigueHoraire)
 | 
			
		||||
    const baseFatigue = this.parameters.nombreHeures * this.parameters.fatigueHoraire
 | 
			
		||||
    this.html.find('input[name="base-fatigue"]').val(baseFatigue)
 | 
			
		||||
    this.updateActorTotalFatigue(baseFatigue)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async updateActorTotalFatigue(baseFatigue) {
 | 
			
		||||
    Promise.all(this.getActorRows()
 | 
			
		||||
      .map(async row => {
 | 
			
		||||
        const actor = this.$extractActorParameters(row)
 | 
			
		||||
        row.find('input[name="total-fatigue"]').val(actor.ajustement + baseFatigue)
 | 
			
		||||
      }))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async appliquerFatigue() {
 | 
			
		||||
    const fatigueBase = parseInt(this.html.find('input[name="base-fatigue"]').val() ?? 0)
 | 
			
		||||
    const actors = jQuery.map(
 | 
			
		||||
      this.html.find('div.fatigue-actors-list li.list-item'),
 | 
			
		||||
      it => this.$extractActor(this.html.find(it))
 | 
			
		||||
    )
 | 
			
		||||
    actors.filter(it => it.selected)
 | 
			
		||||
    this.getActorRows()
 | 
			
		||||
      .map(row => this.$extractActorParameters(row))
 | 
			
		||||
      .filter(it => it.selected)
 | 
			
		||||
      .forEach(async it => {
 | 
			
		||||
        const perteFatigue = fatigueBase + it.ajustement
 | 
			
		||||
        ChatMessage.create({
 | 
			
		||||
@@ -161,16 +191,24 @@ export class DialogFatigueVoyage extends Dialog {
 | 
			
		||||
      })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $extractActor(actorRow) {
 | 
			
		||||
    const actor = game.actors.get(actorRow.data('actor-id'))
 | 
			
		||||
  getActorRows() {
 | 
			
		||||
    return jQuery.map(
 | 
			
		||||
      this.html.find('div.fatigue-actors-list li.list-item'),
 | 
			
		||||
      it => this.html.find(it))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  $extractActorParameters(actorRow) {
 | 
			
		||||
    const actorId = actorRow.data('actor-id')
 | 
			
		||||
    const actorParameters = this.parameters.playerActors.find(it => it.id == actorId)
 | 
			
		||||
    const actor = game.actors.get(actorId)
 | 
			
		||||
    if (!actor) {
 | 
			
		||||
      ui.notifications.warn(`Acteur ${it.actorId} introuvable`)
 | 
			
		||||
      return {}
 | 
			
		||||
    }
 | 
			
		||||
    return {
 | 
			
		||||
      actor: actor,
 | 
			
		||||
      ajustement: parseInt(actorRow.find('input[name="ajustement-fatigue"]').val() ?? 0),
 | 
			
		||||
      selected: actor && actorRow.find('input[name="selectionner-acteur"]').is(':checked')
 | 
			
		||||
    }
 | 
			
		||||
    actorParameters.ajustement = parseInt(actorRow.find('input[name="ajustement-fatigue"]').val() ?? 0)
 | 
			
		||||
    actorParameters.selected = actor && actorRow.find('input[name="selectionner-acteur"]').is(':checked')
 | 
			
		||||
    return actorParameters
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async close() {
 | 
			
		||||
 
 | 
			
		||||
@@ -1374,7 +1374,7 @@ table.table-nombres-astraux tr:hover {
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  top: 4.6rem;
 | 
			
		||||
  right: 3.5rem;
 | 
			
		||||
  left: -19rem;
 | 
			
		||||
}
 | 
			
		||||
.token-hud-ext.soins {
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
  "id": "foundryvtt-reve-de-dragon",
 | 
			
		||||
  "title": "Rêve de Dragon",
 | 
			
		||||
  "version": "12.0.0",
 | 
			
		||||
  "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-12.0.0.zip",
 | 
			
		||||
  "version": "12.0.8",
 | 
			
		||||
  "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-12.0.8.zip",
 | 
			
		||||
  "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v11/system.json",
 | 
			
		||||
  "changelog": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md",
 | 
			
		||||
  "compatibility": {
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,7 @@
 | 
			
		||||
  <li class="caracteristique flexrow list-item"  data-tooltip="Niveau d'éthylisme">
 | 
			
		||||
    <label class="derivee-label" for="system.compteurs.ethylisme.value">{{system.compteurs.ethylisme.label}}</label>
 | 
			
		||||
    <select class="derivee-value" name="system.compteurs.ethylisme.value" data-dtype="Number">
 | 
			
		||||
      {{selectOptions @root.config.niveauEthylisme selected=system.compteurs.ethylisme.value valueAttr="value" nameAttr="value" labelAttr="label"}} 
 | 
			
		||||
      {{selectOptions (RDD_CONFIG 'niveauEthylisme')  selected=system.compteurs.ethylisme.value valueAttr="value" nameAttr="value" labelAttr="label"}} 
 | 
			
		||||
    </select>  
 | 
			
		||||
  </li>  
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,13 +2,13 @@
 | 
			
		||||
  <li class="caracteristique flexrow list-item">
 | 
			
		||||
    <span class="carac-label" name="catEntite">Catégorie : </span>
 | 
			
		||||
    <select name="system.definition.categorieentite" value="{{system.definition.categorieentite}}" data-dtype="String" {{#unless @root.options.vueDetaillee}}disabled{{/unless}}>
 | 
			
		||||
      {{selectOptions @root.config.categorieEntite selected=system.definition.categorieentite}}
 | 
			
		||||
      {{selectOptions (RDD_CONFIG 'categorieEntite') selected=system.definition.categorieentite}}
 | 
			
		||||
    </select>
 | 
			
		||||
  </li>
 | 
			
		||||
  <li class="caracteristique flexrow list-item">
 | 
			
		||||
    <span class="carac-label" name="typeEntite">Type d'entité : </span>
 | 
			
		||||
    <select name="system.definition.typeentite" value="{{system.definition.typeentite}}" data-dtype="String" {{#unless @root.options.vueDetaillee}}disabled{{/unless}}>
 | 
			
		||||
      {{selectOptions @root.config.typeEntite selected=system.definition.typeentite}}
 | 
			
		||||
      {{selectOptions (RDD_CONFIG 'typeEntite') selected=system.definition.typeentite}}
 | 
			
		||||
    </select>
 | 
			
		||||
  </li>
 | 
			
		||||
  {{#each system.attributs as |attr key|}}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
    <span class="competence-value">{{plusMoins arme.system.niveau}}</span>
 | 
			
		||||
    <span class="competence-value">{{plusMoins arme.system.dommagesReels}}</span>
 | 
			
		||||
    <span class="competence-value"></span>
 | 
			
		||||
    <span class="initiative-value arme-initiative"><a data-tooltip="{{arme.name}}: initiative {{plusMoins arme.system.initiative}}">{{arme.system.initiative}}</a></span>
 | 
			
		||||
    <span class="initiative-value arme-initiative"><a data-tooltip="{{arme.name}}: initiative {{arme.system.initiative}}">{{arme.system.initiative}}</a></span>
 | 
			
		||||
  </li>
 | 
			
		||||
  {{/each}}
 | 
			
		||||
  {{#each esquives as |esq key|}}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
        type="number" data-dtype="Number" min="1" max="28"
 | 
			
		||||
        name="{{path}}.jourDuMois" value="{{jourDuMois}}" />
 | 
			
		||||
    <select {{#if disabled}}{{disabled}}{{/if}} name="{{path}}.mois" class="calendar-signe-heure" data-dtype="String">
 | 
			
		||||
    {{select config.heuresRdD selected=mois.key labelAttr="label" nameAttr="value" valueAttr="value"}}
 | 
			
		||||
    {{selectOptions (RDD_CONFIG 'heuresRdD') selected=mois.key labelAttr="label" nameAttr="value" valueAttr="value"}}
 | 
			
		||||
    </select>
 | 
			
		||||
    {{timestamp-imgSigne mois}}
 | 
			
		||||
    <input {{#if disabled}}{{disabled}}{{/if}} type="number" class="number-x2" name="{{path}}.annee" value="{{annee}}" data-dtype="Number"/>
 | 
			
		||||
@@ -15,7 +15,7 @@
 | 
			
		||||
    <label></label>
 | 
			
		||||
    <label>heure</label>
 | 
			
		||||
    <select {{#if disabled}}{{disabled}}{{/if}} name="{{path}}.heure" class="calendar-signe-heure" data-dtype="String">
 | 
			
		||||
    {{select config.heuresRdD selected=heure.key labelAttr="label" nameAttr="value" valueAttr="value"}}
 | 
			
		||||
    {{selectOptions (RDD_CONFIG 'heuresRdD') selected=heure.key labelAttr="label" nameAttr="value" valueAttr="value"}}
 | 
			
		||||
    </select>
 | 
			
		||||
    {{timestamp-imgSigne heure}}
 | 
			
		||||
    <input {{#if disabled}}{{disabled}}{{/if}} type="number" class="number-x2" name="{{path}}.minute" value="{{minute}}" data-dtype="Number"/>
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@
 | 
			
		||||
      <a class="milieu-add"><i class="fas fa-plus-circle"></i></a>
 | 
			
		||||
    </span>
 | 
			
		||||
  </div>
 | 
			
		||||
  
 | 
			
		||||
  {{#each system.environnement as |env key|}}
 | 
			
		||||
  <div class="form-group environnement-milieu" data-milieu="{{env.milieu}}">
 | 
			
		||||
    <label>
 | 
			
		||||
@@ -26,7 +27,7 @@
 | 
			
		||||
    </label>
 | 
			
		||||
    <span class="flexrow">
 | 
			
		||||
      <select name="milieu-{{key}}-rarete" class="environnement-rarete flex-shrink" data-dtype="String">
 | 
			
		||||
        {{selectOptions config.rarete selected=env.rarete labelAttr="label" valueAttr="value" nameAttr="value"}}
 | 
			
		||||
        {{selectOptions (RDD_CONFIG 'raretes') selected=env.rarete labelAttr="label" valueAttr="value" nameAttr="value"}}
 | 
			
		||||
      </select>
 | 
			
		||||
      {{rangePicker name="milieu-{{key}}-frequence" value=env.frequence min=(rarete-getChamp env.rarete 'min') max=(rarete-getChamp env.rarete 'max') step=1}}
 | 
			
		||||
      <label>[{{rarete-getChamp env.rarete 'min'}}-{{rarete-getChamp env.rarete 'max'}}]</label>
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,8 @@
 | 
			
		||||
        <li class="competence-header flexrow">
 | 
			
		||||
          <span class="flex-grow-2">Personnage</span>
 | 
			
		||||
          <span class="flex-grow-2">Survies</span>
 | 
			
		||||
          <span class="flex-grow-1" data-tooltip="Ajustements à appliquer pour les personnages se reposant (par exemple, à cheval)">Ajustements</span>
 | 
			
		||||
          <span class="flex-grow-1" data-tooltip="Ajustements à appliquer (par exemple, repos à cheval)">Ajustements</span>
 | 
			
		||||
          <span class="flex-grow-1" data-tooltip="Total de fatigue pour le voyageur">Total</span>
 | 
			
		||||
        </li>
 | 
			
		||||
        {{#each playerActors as |selected|}}
 | 
			
		||||
        {{>'systems/foundryvtt-reve-de-dragon/templates/voyage/fatigue-actor.hbs' voyageur=selected survies=@root.typeTerrain.survies}}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,16 +8,13 @@
 | 
			
		||||
  </span>
 | 
			
		||||
  <span class="flex-grow-2">
 | 
			
		||||
    <div class="flexcol ">
 | 
			
		||||
      <label class="voyage-liste-survies">
 | 
			
		||||
      {{#each voyageur.competencesVoyage as |comp key|}}
 | 
			
		||||
      {{#if (array-includes ../survies key)}}
 | 
			
		||||
        {{key}} {{comp.system.niveau}},
 | 
			
		||||
      {{/if}}
 | 
			
		||||
      {{/each}}
 | 
			
		||||
      </label>
 | 
			
		||||
      <label class="voyage-liste-survies">{{voyageur.survieCourante}}</label>
 | 
			
		||||
    </div>
 | 
			
		||||
  </span>
 | 
			
		||||
  <span class="flex-grow-1">
 | 
			
		||||
    <input type="number" name="ajustement-fatigue" class="number-x2 ajustement-fatigue" data-dtype="Number" value="{{voyageur.ajustementFatigue}}" min="-6" max="6"/>
 | 
			
		||||
  </span>
 | 
			
		||||
  <span class="flex-grow-1">
 | 
			
		||||
    <input type="number" name="total-fatigue" class="number-x2 total-fatigue" data-dtype="Number" value="1" min="0" max="24" disabled/>
 | 
			
		||||
  </span>
 | 
			
		||||
</li>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user