forked from public/foundryvtt-reve-de-dragon
		
	Compare commits
	
		
			18 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9b8a600e22 | |||
| 25db7e0712 | |||
| 776d4ce9ec | |||
| 1de0806e37 | |||
| 03366fdf26 | |||
| 14f324360d | |||
| d60c9f1b28 | |||
| cf514470fd | |||
| b09b095897 | |||
| d81965155c | |||
| 9fa8a2e6f3 | |||
| da7f87fd45 | |||
| 6aba92900c | |||
| 4939e5564e | |||
| 40be65a94e | |||
| 633638a9ab | |||
| 88a3464eed | |||
| 921e470498 | 
							
								
								
									
										36
									
								
								changelog.md
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								changelog.md
									
									
									
									
									
								
							@@ -1,21 +1,48 @@
 | 
			
		||||
# 12.0
 | 
			
		||||
 | 
			
		||||
## 12.0.46 - Le double demi d'Astrobazzarh
 | 
			
		||||
- correction des raffraîchissement lors du sommeil qui empêchait de dormir
 | 
			
		||||
  plusieurs heures
 | 
			
		||||
- Si la fatigue n'est pas utilisée, les rounds dans les TMR font perdre de l'endurance (au lieu d'en gagner)
 | 
			
		||||
- les TMRs se ferment correctement quand la fatigue maximale est dépassée
 | 
			
		||||
- le message de lancement de sort en réserve donne la description du sort
 | 
			
		||||
- suppression de double-messages lors de la fermeture des TMR
 | 
			
		||||
 | 
			
		||||
## 12.0.45 - Les errements d'Astrobazzarh, encore
 | 
			
		||||
 | 
			
		||||
- La difficulté des méditations n'augmente plus en cas de réussite et d'échec normal
 | 
			
		||||
- Renommage du Bouton pour révéler/masquer le demi-rêve
 | 
			
		||||
 | 
			
		||||
## 12.0.44 - Les errements d'Astrobazzarh, suite
 | 
			
		||||
 | 
			
		||||
- on peut de nouveau dormir et se réveiller reposé
 | 
			
		||||
- les possessions utilisent maintenant correctement le rêve actuel
 | 
			
		||||
- les sorts variables ne causent plus de soucis de voie pour le lancement de sorts
 | 
			
		||||
- les acteurs ayant un sort avec un coût de rêve entier ne sont plus considérés
 | 
			
		||||
  comme pouvant avoir un rêve variable
 | 
			
		||||
 | 
			
		||||
## 12.0.42 - Les errements d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- Correction de différentes automatisations de combat incorrectes
 | 
			
		||||
- Correction des jets `@roll[vue/-2]` qui tentaient de chercher une compétence -2 (à cause des armes à 1/2 mains)
 | 
			
		||||
 | 
			
		||||
## 12.0.41 - La loupe d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- On peut de nouveau effectuer des tirages cachés
 | 
			
		||||
- Le stress transformé est bien diminué lorsqu'on met le stress dans une compétence
 | 
			
		||||
 | 
			
		||||
## 12.0.40 - Les mains d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- correction des attaques particulières en combat
 | 
			
		||||
- correction de message sur les min/max liés aux modificateurs de races (s'applique uniquement sur la taille)
 | 
			
		||||
 | 
			
		||||
## 12.0.39 - Les mains d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- les armes à 1 ou 2 mains fonctionnent dans les liens de jets de dés
 | 
			
		||||
- commande `/jet` pour poster une demande de jet de dés
 | 
			
		||||
 | 
			
		||||
## 12.0.38 - Les prévisions d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- Correction de modifications de personnages qui ne s'affichaient pas:
 | 
			
		||||
  - changements d'endurance/vie/fatigue, transformé, ...
 | 
			
		||||
- Migration des compétences "Ecriture" en "Écriture" dans les tâches, livres, oeuvres et méditations
 | 
			
		||||
@@ -25,12 +52,14 @@
 | 
			
		||||
  - utilisation de l'extension hbs pour tous les fichiers handlebars
 | 
			
		||||
 | 
			
		||||
## 12.0.37 - Les enchantements d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- les potions ont un état, seules les potions liquides sont enchantables
 | 
			
		||||
- les lancements de sorts du jour sont conservés jusqu'à chateau dormant
 | 
			
		||||
- lorsqu'un joueur souhaite enchanter une potion, les sorts d'enchantements/purification/permanence doivent avoir été lancés auparavant
 | 
			
		||||
- on peut enchanter des gemmes exactement comme des potions
 | 
			
		||||
 | 
			
		||||
## 12.0.36 - L'alchimie d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- Nouveautés
 | 
			
		||||
  - ajout d'un bouton pour enchanter les potions
 | 
			
		||||
  - standardisation des boutons d'actions sur les items
 | 
			
		||||
@@ -45,9 +74,11 @@
 | 
			
		||||
  - Corrections de descriptions pour proposer les jet de dés
 | 
			
		||||
 | 
			
		||||
## 12.0.35 - La Solution d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- Fix problème d'initialisation des feuilles d'items
 | 
			
		||||
 | 
			
		||||
## 12.0.34 - la tête d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- support de liens "jets de dés"
 | 
			
		||||
  - on peut ajouter des liens "jet de dés" dans les journaux, descriptions, notes, maladresses, ...
 | 
			
		||||
  - avec la syntaxe `@roll[...]` on peut ajouter le lien vers:
 | 
			
		||||
@@ -62,21 +93,26 @@
 | 
			
		||||
- gestion des blocs secrets dans les descriptions
 | 
			
		||||
 | 
			
		||||
## 12.0.33 - la vieillesse d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- retour de l'expérience pour les joueurs
 | 
			
		||||
- suppression du message "Pas de caractéristique" sur les jets d'odorat-goût
 | 
			
		||||
 | 
			
		||||
## 12.0.32 - les rêveries d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- Ajout des Items Race pour gérer les ajustements liés aux races
 | 
			
		||||
 | 
			
		||||
## 12.0.31 - le mausolée d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- Correction: les automatisation de combat jouer-MJ fonctionnentde nouveau
 | 
			
		||||
 | 
			
		||||
## 12.0.30 - le cauchemar d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- calcul automatique du niveau des entités selon leur rêve
 | 
			
		||||
- la description des créatures venimeuses contient un lien vers leur venin
 | 
			
		||||
- Correction: les messages de combats ne marchaient plus (Changement combiné Foundry + rêve de Dragon)
 | 
			
		||||
 | 
			
		||||
## 12.0.29 - L'indexation d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- les liens dans la descriptions des sorts pointent vers les sorts du compendium
 | 
			
		||||
- la description du chrasme contient le lien vers son venin plutôt qu'un tableau
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										139
									
								
								module/actor.js
									
									
									
									
									
								
							
							
						
						
									
										139
									
								
								module/actor.js
									
									
									
									
									
								
							@@ -243,7 +243,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
    }
 | 
			
		||||
    await this.resetInfoSommeil()
 | 
			
		||||
    ChatMessage.create(message);
 | 
			
		||||
    this.sheet.render(true);
 | 
			
		||||
    setTimeout(() => this.sheet.render(), 20)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async _recuperationSante(message) {
 | 
			
		||||
@@ -279,30 +279,34 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async dormirChateauDormant() {
 | 
			
		||||
    if (!ReglesOptionnelles.isUsing("chateau-dormant-gardien") || !this.system.sommeil || this.system.sommeil.nouveaujour) {
 | 
			
		||||
      const message = {
 | 
			
		||||
        whisper: ChatUtility.getOwners(this),
 | 
			
		||||
        content: ""
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      await this._recuperationSante(message)
 | 
			
		||||
      await this._recupereMoralChateauDormant(message)
 | 
			
		||||
      await this._recupereChance()
 | 
			
		||||
      await this.transformerStress()
 | 
			
		||||
      await this.retourSeuilDeReve(message)
 | 
			
		||||
      await this.setBonusPotionSoin(0)
 | 
			
		||||
      await this.retourSust(message)
 | 
			
		||||
      await this.$perteReveEnchantementsChateauDormants()
 | 
			
		||||
      await this.$suppressionLancementsSort()
 | 
			
		||||
      await RdDCoeur.applyCoeurChateauDormant(this, message)
 | 
			
		||||
      if (message.content != "") {
 | 
			
		||||
        message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`;
 | 
			
		||||
        ChatMessage.create(message);
 | 
			
		||||
      }
 | 
			
		||||
      await this.resetInfoSommeil();
 | 
			
		||||
      this.sheet.render(true);
 | 
			
		||||
      await this.$dormirChateauDormant();
 | 
			
		||||
      setTimeout(() => this.sheet.render(), 20)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async $dormirChateauDormant() {
 | 
			
		||||
    const message = {
 | 
			
		||||
      whisper: ChatUtility.getOwners(this),
 | 
			
		||||
      content: ""
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    await this._recuperationSante(message);
 | 
			
		||||
    await this._recupereMoralChateauDormant(message);
 | 
			
		||||
    await this._recupereChance();
 | 
			
		||||
    await this.transformerStress();
 | 
			
		||||
    await this.retourSeuilDeReve(message);
 | 
			
		||||
    await this.setBonusPotionSoin(0);
 | 
			
		||||
    await this.retourSust(message);
 | 
			
		||||
    await this.$perteReveEnchantementsChateauDormants();
 | 
			
		||||
    await this.$suppressionLancementsSort();
 | 
			
		||||
    await RdDCoeur.applyCoeurChateauDormant(this, message);
 | 
			
		||||
    if (message.content != "") {
 | 
			
		||||
      message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`;
 | 
			
		||||
      ChatMessage.create(message);
 | 
			
		||||
    }
 | 
			
		||||
    await this.resetInfoSommeil();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async resetInfoSommeil() {
 | 
			
		||||
    await this.update({
 | 
			
		||||
      'system.sommeil': {
 | 
			
		||||
@@ -442,10 +446,9 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
      message.content += 'Vous ne trouvez pas le sommeil';
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      let jetsReve = [];
 | 
			
		||||
      let dormi = await this.dormirDesHeures(jetsReve, message, heures, options);
 | 
			
		||||
      if (jetsReve.length > 0) {
 | 
			
		||||
        message.content += `Vous récupérez ${jetsReve.map(it => it < 0 ? '0 (réveil)' : it).reduce(Misc.joining("+"))} Points de rêve. `;
 | 
			
		||||
      let dormi = await this.$dormirDesHeures(message, heures, options);
 | 
			
		||||
      if (dormi.jetsReve.length > 0) {
 | 
			
		||||
        message.content += `Vous récupérez ${dormi.jetsReve.map(it => it < 0 ? '0 (réveil)' : it).reduce(Misc.joining("+"))} Points de rêve. `;
 | 
			
		||||
      }
 | 
			
		||||
      if (dormi.etat == 'eveil') {
 | 
			
		||||
        await this.reveilReveDeDragon(message, dormi.heures);
 | 
			
		||||
@@ -458,11 +461,9 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
      ChatMessage.create(message);
 | 
			
		||||
    }
 | 
			
		||||
    if (options.chateauDormant) {
 | 
			
		||||
      await this.dormirChateauDormant();
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      this.sheet.render(true);
 | 
			
		||||
      await this.$dormirChateauDormant();
 | 
			
		||||
    }
 | 
			
		||||
    setTimeout(() => this.sheet.render(), 20)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async reveilReveDeDragon(message, heures) {
 | 
			
		||||
@@ -472,18 +473,18 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async dormirDesHeures(jetsReve, message, heures, options) {
 | 
			
		||||
    const dormi = { heures: 0, etat: 'dort' };
 | 
			
		||||
  async $dormirDesHeures(message, heures, options) {
 | 
			
		||||
    const dormi = { heures: 0, etat: 'dort', jetsReve: [] };
 | 
			
		||||
    for (; dormi.heures < heures && dormi.etat == 'dort'; dormi.heures++) {
 | 
			
		||||
      await this._recupererEthylisme(message);
 | 
			
		||||
      await this.$recupererEthylisme(message);
 | 
			
		||||
      if (options.grisReve) {
 | 
			
		||||
        await this.recupererFatigue(message);
 | 
			
		||||
        await this.$recupererFatigue(message);
 | 
			
		||||
      }
 | 
			
		||||
      else if (!this.system.sommeil?.insomnie) {
 | 
			
		||||
        await this.recupererFatigue(message);
 | 
			
		||||
        dormi.etat = await this.jetRecuperationReve(jetsReve, message);
 | 
			
		||||
        await this.$recupererFatigue(message);
 | 
			
		||||
        await this.$jetRecuperationReve(dormi, message);
 | 
			
		||||
        if (dormi.etat == 'dort' && EffetsDraconiques.isDonDoubleReve(this)) {
 | 
			
		||||
          dormi.etat = await this.jetRecuperationReve(jetsReve, message);
 | 
			
		||||
          dormi.etat = await this.$jetRecuperationReve(dormi, message);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
@@ -491,35 +492,36 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async jetRecuperationReve(jetsReve, message) {
 | 
			
		||||
  async $jetRecuperationReve(dormi, message) {
 | 
			
		||||
    if (this.getReveActuel() < this.system.reve.seuil.value) {
 | 
			
		||||
      let reve = await RdDDice.rollTotal("1dr");
 | 
			
		||||
      const reve = await RdDDice.rollTotal("1dr")
 | 
			
		||||
      if (reve >= 7) {
 | 
			
		||||
        // Rêve de Dragon !
 | 
			
		||||
        message.content += `Vous faites un <strong>Rêve de Dragon</strong> de ${reve} Points de rêve qui vous réveille! `;
 | 
			
		||||
        await this.combattreReveDeDragon(reve);
 | 
			
		||||
        jetsReve.push(-1);
 | 
			
		||||
        return 'eveil';
 | 
			
		||||
        dormi.jetsReve.push(-1);
 | 
			
		||||
        dormi.etat = 'eveil'
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        if (!ReglesOptionnelles.isUsing("recuperation-reve")) {
 | 
			
		||||
          ChatMessage.create({
 | 
			
		||||
            whisper: ChatUtility.getOwners(this),
 | 
			
		||||
            content: `Pas de récupération de rêve (${reve} points ignorés)`
 | 
			
		||||
          });
 | 
			
		||||
          jetsReve.push(0);
 | 
			
		||||
          })
 | 
			
		||||
          dormi.jetsReve.push(0)
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
          await this.reveActuelIncDec(reve);
 | 
			
		||||
          jetsReve.push(reve);
 | 
			
		||||
          await this.reveActuelIncDec(reve)
 | 
			
		||||
          dormi.jetsReve.push(reve)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return 'dort';
 | 
			
		||||
    dormi.etat = 'dort'
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _recupererEthylisme(message) {
 | 
			
		||||
  async $recupererEthylisme(message) {
 | 
			
		||||
    if (!ReglesOptionnelles.isUsing("recuperation-ethylisme")) { return; }
 | 
			
		||||
    let value = Math.min(Number.parseInt(this.system.compteurs.ethylisme.value) + 1, 1);
 | 
			
		||||
    if (value <= 0) {
 | 
			
		||||
@@ -541,7 +543,6 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
      max = Math.floor(max / 2);
 | 
			
		||||
    }
 | 
			
		||||
    const manquant = max - this.system.sante.endurance.value;
 | 
			
		||||
 | 
			
		||||
    if (manquant > 0) {
 | 
			
		||||
      await this.santeIncDec("endurance", manquant);
 | 
			
		||||
      message.content += `Vous récuperez ${manquant} points d'endurance. `;
 | 
			
		||||
@@ -549,15 +550,15 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async recupererFatigue(message) {
 | 
			
		||||
  async $recupererFatigue(message) {
 | 
			
		||||
    if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
 | 
			
		||||
      let fatigue = this.system.sante.fatigue.value;
 | 
			
		||||
      const fatigueMin = this.getFatigueMin();
 | 
			
		||||
      let fatigue = this.system.sante.fatigue.value
 | 
			
		||||
      const fatigueMin = this.getFatigueMin()
 | 
			
		||||
      if (fatigue <= fatigueMin) {
 | 
			
		||||
        return;
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      fatigue = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue));
 | 
			
		||||
      await this.update({ "system.sante.fatigue.value": fatigue });
 | 
			
		||||
      fatigue = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue))
 | 
			
		||||
      await this.update({ 'system.sante.fatigue.value': fatigue });
 | 
			
		||||
      if (fatigue == 0) {
 | 
			
		||||
        message.content += "Vous êtes complêtement reposé. ";
 | 
			
		||||
      }
 | 
			
		||||
@@ -1047,20 +1048,10 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async deleteRencontreTMRAtPosition() {
 | 
			
		||||
    const rencontreIds = this.itemTypes[ITEM_TYPES.rencontre].filter(this.filterRencontreTMRDemiReve()).map(it => it.id)
 | 
			
		||||
    if (rencontreIds.length > 0) {
 | 
			
		||||
      await this.deleteEmbeddedDocuments('Item', rencontreIds)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getRencontreTMREnAttente() {
 | 
			
		||||
    return this.itemTypes[ITEM_TYPES.rencontre].find(this.filterRencontreTMRDemiReve())
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  filterRencontreTMRDemiReve() {
 | 
			
		||||
    const position = this.getDemiReve()
 | 
			
		||||
    return it => it.system.coord == position
 | 
			
		||||
    return this.itemTypes[ITEM_TYPES.rencontre].find(it => it.system.coord == position)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -1800,8 +1791,10 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
    };
 | 
			
		||||
    RollDataAjustements.calcul(rollData, this);
 | 
			
		||||
    await RdDResolutionTable.rollData(rollData);
 | 
			
		||||
    this.gererExperience(rollData);
 | 
			
		||||
    await RdDRollResult.displayRollData(rollData, this)
 | 
			
		||||
 | 
			
		||||
    this.gererExperience(rollData);
 | 
			
		||||
 | 
			
		||||
    return rollData.rolled;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -2116,7 +2109,6 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
        label: "Jet de méditation",
 | 
			
		||||
        callbacks: [
 | 
			
		||||
          this.createCallbackExperience(),
 | 
			
		||||
          { condition: r => r.rolled.isEPart, action: r => this._meditationEPart(r) },
 | 
			
		||||
          { action: r => this._meditationResult(r) }
 | 
			
		||||
        ]
 | 
			
		||||
      });
 | 
			
		||||
@@ -2125,21 +2117,16 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _meditationResult(meditationRoll) {
 | 
			
		||||
    this.santeIncDec("fatigue", 2);
 | 
			
		||||
 | 
			
		||||
    if (meditationRoll.rolled.isSuccess) {
 | 
			
		||||
      await this.createEmbeddedDocuments("Item", [RdDItemSigneDraconique.prepareSigneDraconiqueMeditation(meditationRoll.meditation, meditationRoll.rolled)]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (meditationRoll.rolled.isEPart){
 | 
			
		||||
      await this.updateEmbeddedDocuments('Item', [{ _id: meditationRoll.meditation._id, 'system.malus': meditationRoll.meditation.system.malus - 1 }]);
 | 
			
		||||
    }
 | 
			
		||||
    await this.santeIncDec("fatigue", 2);
 | 
			
		||||
    await RdDRollResult.displayRollData(meditationRoll, this.name, 'chat-resultat-meditation.hbs');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _meditationEPart(meditationRoll) {
 | 
			
		||||
    this.updateEmbeddedDocuments('Item', [{ _id: meditationRoll.meditation._id, 'system.malus': meditationRoll.meditation.system.malus - 1 }]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _getSignesDraconiques(coord) {
 | 
			
		||||
    const type = TMRUtility.getTMRType(coord);
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,12 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getFatigueRestante() { return this.getFatigueMax() - this.getFatigueActuelle() }
 | 
			
		||||
  isCumulFatigueCauseSommeil(cumulFatigue){
 | 
			
		||||
    return ReglesOptionnelles.isUsing("appliquer-fatigue")
 | 
			
		||||
    ? (this.getFatigueRestante() <= cumulFatigue)
 | 
			
		||||
    : (this.getEnduranceActuelle() <= cumulFatigue)
 | 
			
		||||
  }
 | 
			
		||||
  getFatigueRestante() {return this.getFatigueMax() - this.getFatigueActuelle() }
 | 
			
		||||
  getFatigueMin() { return this.system.sante.endurance.max - this.system.sante.endurance.value }
 | 
			
		||||
 | 
			
		||||
  malusFatigue() {
 | 
			
		||||
 
 | 
			
		||||
@@ -123,10 +123,10 @@ export class RdDItemArme extends Item {
 | 
			
		||||
    if (defCategory == 'bouclier') {
 | 
			
		||||
      return 'norm'
 | 
			
		||||
    }
 | 
			
		||||
    if (armeAttaque.system.competence.toLowerCase().match(/(fléau)/)) {
 | 
			
		||||
    if (armeAttaque?.system?.competence?.toLowerCase().match(/(fléau)/)) {
 | 
			
		||||
      return ''
 | 
			
		||||
    }
 | 
			
		||||
    if (armeParade.system.tir) {
 | 
			
		||||
    if (armeParade.system?.tir) {
 | 
			
		||||
      return ''
 | 
			
		||||
    }
 | 
			
		||||
    const attCategory = RdDItemArme.getCategorieParade(armeAttaque)
 | 
			
		||||
 
 | 
			
		||||
@@ -56,6 +56,10 @@ export class RdDItemSort extends Item {
 | 
			
		||||
    return voies.map(voie => RdDItemCompetence.getVoieDraconic(competencesDraconic, voie))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static getBestDraconicSort(competencesDraconic, sort) {
 | 
			
		||||
    return  RdDItemSort.getDraconicsSort(competencesDraconic, sort).sort(Misc.descending(it => it.system.niveau)).find(it=>true)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static getOrdreCode(code) {
 | 
			
		||||
    return (VOIES_DRACONIC.find(it => it.code == code)?.ordre ?? '?')
 | 
			
		||||
  }
 | 
			
		||||
@@ -92,7 +96,7 @@ export class RdDItemSort extends Item {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  static isCoutVariable(sort) {
 | 
			
		||||
    return sort && (sort.system.ptreve.toLowerCase() == "variable" || sort.system.ptreve.indexOf("+") >= 0);
 | 
			
		||||
    return sort && !Number.isInteger(sort.system.ptreve) && (sort.system.ptreve.toLowerCase() == "variable" || sort.system.ptreve.indexOf("+") >= 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
 
 | 
			
		||||
@@ -265,7 +265,7 @@ export class Misc {
 | 
			
		||||
    const subset = elements.filter(options.preFilter)
 | 
			
		||||
      .filter(it => Grammar.toLowerCaseNoAccent(options.mapper(it))?.includes(value))
 | 
			
		||||
      .sort(Misc.ascending(it => options.mapper(it)))
 | 
			
		||||
    if (subset.length == 0) {
 | 
			
		||||
    if (subset.length == 0 && options?.onMessage) {
 | 
			
		||||
      options.onMessage(`Pas de ${options.description} correspondant à ${value}`);
 | 
			
		||||
    }
 | 
			
		||||
    return subset;
 | 
			
		||||
 
 | 
			
		||||
@@ -104,8 +104,8 @@ export class RdDPossession {
 | 
			
		||||
      rollData.selectedCarac = carac.reve
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      rollData.selectedCarac = rollingActor.system.carac.reve
 | 
			
		||||
      rollData.forceCarac = { 'reve-actuel': { label: "Rêve Actuel", value: rollingActor.getReveActuel() } }
 | 
			
		||||
      rollData.selectedCarac = rollData.forceCarac['reve-actuel']
 | 
			
		||||
      rollData.competence.system.defaut_carac = 'reve-actuel'
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -279,7 +279,7 @@ export class RdDRoll extends Dialog {
 | 
			
		||||
 | 
			
		||||
  async setSelectedSort(sort) {
 | 
			
		||||
    this.rollData.selectedSort = sort; // Update the selectedCarac
 | 
			
		||||
    this.rollData.competence = RdDItemCompetence.getVoieDraconic(this.rollData.draconicList, sort.system.draconic);
 | 
			
		||||
    this.rollData.competence = RdDItemSort.getBestDraconicSort(this.rollData.draconicList, sort)
 | 
			
		||||
    this.rollData.bonus = RdDItemSort.getCaseBonus(sort, this.rollData.tmr.coord);
 | 
			
		||||
    this.rollData.diffLibre = RdDItemSort.getDifficulte(sort, -7);
 | 
			
		||||
    RdDItemSort.setCoutReveReel(sort);
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@ import { ReglesOptionnelles } from "./settings/regles-optionnelles.js";
 | 
			
		||||
import { RdDDice } from "./rdd-dice.js";
 | 
			
		||||
import { STATUSES } from "./settings/status-effects.js";
 | 
			
		||||
import { RdDRencontre } from "./item/rencontre.js";
 | 
			
		||||
import { RdDTimestamp } from "./time/rdd-timestamp.js";
 | 
			
		||||
import { ITEM_TYPES } from "./constants.js";
 | 
			
		||||
import { Misc } from "./misc.js";
 | 
			
		||||
 | 
			
		||||
@@ -83,7 +82,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    this.subdialog = undefined
 | 
			
		||||
    this.displaySize = undefined
 | 
			
		||||
    if (!this.viewOnly && !game.user.isGM) {
 | 
			
		||||
      this._tellToGM(this.actor.name + " monte dans les terres médianes (" + tmrData.mode + ")");
 | 
			
		||||
      this.$tellToGM(this.actor.name + " monte dans les terres médianes (" + tmrData.mode + ")");
 | 
			
		||||
    }
 | 
			
		||||
    this.callbacksOnAnimate = [];
 | 
			
		||||
    const displaySize = TMR_DISPLAY_SIZE.clamp(game.settings.get(SYSTEM_RDD, TMR_DISPLAY_SIZE.code) ?? TMR_DISPLAY_SIZE.def);
 | 
			
		||||
@@ -139,7 +138,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    this.cumulFatigue += this.fatigueParCase;
 | 
			
		||||
 | 
			
		||||
    // Le reste...
 | 
			
		||||
    this.updateValuesDisplay();
 | 
			
		||||
    this.$updateValuesDisplay();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  lancerUnSort() {
 | 
			
		||||
@@ -190,7 +189,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
  forceTMRContinueAction() {
 | 
			
		||||
    ui.notifications.warn('Vous devez finir votre action avant de continuer dans les TMR');
 | 
			
		||||
    this.bringSubDialogToTop();
 | 
			
		||||
    return;
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setTMRPendingAction(dialog) {
 | 
			
		||||
@@ -297,7 +296,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    const coordOrig = this._getCoordActor();
 | 
			
		||||
    const coordTarget = TMRUtility.deplacement(coordOrig, move);
 | 
			
		||||
    await this._deplacerDemiReve(coordTarget, 'normal');
 | 
			
		||||
    this.checkQuitterTMR();
 | 
			
		||||
    await this.$checkQuitterTMR();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  calculCoutMonteeTMR() {
 | 
			
		||||
@@ -305,7 +304,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async updateValuesDisplay() {
 | 
			
		||||
  async $updateValuesDisplay() {
 | 
			
		||||
    if (this.viewOnly || !this.rendered) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
@@ -336,22 +335,30 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async close() {
 | 
			
		||||
    await this.$forceClose(this.actor.name + " a quitté les terres médianes")
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async $forceClose(message) {
 | 
			
		||||
    if (this.subdialog) {
 | 
			
		||||
      return this.forceTMRContinueAction()
 | 
			
		||||
      this.forceTMRContinueAction()
 | 
			
		||||
      return false
 | 
			
		||||
    }
 | 
			
		||||
    this.descenteTMR = true;
 | 
			
		||||
    if (this.actor.tmrApp) {
 | 
			
		||||
      this.actor.tmrApp = undefined; // Cleanup reference
 | 
			
		||||
      if (!this.viewOnly) {
 | 
			
		||||
        await this.actor.setEffect(STATUSES.StatusDemiReve, false)
 | 
			
		||||
        this._tellToGM(this.actor.name + " a quitté les terres médianes");
 | 
			
		||||
        await this.actor.setEffect(STATUSES.StatusDemiReve, false);
 | 
			
		||||
        this.$tellToUserAndGM(message)
 | 
			
		||||
      }
 | 
			
		||||
      await this.actor.santeIncDec((ReglesOptionnelles.isUsing("appliquer-fatigue") ? "fatigue" : "endurance"),
 | 
			
		||||
        this.cumulFatigue)
 | 
			
		||||
      const appliquerFatigue = ReglesOptionnelles.isUsing("appliquer-fatigue");
 | 
			
		||||
      await this.actor.santeIncDec(
 | 
			
		||||
        appliquerFatigue ? "fatigue" : "endurance",
 | 
			
		||||
        (appliquerFatigue ? 1 : -1) * this.cumulFatigue);
 | 
			
		||||
    }
 | 
			
		||||
    await super.close();
 | 
			
		||||
    this.pixiTMR.close()
 | 
			
		||||
    this.pixiTMR.close();
 | 
			
		||||
    this.pixiTMR = undefined
 | 
			
		||||
    await super.close();
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -363,48 +370,53 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    }
 | 
			
		||||
    switch (action) {
 | 
			
		||||
      case 'derober':
 | 
			
		||||
        await this.derober();
 | 
			
		||||
        this.restoreTMRAfterAction();
 | 
			
		||||
        return;
 | 
			
		||||
        await this.$derober()
 | 
			
		||||
        this.restoreTMRAfterAction()
 | 
			
		||||
        return
 | 
			
		||||
      case 'refouler':
 | 
			
		||||
        await this.refouler();
 | 
			
		||||
        break;
 | 
			
		||||
        await this.$refouler()
 | 
			
		||||
        break
 | 
			
		||||
      case 'maitriser':
 | 
			
		||||
        await this.maitriserRencontre();
 | 
			
		||||
        break;
 | 
			
		||||
        await this.$maitriserRencontre()
 | 
			
		||||
        break
 | 
			
		||||
      case 'ignorer':
 | 
			
		||||
        await this.ignorerRencontre();
 | 
			
		||||
        break;
 | 
			
		||||
        await this.$ignorerRencontre()
 | 
			
		||||
        break
 | 
			
		||||
    }
 | 
			
		||||
    await this.postRencontre(tmr);
 | 
			
		||||
    this.restoreTMRAfterAction();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async derober() {
 | 
			
		||||
    console.log("-> derober", this.currentRencontre);
 | 
			
		||||
    await this.actor.addTMRRencontre(this.currentRencontre);
 | 
			
		||||
    this._tellToGM(this.actor.name + " s'est dérobé et quitte les TMR.");
 | 
			
		||||
    this.close();
 | 
			
		||||
  async $derober() {
 | 
			
		||||
    if (this.currentRencontre) {
 | 
			
		||||
      console.log("-> derober", this.currentRencontre);
 | 
			
		||||
      await this.actor.addTMRRencontre(this.currentRencontre);
 | 
			
		||||
      this.$forceClose(`${this.actor.name} s'est dérobé face à la rencontre ${this.currentRencontre.name}, et quitte les TMR.`)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async refouler() {
 | 
			
		||||
    console.log("-> refouler", this.currentRencontre);
 | 
			
		||||
    await this.actor.ajouterRefoulement(this.currentRencontre.system.refoulement, `${this.currentRencontre.system.genre == 'f' ? 'une' : 'un'} ${this.currentRencontre.name}`);
 | 
			
		||||
    await this.actor.deleteRencontreTMRAtPosition()
 | 
			
		||||
    this.updateTokens();
 | 
			
		||||
    this.updateValuesDisplay();
 | 
			
		||||
    this.nettoyerRencontre();
 | 
			
		||||
  async $refouler() {
 | 
			
		||||
    if (this.currentRencontre) {
 | 
			
		||||
      console.log("-> refouler", this.currentRencontre);
 | 
			
		||||
      await this.actor.ajouterRefoulement(this.currentRencontre.system.refoulement, `${this.currentRencontre.system.genre == 'f' ? 'une' : 'un'} ${this.currentRencontre.name}`);
 | 
			
		||||
      await this.$deleteRencontreTMRAtPosition()
 | 
			
		||||
      this.updateTokens();
 | 
			
		||||
      this.$updateValuesDisplay();
 | 
			
		||||
      this.$nettoyerRencontre();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async ignorerRencontre() {
 | 
			
		||||
    console.log("-> ignorer", this.currentRencontre);
 | 
			
		||||
    this._tellToGM(this.actor.name + " a ignoré: " + this.currentRencontre.name);
 | 
			
		||||
    await this.actor.deleteRencontreTMRAtPosition()
 | 
			
		||||
    this.updateTokens();
 | 
			
		||||
    this.updateValuesDisplay();
 | 
			
		||||
    this.nettoyerRencontre();
 | 
			
		||||
  async $ignorerRencontre() {
 | 
			
		||||
    if (this.currentRencontre) {
 | 
			
		||||
      console.log("-> ignorer", this.currentRencontre);
 | 
			
		||||
      this.$tellToGM(this.actor.name + " a ignoré: " + this.currentRencontre.name);
 | 
			
		||||
      await this.$deleteRencontreTMRAtPosition()
 | 
			
		||||
      this.updateTokens();
 | 
			
		||||
      this.$updateValuesDisplay();
 | 
			
		||||
      this.$nettoyerRencontre();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -421,41 +433,29 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  checkQuitterTMR() {
 | 
			
		||||
    if (this.actor.isDead()) {
 | 
			
		||||
      this._tellToGM("Vous êtes mort : vous quittez les Terres médianes !");
 | 
			
		||||
      this.close();
 | 
			
		||||
      return true;
 | 
			
		||||
  async $checkQuitterTMR() {
 | 
			
		||||
    const reason = this.actor.isDead()
 | 
			
		||||
      ? "est mort"
 | 
			
		||||
      : this.actor.isCumulFatigueCauseSommeil(this.cumulFatigue)
 | 
			
		||||
        ? "s'écroule de fatigue"
 | 
			
		||||
        : (this.actor.getReveActuel() == 0)
 | 
			
		||||
          ? "tombe à 0 Points de Rêve"
 | 
			
		||||
          : undefined
 | 
			
		||||
    if (reason) {
 | 
			
		||||
      if (!this.actor.isDead()) {
 | 
			
		||||
        await this.$refouler()
 | 
			
		||||
      }
 | 
			
		||||
      this.$forceClose(`${this.actor.name} ${reason} et quitte les Terres médianes !`)
 | 
			
		||||
      return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (ReglesOptionnelles.isUsing("appliquer-fatigue")
 | 
			
		||||
      ? (this.actor.getFatigueRestante() <= this.cumulFatigue)
 | 
			
		||||
      : (this.actor.getEnduranceActuelle() <= this.cumulFatigue)
 | 
			
		||||
    ) {
 | 
			
		||||
      this._tellToGM("Vous vous écroulez de fatigue : vous quittez les Terres médianes !");
 | 
			
		||||
      this.quitterLesTMRInconscient();
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this.actor.getReveActuel() == 0) {
 | 
			
		||||
      this._tellToGM("Vos Points de Rêve sont à 0 : vous quittez les Terres médianes !");
 | 
			
		||||
      this.quitterLesTMRInconscient();
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async quitterLesTMRInconscient() {
 | 
			
		||||
    await this.refouler();
 | 
			
		||||
    this.close();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async maitriserRencontre() {
 | 
			
		||||
  async $maitriserRencontre() {
 | 
			
		||||
    console.log("-> maitriser", this.currentRencontre);
 | 
			
		||||
 | 
			
		||||
    await this.actor.deleteRencontreTMRAtPosition()
 | 
			
		||||
    await this.$deleteRencontreTMRAtPosition();
 | 
			
		||||
    this.updateTokens();
 | 
			
		||||
 | 
			
		||||
    let rencontreData = {
 | 
			
		||||
@@ -470,11 +470,21 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
      tmr: TMRUtility.getTMR(this._getCoordActor())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    await this._tentativeMaitrise(rencontreData);
 | 
			
		||||
    await this.$tentativeMaitrise(rencontreData);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async $deleteRencontreTMRAtPosition() {
 | 
			
		||||
    const position = this.actor.getDemiReve()
 | 
			
		||||
    const rencontreIds = this.actor.itemTypes[ITEM_TYPES.rencontre]
 | 
			
		||||
      .filter(it => it.system.coord == position)
 | 
			
		||||
      .map(it => it.id)
 | 
			
		||||
    if (rencontreIds.length > 0) {
 | 
			
		||||
      await this.actor.deleteEmbeddedDocuments('Item', rencontreIds)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _tentativeMaitrise(rencData) {
 | 
			
		||||
  async $tentativeMaitrise(rencData) {
 | 
			
		||||
    this.rencontreState = 'normal';
 | 
			
		||||
 | 
			
		||||
    rencData.reve = this.actor.getReveActuel();
 | 
			
		||||
@@ -483,7 +493,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    RollDataAjustements.calcul(rencData, this.actor);
 | 
			
		||||
 | 
			
		||||
    rencData.rolled = rencData.presentCite
 | 
			
		||||
      ? this._rollPresentCite(rencData)
 | 
			
		||||
      ? this.$rollPresentCite(rencData)
 | 
			
		||||
      : await RdDResolutionTable.roll(rencData.reve, RollDataAjustements.sum(rencData.ajustements));
 | 
			
		||||
 | 
			
		||||
    const result = rencData.rolled.isSuccess
 | 
			
		||||
@@ -493,38 +503,41 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    await RdDRencontre.appliquer(result.effets, this, rencData);
 | 
			
		||||
 | 
			
		||||
    rencData.poesie = { extrait: result.poesie, reference: result.reference };
 | 
			
		||||
    rencData.message = this.formatMessageRencontre(rencData, result.message);
 | 
			
		||||
    rencData.message = this.$formatMessageRencontre(rencData, result.message);
 | 
			
		||||
 | 
			
		||||
    ChatMessage.create({
 | 
			
		||||
      whisper: ChatUtility.getOwners(this.actor),
 | 
			
		||||
      content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-rencontre-tmr.hbs`, rencData)
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    this.updateValuesDisplay();
 | 
			
		||||
    if (this.checkQuitterTMR()) {
 | 
			
		||||
    this.$updateValuesDisplay();
 | 
			
		||||
    if (await this.$checkQuitterTMR()) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    if (this.rencontreState == 'persistant') {
 | 
			
		||||
      this._nouvelleTentativeMaitrise(rencData);
 | 
			
		||||
      this.$nouvelleTentativeMaitrise(rencData);
 | 
			
		||||
    }
 | 
			
		||||
    else if (!this.isRencontreDeplacement()) {
 | 
			
		||||
      this.nettoyerRencontre();
 | 
			
		||||
      this.$nettoyerRencontre();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _nouvelleTentativeMaitrise(rencData) {
 | 
			
		||||
  $nouvelleTentativeMaitrise(rencData) {
 | 
			
		||||
    setTimeout(() => {
 | 
			
		||||
      // TODO: remplacer par une boucle while(this.currentRencontre) ?
 | 
			
		||||
      /**
 | 
			
		||||
       * TODO: remplacer par une boucle while(this.currentRencontre) ?
 | 
			
		||||
       * ajouter un moyen d'attendre la saisie de l'utilisateur (jet obligatoire)?
 | 
			
		||||
       */
 | 
			
		||||
      rencData.nbRounds++;
 | 
			
		||||
      if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
 | 
			
		||||
        this.cumulFatigue += this.fatigueParCase;
 | 
			
		||||
      }
 | 
			
		||||
      this._tentativeMaitrise(rencData);
 | 
			
		||||
      this._deleteTmrMessages(rencData.actor, rencData.nbRounds);
 | 
			
		||||
      this.$tentativeMaitrise(rencData);
 | 
			
		||||
      this.$deleteTmrMessages(rencData.actor, rencData.nbRounds);
 | 
			
		||||
    }, 2000);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  formatMessageRencontre(rencData, template) {
 | 
			
		||||
  $formatMessageRencontre(rencData, template) {
 | 
			
		||||
    let messageDuree = ''
 | 
			
		||||
    if (rencData.nbRounds > 1) {
 | 
			
		||||
      if (rencData.rolled.isSuccess) {
 | 
			
		||||
@@ -543,7 +556,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _rollPresentCite(rencData) {
 | 
			
		||||
  $rollPresentCite(rencData) {
 | 
			
		||||
    let rolled = RdDResolutionTable.computeChances(rencData.reve, 0);
 | 
			
		||||
    foundry.utils.mergeObject(rolled, { caracValue: rencData.reve, finalLevel: 0, roll: rolled.score });
 | 
			
		||||
    RdDResolutionTable.succesRequis(rolled);
 | 
			
		||||
@@ -551,7 +564,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _deleteTmrMessages(actor, nbRounds = -1) {
 | 
			
		||||
  $deleteTmrMessages(actor, nbRounds = -1) {
 | 
			
		||||
    setTimeout(() => {
 | 
			
		||||
      if (nbRounds < 0) {
 | 
			
		||||
        ChatUtility.removeChatMessageContaining(`<h4 data-categorie="tmr" data-actor-id="${actor._id}"`);
 | 
			
		||||
@@ -570,7 +583,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _tellToGM(message) {
 | 
			
		||||
  $tellToGM(message) {
 | 
			
		||||
    ChatMessage.create({
 | 
			
		||||
      user: game.user.id,
 | 
			
		||||
      content: message,
 | 
			
		||||
@@ -579,7 +592,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  _tellToUserAndGM(message) {
 | 
			
		||||
  $tellToUserAndGM(message) {
 | 
			
		||||
    ChatMessage.create({
 | 
			
		||||
      user: game.user.id,
 | 
			
		||||
      content: message,
 | 
			
		||||
@@ -601,7 +614,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    if (this.currentRencontre) {
 | 
			
		||||
      if (this.rencontresExistantes.find(it => it.id == this.currentRencontre.id)) {
 | 
			
		||||
        // rencontre en attente suite à dérobade
 | 
			
		||||
        await this.maitriserRencontre();
 | 
			
		||||
        await this.$maitriserRencontre();
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        const dialog = new RdDTMRRencontreDialog(this.actor, this.currentRencontre, tmr);
 | 
			
		||||
@@ -648,7 +661,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
      tmr: tmr,
 | 
			
		||||
      presentCite: presentCite
 | 
			
		||||
    };
 | 
			
		||||
    await this._tentativeMaitrise(rencontreData);
 | 
			
		||||
    await this.$tentativeMaitrise(rencontreData);
 | 
			
		||||
    this.postRencontre(tmr);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -727,7 +740,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
      content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.hbs`, rollData)
 | 
			
		||||
    });
 | 
			
		||||
    if (rollData.rolled.isEchec) {
 | 
			
		||||
      await this.close();
 | 
			
		||||
      await this.$forceClose(`n'a pas maîtrisé la case ${rollData.tmr.label} et quitte les terres médianes`)
 | 
			
		||||
    }
 | 
			
		||||
    await this.souffleSiEchecTotal(rollData);
 | 
			
		||||
  }
 | 
			
		||||
@@ -782,7 +795,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
        onConqueteReussie: r => EffetsDraconiques.fermetureCites.onVisiteSupprimer(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)),
 | 
			
		||||
        onConqueteEchec: r => {
 | 
			
		||||
          this.souffleSiEchecTotal(rollData);
 | 
			
		||||
          this.close()
 | 
			
		||||
          this.$forceClose(`${this.actor.name} n'a pas maîtrisé la ${tmr.label}, et quitte les TMR.`)
 | 
			
		||||
        },
 | 
			
		||||
        canClose: false
 | 
			
		||||
      });
 | 
			
		||||
@@ -797,7 +810,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
        onConqueteReussie: r => EffetsDraconiques.periple.onVisiteSupprimer(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)),
 | 
			
		||||
        onConqueteEchec: r => {
 | 
			
		||||
          this.souffleSiEchecTotal(rollData);
 | 
			
		||||
          this.close()
 | 
			
		||||
          this.$forceClose(`${this.actor.name} n'a pas purifié la ${tmr.label}, et quitte les TMR.`)
 | 
			
		||||
        },
 | 
			
		||||
        canClose: false
 | 
			
		||||
      });
 | 
			
		||||
@@ -811,7 +824,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
        difficulte: -7,
 | 
			
		||||
        action: 'Conquérir',
 | 
			
		||||
        onConqueteReussie: r => EffetsDraconiques.conquete.onVisiteSupprimer(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)),
 | 
			
		||||
        onConqueteEchec: r => this.close(),
 | 
			
		||||
        onConqueteEchec: r => this.$forceClose(`${this.actor.name} n'a pas conquis la case ${tmr.label}, et quitte les TMR.`),
 | 
			
		||||
        canClose: false
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
@@ -922,19 +935,15 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async processSortReserve(sortReserve) {
 | 
			
		||||
    await this.actor.deleteEmbeddedDocuments('Item', [sortReserve.id]);
 | 
			
		||||
    console.log("declencheSortEnReserve", sortReserve);
 | 
			
		||||
    const heureCible = RdDTimestamp.definition(sortReserve.system.heurecible).label;
 | 
			
		||||
    this._tellToUserAndGM(`Vous avez déclenché 
 | 
			
		||||
        ${sortReserve.system.echectotal ? "<strong>l'échec total!</strong>" : "le sort"}
 | 
			
		||||
        en réserve <strong>${sortReserve.name}</strong>
 | 
			
		||||
        avec ${sortReserve.system.ptreve} points de Rêve
 | 
			
		||||
        en ${sortReserve.system.coord} (${TMRUtility.getTMRLabel(sortReserve.system.coord)}).
 | 
			
		||||
        L'heure ciblée est ${heureCible}`);
 | 
			
		||||
    this.close();
 | 
			
		||||
    console.log("declencheSortEnReserve", sortReserve)
 | 
			
		||||
    const sort = sortReserve.system.sortid ? this.actor.items.get(sortReserve.system.sortid) : undefined
 | 
			
		||||
    const message = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-lancement-sortreserve.hbs`,
 | 
			
		||||
      { sortReserve, sort })
 | 
			
		||||
    await this.$forceClose(message)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  nettoyerRencontre() {
 | 
			
		||||
  $nettoyerRencontre() {
 | 
			
		||||
    // Suppression des dessins des zones possibles
 | 
			
		||||
    this.currentRencontre?.graphics?.forEach(graphic => this.pixiTMR.removeGraphic(graphic))
 | 
			
		||||
    // Nettoyage de la structureet de l'état
 | 
			
		||||
@@ -1021,7 +1030,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
        console.log("STATUS :", this.rencontreState, this.currentRencontre);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.checkQuitterTMR();
 | 
			
		||||
    await this.$checkQuitterTMR();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -1054,13 +1063,13 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    */
 | 
			
		||||
    this.notifierResonanceSigneDraconique(targetCoord);
 | 
			
		||||
    await this.actor.rollUnSort(targetCoord);
 | 
			
		||||
    this.nettoyerRencontre();
 | 
			
		||||
    this.$nettoyerRencontre();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  externalRefresh() {
 | 
			
		||||
    this.createPixiSprites();
 | 
			
		||||
    this.updateValuesDisplay();
 | 
			
		||||
    this.$updateValuesDisplay();
 | 
			
		||||
    this.updateTokens();
 | 
			
		||||
    console.log("TMR REFRESHED !!!");
 | 
			
		||||
  }
 | 
			
		||||
@@ -1071,7 +1080,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
      return this.forceTMRContinueAction()
 | 
			
		||||
    }
 | 
			
		||||
    if (this.currentRencontre != 'normal') {
 | 
			
		||||
      this.nettoyerRencontre();
 | 
			
		||||
      this.$nettoyerRencontre();
 | 
			
		||||
    }
 | 
			
		||||
    let tmr = TMRUtility.getTMR(targetCoord);
 | 
			
		||||
    // Gestion cases spéciales type Trou noir, etc
 | 
			
		||||
@@ -1083,7 +1092,7 @@ export class RdDTMRDialog extends Dialog {
 | 
			
		||||
    if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
 | 
			
		||||
      this.cumulFatigue += this.fatigueParCase;
 | 
			
		||||
    }
 | 
			
		||||
    this.updateValuesDisplay();
 | 
			
		||||
    this.$updateValuesDisplay();
 | 
			
		||||
    this.actor.notifyRefreshTMR();
 | 
			
		||||
 | 
			
		||||
    if (deplacementType == 'normal') { // Pas de rencontres après un saut de type passeur/changeur/...
 | 
			
		||||
 
 | 
			
		||||
@@ -318,6 +318,7 @@ export class RdDUtility {
 | 
			
		||||
    // gestion des dates et heures
 | 
			
		||||
    Handlebars.registerHelper('timestamp-imgSigneHeure', (heure) => { return new Handlebars.SafeString(RdDTimestamp.imgSigneHeure(heure)) });
 | 
			
		||||
    Handlebars.registerHelper('timestamp-imgSigne', (heure) => { return new Handlebars.SafeString(RdDTimestamp.imgSigne(heure)) });
 | 
			
		||||
    Handlebars.registerHelper('timestamp-definition', (heure) => RdDTimestamp.definition(heure))
 | 
			
		||||
    Handlebars.registerHelper('timestamp-extract', timestamp => new RdDTimestamp(timestamp).toCalendrier());
 | 
			
		||||
    Handlebars.registerHelper('timestamp-formulesDuree', () => RdDTimestamp.formulesDuree());
 | 
			
		||||
    Handlebars.registerHelper('timestamp-formulesPeriode', () => RdDTimestamp.formulesPeriode());
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
{
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "build": "npx vite build",
 | 
			
		||||
    "run": "npx vite serve",
 | 
			
		||||
    "packCompendiumsToDist": "node ./tools/packCompendiumsToDist.mjs",
 | 
			
		||||
    "packCompendiumsToPublic": "node ./tools/packCompendiumsToPublic.mjs",
 | 
			
		||||
    "unpackCompendiumsFromPublic": "node ./tools/unpackCompendiumsFromPublic.mjs"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
{
 | 
			
		||||
  "id": "foundryvtt-reve-de-dragon",
 | 
			
		||||
  "title": "Rêve de Dragon",
 | 
			
		||||
  "version": "12.0.42",
 | 
			
		||||
  "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/releases/download/12.0.42/rddsystem.zip",
 | 
			
		||||
  "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/releases/download/12.0.42/system.json",
 | 
			
		||||
  "version": "12.0.44",
 | 
			
		||||
  "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/releases/download/12.0.44/rddsystem.zip",
 | 
			
		||||
  "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/releases/download/12.0.44/system.json",
 | 
			
		||||
  "changelog": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md",
 | 
			
		||||
  "compatibility": {
 | 
			
		||||
    "minimum": "11",
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,7 @@
 | 
			
		||||
    <a class="chat-card-button forcer-tmr-aleatoire" data-tooltip="Ré-insérer aléatoirement le demi-rêve, et masquer la position au joueur">Ré-insertion aléatoire</a>
 | 
			
		||||
  </span>
 | 
			
		||||
  <span>
 | 
			
		||||
    <a class="chat-card-button afficher-tmr"
 | 
			
		||||
      data-tooltip="{{#if hautreve.cacheTMR}}Montrer la position du demi-rêve au joueur{{else}}Cacher la position du demi-rêve au joueur{{/if}}">{{#if hautreve.cacheTMR}}Montrer les TMR{{else}}Cacher les TMR{{/if}}</a>
 | 
			
		||||
    <a class="chat-card-button afficher-tmr" data-tooltip="{{#if hautreve.cacheTMR}}Révéler la position du demi-rêve au joueur{{else}}Cacher la position du demi-rêve au joueur{{/if}}">{{#if hautreve.cacheTMR}}Révéler le demi-rêve{{else}}Cacher le demi-rêve{{/if}}</a>
 | 
			
		||||
  </span>
 | 
			
		||||
</li>
 | 
			
		||||
{{/if}}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								templates/chat-lancement-sortreserve.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								templates/chat-lancement-sortreserve.hbs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
<img class="chat-icon" src="{{sortReserve.img}}" data-tooltip="{{sortReserve.name}}"/>
 | 
			
		||||
<p> Vous avez déclenché 
 | 
			
		||||
  {{#if sortReserve.system.echectotal}}<strong>l'échec total</strong>{{else}}le sort{{/if}}
 | 
			
		||||
  en réserve
 | 
			
		||||
<strong>{{sortReserve.name}}</strong>
 | 
			
		||||
        avec {{sortReserve.system.ptreve}} points de Rêve
 | 
			
		||||
        en {{sortReserve.system.coord}} ({{caseTmr-label sortReserve.system.coord}}).
 | 
			
		||||
        L'heure ciblée est {{sortReserve.system.heurecible}}
 | 
			
		||||
        {{timestamp-imgSigneHeure sortReserve.system.heurecible}}
 | 
			
		||||
</p>
 | 
			
		||||
{{#if sort}}
 | 
			
		||||
<div class="poesie-extrait poesie-overflow">
 | 
			
		||||
  {{{sort.system.description}}}
 | 
			
		||||
</div>
 | 
			
		||||
{{/if}}
 | 
			
		||||
		Reference in New Issue
	
	Block a user