Version 12.0.18 - A la barbe d'Astrobazzarh #719
@@ -2,6 +2,7 @@
 | 
				
			|||||||
## 12.0.16 - Le secret d'Astrobazzarh
 | 
					## 12.0.16 - Le secret d'Astrobazzarh
 | 
				
			||||||
- Fix: les jets envoyés messages uniquement au MJ ne sont plus envoyés à tous les autres joueurs (et dupliqués)
 | 
					- Fix: les jets envoyés messages uniquement au MJ ne sont plus envoyés à tous les autres joueurs (et dupliqués)
 | 
				
			||||||
- Les noms affichés dans les automatisations de combat sont maintenant ceux des tokens plutôt que ceux des acteurs
 | 
					- Les noms affichés dans les automatisations de combat sont maintenant ceux des tokens plutôt que ceux des acteurs
 | 
				
			||||||
 | 
					- Ajout d'une option pour la localisation des blessures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 12.0.15 - Le messager d'Astrobazzarh
 | 
					## 12.0.15 - Le messager d'Astrobazzarh
 | 
				
			||||||
- Correction des faces de dés personalisés dice-so-nice
 | 
					- Correction des faces de dés personalisés dice-so-nice
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -415,41 +415,40 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
				
			|||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async encaisser() { await RdDEncaisser.encaisser(this) }
 | 
					  async encaisser() { await RdDEncaisser.encaisser(this) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async encaisserDommages(rollData, attacker = undefined, show = undefined) {
 | 
					  async encaisserDommages(rollData, attacker = undefined, attackerToken = undefined,  show = undefined) {
 | 
				
			||||||
    if (attacker && !await attacker.accorder(this, 'avant-encaissement')) {
 | 
					    if (attacker && !await attacker.accorder(this, 'avant-encaissement')) {
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    const armure = await this.computeArmure(rollData);
 | 
					    const armure = await this.computeArmure(rollData);
 | 
				
			||||||
    if (ReglesOptionnelles.isUsing('validation-encaissement-gr')) {
 | 
					    if (ReglesOptionnelles.isUsing('validation-encaissement-gr')) {
 | 
				
			||||||
      await this.encaisserDommagesValidationGR(rollData, armure, attacker?.id, show);
 | 
					      await this.encaisserDommagesValidationGR(rollData, armure, attackerToken, show);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
      const jet = await RdDUtility.jetEncaissement(rollData, armure, { showDice: SHOW_DICE });
 | 
					      const jet = await RdDUtility.jetEncaissement(this, rollData, armure, { showDice: SHOW_DICE });
 | 
				
			||||||
      await this.$onEncaissement(jet, show, attacker);
 | 
					      await this.$onEncaissement(jet, show, attackerToken)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async encaisserDommagesValidationGR(rollData, armure, attackerId, show) {
 | 
					  async encaisserDommagesValidationGR(rollData, armure, attackerToken, show) {
 | 
				
			||||||
    if (!game.user.isGM) {
 | 
					    if (!game.user.isGM) {
 | 
				
			||||||
      RdDBaseActor.remoteActorCall({
 | 
					      RdDBaseActor.remoteActorCall({
 | 
				
			||||||
        tokenId: this.token?.id,
 | 
					        tokenId: this.token?.id,
 | 
				
			||||||
        actorId: this.id,
 | 
					        actorId: this.id,
 | 
				
			||||||
        method: 'encaisserDommagesValidationGR',
 | 
					        method: 'encaisserDommagesValidationGR',
 | 
				
			||||||
        args: [rollData, armure, attackerId, show]
 | 
					        args: [rollData, armure, attackerToken, show]
 | 
				
			||||||
      });
 | 
					      })
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      const attacker = game.actors.get(attackerId);
 | 
					 | 
				
			||||||
      DialogValidationEncaissement.validerEncaissement(this, rollData, armure,
 | 
					      DialogValidationEncaissement.validerEncaissement(this, rollData, armure,
 | 
				
			||||||
        jet => this.$onEncaissement(jet, show, attacker));
 | 
					        jet => this.$onEncaissement(jet, show, attackerToken));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async $onEncaissement(jet, show, attacker) {
 | 
					  async $onEncaissement(jet, show, attackerToken) {
 | 
				
			||||||
    await this.onAppliquerJetEncaissement(jet, attacker);
 | 
					    await this.onAppliquerJetEncaissement(jet, attackerToken);
 | 
				
			||||||
    await this.$afficherEncaissement(jet, show);
 | 
					    await this.$afficherEncaissement(jet, show);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async onAppliquerJetEncaissement(encaissement, attacker) { }
 | 
					  async onAppliquerJetEncaissement(encaissement, attackerToken) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async $afficherEncaissement(encaissement, show) {
 | 
					  async $afficherEncaissement(encaissement, show) {
 | 
				
			||||||
    foundry.utils.mergeObject(encaissement, {
 | 
					    foundry.utils.mergeObject(encaissement, {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -89,9 +89,9 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async onAppliquerJetEncaissement(encaissement, attacker) {
 | 
					  async onAppliquerJetEncaissement(encaissement, attackerToken) {
 | 
				
			||||||
    const santeOrig = foundry.utils.duplicate(this.system.sante);
 | 
					    const santeOrig = foundry.utils.duplicate(this.system.sante);
 | 
				
			||||||
    const blessure = await this.ajouterBlessure(encaissement, attacker); // Will update the result table
 | 
					    const blessure = await this.ajouterBlessure(encaissement, attackerToken); // Will update the result table
 | 
				
			||||||
    const perteVie = await this.santeIncDec("vie", -encaissement.vie);
 | 
					    const perteVie = await this.santeIncDec("vie", -encaissement.vie);
 | 
				
			||||||
    const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, blessure?.isCritique());
 | 
					    const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, blessure?.isCritique());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -169,7 +169,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async ajouterBlessure(encaissement, attacker = undefined) {
 | 
					  async ajouterBlessure(encaissement, attackerToken = undefined) {
 | 
				
			||||||
    if (encaissement.gravite < 0) return;
 | 
					    if (encaissement.gravite < 0) return;
 | 
				
			||||||
    if (encaissement.gravite > 0) {
 | 
					    if (encaissement.gravite > 0) {
 | 
				
			||||||
      while (this.countBlessures(it => it.system.gravite == encaissement.gravite) >= RdDItemBlessure.maxBlessures(encaissement.gravite) && encaissement.gravite <= 6) {
 | 
					      while (this.countBlessures(it => it.system.gravite == encaissement.gravite) >= RdDItemBlessure.maxBlessures(encaissement.gravite) && encaissement.gravite <= 6) {
 | 
				
			||||||
@@ -181,7 +181,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    const endActuelle = this.getEnduranceActuelle();
 | 
					    const endActuelle = this.getEnduranceActuelle();
 | 
				
			||||||
    const blessure = await RdDItemBlessure.createBlessure(this, encaissement.gravite, encaissement.dmg?.loc.label ?? '', attacker);
 | 
					    const blessure = await RdDItemBlessure.createBlessure(this, encaissement.gravite, encaissement.dmg?.loc.label ?? '', attackerToken);
 | 
				
			||||||
    if (blessure.isCritique()) {
 | 
					    if (blessure.isCritique()) {
 | 
				
			||||||
      encaissement.endurance = endActuelle;
 | 
					      encaissement.endurance = endActuelle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,7 +74,7 @@ export class RdDEntite extends RdDBaseActorReve {
 | 
				
			|||||||
    return [STATUSES.StatusComma].includes(effectId);
 | 
					    return [STATUSES.StatusComma].includes(effectId);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async onAppliquerJetEncaissement(encaissement, attacker) {
 | 
					  async onAppliquerJetEncaissement(encaissement, attackerToken) {
 | 
				
			||||||
    const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance);
 | 
					    const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance);
 | 
				
			||||||
    foundry.utils.mergeObject(encaissement, {
 | 
					    foundry.utils.mergeObject(encaissement, {
 | 
				
			||||||
      resteEndurance: perteEndurance.newValue,
 | 
					      resteEndurance: perteEndurance.newValue,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,14 +8,13 @@ import { RdDUtility } from "./rdd-utility.js";
 | 
				
			|||||||
export class DialogValidationEncaissement extends Dialog {
 | 
					export class DialogValidationEncaissement extends Dialog {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static async validerEncaissement(actor, rollData, armure, onEncaisser) {
 | 
					  static async validerEncaissement(actor, rollData, armure, onEncaisser) {
 | 
				
			||||||
    let encaissement = await RdDUtility.jetEncaissement(rollData, armure, { showDice: HIDE_DICE });
 | 
					    const encaissement = await RdDUtility.jetEncaissement(actor, rollData, armure, { showDice: HIDE_DICE });
 | 
				
			||||||
    const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-validation-encaissement.html', {
 | 
					    const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-validation-encaissement.html', {
 | 
				
			||||||
      actor: actor,
 | 
					      actor: actor,
 | 
				
			||||||
      rollData: rollData,
 | 
					      rollData: rollData,
 | 
				
			||||||
      encaissement: encaissement
 | 
					      encaissement: encaissement
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    const dialog = new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, onEncaisser);
 | 
					    new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, onEncaisser).render(true);
 | 
				
			||||||
    dialog.render(true);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
@@ -56,14 +55,14 @@ export class DialogValidationEncaissement extends Dialog {
 | 
				
			|||||||
    this.html = html;
 | 
					    this.html = html;
 | 
				
			||||||
    this.html.find('input.encaissement-roll-result').keyup(async event => {
 | 
					    this.html.find('input.encaissement-roll-result').keyup(async event => {
 | 
				
			||||||
      this.forceDiceResult.total = event.currentTarget.value;
 | 
					      this.forceDiceResult.total = event.currentTarget.value;
 | 
				
			||||||
      this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: HIDE_DICE, forceDiceResult: this.forceDiceResult});
 | 
					      this.encaissement = await RdDUtility.jetEncaissement(this.actor, this.rollData, this.armure, { showDice: HIDE_DICE, forceDiceResult: this.forceDiceResult});
 | 
				
			||||||
      this.html.find('label.encaissement-total').text(this.encaissement.total);
 | 
					      this.html.find('label.encaissement-total').text(this.encaissement.total);
 | 
				
			||||||
      this.html.find('label.encaissement-blessure').text(this.encaissement.blessures)
 | 
					      this.html.find('label.encaissement-blessure').text(this.encaissement.blessures)
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async onValider() {
 | 
					  async onValider() {
 | 
				
			||||||
    this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: SHOW_DICE, forceDiceResult: this.forceDiceResult});
 | 
					    this.encaissement = await RdDUtility.jetEncaissement(this.actor, this.rollData, this.armure, { showDice: SHOW_DICE, forceDiceResult: this.forceDiceResult});
 | 
				
			||||||
    this.onEncaisser(this.encaissement)
 | 
					    this.onEncaisser(this.encaissement)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -496,24 +496,24 @@ export class RdDCombat {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  static onMsgEncaisser(msg) {
 | 
					  static onMsgEncaisser(msg) {
 | 
				
			||||||
    let defender = canvas.tokens.get(msg.defenderTokenId).actor;
 | 
					 | 
				
			||||||
    if (Misc.isOwnerPlayerOrUniqueConnectedGM()) {
 | 
					    if (Misc.isOwnerPlayerOrUniqueConnectedGM()) {
 | 
				
			||||||
      let attackerRoll = msg.attackerRoll;
 | 
					      let attackerRoll = msg.attackerRoll;
 | 
				
			||||||
      let attacker = msg.attackerId ? game.actors.get(msg.attackerId) : undefined;
 | 
					      let attacker = msg.attackerId ? game.actors.get(msg.attackerId) : undefined;
 | 
				
			||||||
 | 
					      let defender = canvas.tokens.get(msg.defenderToken.id).actor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      defender.encaisserDommages(attackerRoll, attacker);
 | 
					      defender.encaisserDommages(attackerRoll, attacker, msg.attackerToken);
 | 
				
			||||||
      const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.attackerTokenId, msg.defenderTokenId);
 | 
					      const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.attackerToken.id, msg.defenderToken.id);
 | 
				
			||||||
      rddCombat?.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
 | 
					      rddCombat?.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  static onMsgDefense(msg) {
 | 
					  static onMsgDefense(msg) {
 | 
				
			||||||
    let defenderToken = canvas.tokens.get(msg.defenderTokenId);
 | 
					    let defenderToken = canvas.tokens.get(msg.defenderToken.id)
 | 
				
			||||||
    if (defenderToken && Misc.isFirstConnectedGM()) {
 | 
					    if (defenderToken && Misc.isFirstConnectedGM()) {
 | 
				
			||||||
      const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.attackerTokenId, msg.defenderTokenId);
 | 
					      const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.attackerToken.id, msg.defenderToken.id)
 | 
				
			||||||
      rddCombat?.removeChatMessageActionsPasseArme(msg.defenderRoll.passeArme);
 | 
					      rddCombat?.removeChatMessageActionsPasseArme(msg.defenderRoll.passeArme)
 | 
				
			||||||
      rddCombat?._chatMessageDefense(msg.paramChatDefense, msg.defenderRoll);
 | 
					      rddCombat?._chatMessageDefense(msg.paramChatDefense, msg.defenderRoll)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -568,19 +568,21 @@ export class RdDCombat {
 | 
				
			|||||||
    this.defenderId = this.defender.id
 | 
					    this.defenderId = this.defender.id
 | 
				
			||||||
    this.attackerTokenId = attackerTokenId
 | 
					    this.attackerTokenId = attackerTokenId
 | 
				
			||||||
    this.defenderTokenId = defenderTokenId
 | 
					    this.defenderTokenId = defenderTokenId
 | 
				
			||||||
 | 
					    this.attackerToken = RdDCombat.$extractAttackerTokenData(attacker, attackerTokenId)
 | 
				
			||||||
 | 
					    this.defenderToken = RdDCombat.$extractDefenderTokenData(defender, defenderTokenId, target)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _extractDefenderTokenData() {
 | 
					  static $extractAttackerTokenData(attacker, attackerTokenId) {
 | 
				
			||||||
    if (this.target) {
 | 
					    const token = canvas.tokens.get(attackerTokenId);
 | 
				
			||||||
      return Targets.extractTokenData(this.target)
 | 
					    return token ? Targets.extractTokenData(token) : Targets.buildActorTokenData(attackerTokenId, attacker) 
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  static $extractDefenderTokenData(defender, defenderTokenId, target) {
 | 
				
			||||||
 | 
					    if (target) {
 | 
				
			||||||
 | 
					      return Targets.extractTokenData(target)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    const token = canvas.tokens.get(this.defenderTokenId);
 | 
					    const token = canvas.tokens.get(defenderTokenId);
 | 
				
			||||||
    return token ? Targets.extractTokenData(token) : Targets.buildActorTokenData(this.defenderTokenId, this.defender) 
 | 
					    return token ? Targets.extractTokenData(token) : Targets.buildActorTokenData(defenderTokenId, defender) 
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  _extractAttackerTokenData(){
 | 
					 | 
				
			||||||
    const token = canvas.tokens.get(this.attackerTokenId);
 | 
					 | 
				
			||||||
    return token ? Targets.extractTokenData(token) : Targets.buildActorTokenData(this.attackerTokenId, this.attacker) 
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -590,7 +592,6 @@ export class RdDCombat {
 | 
				
			|||||||
    const defenderRoll = ChatUtility.getMessageData(chatMessage, 'defender-roll');
 | 
					    const defenderRoll = ChatUtility.getMessageData(chatMessage, 'defender-roll');
 | 
				
			||||||
    const attackerRoll = defenderRoll?.attackerRoll ?? ChatUtility.getMessageData(chatMessage, 'attacker-roll');
 | 
					    const attackerRoll = defenderRoll?.attackerRoll ?? ChatUtility.getMessageData(chatMessage, 'attacker-roll');
 | 
				
			||||||
    console.log('RdDCombat', attackerRoll, defenderRoll);
 | 
					    console.log('RdDCombat', attackerRoll, defenderRoll);
 | 
				
			||||||
    const defenderTokenId = event.currentTarget.attributes['data-defenderTokenId']?.value;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const armeParadeId = event.currentTarget.attributes['data-armeid']?.value;
 | 
					    const armeParadeId = event.currentTarget.attributes['data-armeid']?.value;
 | 
				
			||||||
    const competence = event.currentTarget.attributes['data-competence']?.value;
 | 
					    const competence = event.currentTarget.attributes['data-competence']?.value;
 | 
				
			||||||
@@ -600,7 +601,7 @@ export class RdDCombat {
 | 
				
			|||||||
      case '#particuliere-attaque': return await this.choixParticuliere(attackerRoll, event.currentTarget.attributes['data-mode'].value);
 | 
					      case '#particuliere-attaque': return await this.choixParticuliere(attackerRoll, event.currentTarget.attributes['data-mode'].value);
 | 
				
			||||||
      case '#parer-button': return this.parade(attackerRoll, armeParadeId);
 | 
					      case '#parer-button': return this.parade(attackerRoll, armeParadeId);
 | 
				
			||||||
      case '#esquiver-button': return this.esquive(attackerRoll, compId, competence);
 | 
					      case '#esquiver-button': return this.esquive(attackerRoll, compId, competence);
 | 
				
			||||||
      case '#encaisser-button': return this.encaisser(attackerRoll, defenderRoll, defenderTokenId);
 | 
					      case '#encaisser-button': return this.encaisser(attackerRoll, defenderRoll);
 | 
				
			||||||
      case '#echec-total-attaque': return this._onEchecTotal(attackerRoll);
 | 
					      case '#echec-total-attaque': return this._onEchecTotal(attackerRoll);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case '#appel-chance-attaque': return this.attacker.rollAppelChance(
 | 
					      case '#appel-chance-attaque': return this.attacker.rollAppelChance(
 | 
				
			||||||
@@ -717,7 +718,7 @@ export class RdDCombat {
 | 
				
			|||||||
        })
 | 
					        })
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else {
 | 
					      else {
 | 
				
			||||||
        const defenderToken = canvas.tokens.get(this.defenderTokenId);
 | 
					        const defenderToken = canvas.tokens.get(this.defenderTokenId)
 | 
				
			||||||
        const dist = this.distance(_token, defenderToken)
 | 
					        const dist = this.distance(_token, defenderToken)
 | 
				
			||||||
        const isVisible = this.isVisible(_token, defenderToken)
 | 
					        const isVisible = this.isVisible(_token, defenderToken)
 | 
				
			||||||
        const portee = this._ajustementPortee(dist, rollData.arme)
 | 
					        const portee = this._ajustementPortee(dist, rollData.arme)
 | 
				
			||||||
@@ -813,16 +814,15 @@ export class RdDCombat {
 | 
				
			|||||||
  
 | 
					  
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  _prepareAttaque(competence, arme) {
 | 
					  _prepareAttaque(competence, arme) {
 | 
				
			||||||
    const sourceToken = this._extractAttackerTokenData();
 | 
					 | 
				
			||||||
    let rollData = {
 | 
					    let rollData = {
 | 
				
			||||||
      alias: sourceToken.name,
 | 
					      alias: this.attackerToken.name,
 | 
				
			||||||
      passeArme: foundry.utils.randomID(16),
 | 
					      passeArme: foundry.utils.randomID(16),
 | 
				
			||||||
      mortalite: arme?.system.mortalite,
 | 
					      mortalite: arme?.system.mortalite,
 | 
				
			||||||
      competence: competence,
 | 
					      competence: competence,
 | 
				
			||||||
      surprise: this.attacker.getSurprise(true),
 | 
					      surprise: this.attacker.getSurprise(true),
 | 
				
			||||||
      surpriseDefenseur: this.defender.getSurprise(true),
 | 
					      surpriseDefenseur: this.defender.getSurprise(true),
 | 
				
			||||||
      sourceToken: sourceToken,
 | 
					      sourceToken: this.attackerToken,
 | 
				
			||||||
      targetToken: this._extractDefenderTokenData(),
 | 
					      targetToken: this.defenderToken,
 | 
				
			||||||
      essais: {}
 | 
					      essais: {}
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -867,10 +867,10 @@ export class RdDCombat {
 | 
				
			|||||||
      alias: this.attacker.name,
 | 
					      alias: this.attacker.name,
 | 
				
			||||||
      whisper: ChatUtility.getOwners(this.attacker),
 | 
					      whisper: ChatUtility.getOwners(this.attacker),
 | 
				
			||||||
      content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-particuliere.html', {
 | 
					      content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-particuliere.html', {
 | 
				
			||||||
        alias: this.attacker.name,
 | 
					        alias: this.attackerToken.name,
 | 
				
			||||||
        attackerId: this.attackerId,
 | 
					        attackerId: this.attackerId,
 | 
				
			||||||
        attackerToken: this._extractAttackerTokenData(),
 | 
					        attackerToken: this.attackerToken,
 | 
				
			||||||
        defenderToken: this._extractDefenderTokenData(),
 | 
					        defenderToken: this.defenderToken,
 | 
				
			||||||
        isForce: isForce,
 | 
					        isForce: isForce,
 | 
				
			||||||
        isFinesse: isFinesse,
 | 
					        isFinesse: isFinesse,
 | 
				
			||||||
        isRapide: isRapide,
 | 
					        isRapide: isRapide,
 | 
				
			||||||
@@ -920,7 +920,6 @@ export class RdDCombat {
 | 
				
			|||||||
    const esquives = foundry.utils.duplicate(this.defender.getCompetencesEsquive())
 | 
					    const esquives = foundry.utils.duplicate(this.defender.getCompetencesEsquive())
 | 
				
			||||||
    esquives.forEach(e => e.system.nbUsage = e?._id ? this.defender.getItemUse(e._id) : 0);
 | 
					    esquives.forEach(e => e.system.nbUsage = e?._id ? this.defender.getItemUse(e._id) : 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    const paramChatDefense = {
 | 
					    const paramChatDefense = {
 | 
				
			||||||
      passeArme: attackerRoll.passeArme,
 | 
					      passeArme: attackerRoll.passeArme,
 | 
				
			||||||
      essais: attackerRoll.essais,
 | 
					      essais: attackerRoll.essais,
 | 
				
			||||||
@@ -929,8 +928,8 @@ export class RdDCombat {
 | 
				
			|||||||
      attacker: this.attacker,
 | 
					      attacker: this.attacker,
 | 
				
			||||||
      attackerId: this.attackerId,
 | 
					      attackerId: this.attackerId,
 | 
				
			||||||
      esquives: esquives,
 | 
					      esquives: esquives,
 | 
				
			||||||
      attackerToken: this._extractAttackerTokenData(),
 | 
					      attackerToken: this.attackerToken,
 | 
				
			||||||
      defenderToken: this._extractDefenderTokenData(),
 | 
					      defenderToken: this.defenderToken,
 | 
				
			||||||
      mainsNues: attackerRoll.dmg.mortalite != 'mortel' && corpsACorps,
 | 
					      mainsNues: attackerRoll.dmg.mortalite != 'mortel' && corpsACorps,
 | 
				
			||||||
      armes: this._filterArmesParade(this.defender, attackerRoll.competence, attackerRoll.arme),
 | 
					      armes: this._filterArmesParade(this.defender, attackerRoll.competence, attackerRoll.arme),
 | 
				
			||||||
      diffLibre: attackerRoll.ajustements?.diffLibre?.value ?? 0,
 | 
					      diffLibre: attackerRoll.ajustements?.diffLibre?.value ?? 0,
 | 
				
			||||||
@@ -954,7 +953,7 @@ export class RdDCombat {
 | 
				
			|||||||
    const choixDefense = await ChatMessage.create({
 | 
					    const choixDefense = await ChatMessage.create({
 | 
				
			||||||
      // message privé: du défenseur à lui même (et aux GMs)
 | 
					      // message privé: du défenseur à lui même (et aux GMs)
 | 
				
			||||||
      speaker: ChatMessage.getSpeaker(this.defender, canvas.tokens.get(this.defenderTokenId)),
 | 
					      speaker: ChatMessage.getSpeaker(this.defender, canvas.tokens.get(this.defenderTokenId)),
 | 
				
			||||||
      alias: this.attacker.name,
 | 
					      alias: this.attackerToken.name,
 | 
				
			||||||
      whisper: ChatUtility.getOwners(this.defender),
 | 
					      whisper: ChatUtility.getOwners(this.defender),
 | 
				
			||||||
      content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.html', paramDemandeDefense),
 | 
					      content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.html', paramDemandeDefense),
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -968,9 +967,9 @@ export class RdDCombat {
 | 
				
			|||||||
    game.socket.emit(SYSTEM_SOCKET_ID, {
 | 
					    game.socket.emit(SYSTEM_SOCKET_ID, {
 | 
				
			||||||
      msg: "msg_defense", data: {
 | 
					      msg: "msg_defense", data: {
 | 
				
			||||||
        attackerId: this.attacker?.id,
 | 
					        attackerId: this.attacker?.id,
 | 
				
			||||||
        attackerTokenId: this.attackerTokenId,
 | 
					        attackerToken: this.attackerToken,
 | 
				
			||||||
        defenderId: this.defender?.id,
 | 
					        defenderId: this.defender?.id,
 | 
				
			||||||
        defenderTokenId: this.defenderTokenId,
 | 
					        defenderToken: this.defenderToken,
 | 
				
			||||||
        defenderRoll: defenderRoll,
 | 
					        defenderRoll: defenderRoll,
 | 
				
			||||||
        paramChatDefense: paramChatDefense,
 | 
					        paramChatDefense: paramChatDefense,
 | 
				
			||||||
        rollMode: true
 | 
					        rollMode: true
 | 
				
			||||||
@@ -1003,8 +1002,8 @@ export class RdDCombat {
 | 
				
			|||||||
      content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', {
 | 
					      content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', {
 | 
				
			||||||
        attackerId: this.attackerId,
 | 
					        attackerId: this.attackerId,
 | 
				
			||||||
        attacker: this.attacker,
 | 
					        attacker: this.attacker,
 | 
				
			||||||
        attackerToken: this._extractAttackerTokenData(),
 | 
					        attackerToken: this.attackerToken,
 | 
				
			||||||
        defenderToken: this._extractDefenderTokenData(),
 | 
					        defenderToken: this.defenderToken,
 | 
				
			||||||
        essais: attackerRoll.essais
 | 
					        essais: attackerRoll.essais
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -1075,13 +1074,12 @@ export class RdDCombat {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  _prepareParade(attackerRoll, armeParade, competenceParade) {
 | 
					  _prepareParade(attackerRoll, armeParade, competenceParade) {
 | 
				
			||||||
    const defenderToken = this._extractDefenderTokenData()
 | 
					 | 
				
			||||||
    let defenderRoll = {
 | 
					    let defenderRoll = {
 | 
				
			||||||
      alias: defenderToken?.name,
 | 
					      alias: this.defenderToken?.name,
 | 
				
			||||||
      passeArme: attackerRoll.passeArme,
 | 
					      passeArme: attackerRoll.passeArme,
 | 
				
			||||||
      diffLibre: attackerRoll.diffLibre,
 | 
					      diffLibre: attackerRoll.diffLibre,
 | 
				
			||||||
      attackerToken: this._extractAttackerTokenData(),
 | 
					      attackerToken: this.attackerToken,
 | 
				
			||||||
      defenderToken: defenderToken,
 | 
					      defenderToken: this.defenderToken,
 | 
				
			||||||
      attackerRoll: attackerRoll,
 | 
					      attackerRoll: attackerRoll,
 | 
				
			||||||
      competence: this.defender.getCompetence(competenceParade),
 | 
					      competence: this.defender.getCompetence(competenceParade),
 | 
				
			||||||
      arme: armeParade,
 | 
					      arme: armeParade,
 | 
				
			||||||
@@ -1160,13 +1158,12 @@ export class RdDCombat {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  _prepareEsquive(attackerRoll, competence) {
 | 
					  _prepareEsquive(attackerRoll, competence) {
 | 
				
			||||||
    const    defenderToken= this._extractDefenderTokenData()
 | 
					 | 
				
			||||||
    let rollData = {
 | 
					    let rollData = {
 | 
				
			||||||
      alias: defenderToken?.name,
 | 
					      alias: this.defenderToken?.name,
 | 
				
			||||||
      passeArme: attackerRoll.passeArme,
 | 
					      passeArme: attackerRoll.passeArme,
 | 
				
			||||||
      diffLibre: attackerRoll.diffLibre,
 | 
					      diffLibre: attackerRoll.diffLibre,
 | 
				
			||||||
      attackerToken: this._extractAttackerTokenData(),
 | 
					      attackerToken: this.attackerToken,
 | 
				
			||||||
      defenderToken: defenderToken,
 | 
					      defenderToken: this.defenderToken,
 | 
				
			||||||
      attackerRoll: attackerRoll,
 | 
					      attackerRoll: attackerRoll,
 | 
				
			||||||
      competence: competence,
 | 
					      competence: competence,
 | 
				
			||||||
      surprise: this.defender.getSurprise(true),
 | 
					      surprise: this.defender.getSurprise(true),
 | 
				
			||||||
@@ -1308,9 +1305,8 @@ export class RdDCombat {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async encaisser(attackerRoll, defenderRoll, defenderTokenId) {
 | 
					  async encaisser(attackerRoll, defenderRoll) {
 | 
				
			||||||
    defenderTokenId = defenderTokenId || this.defenderTokenId;
 | 
					    console.log("RdDCombat.encaisser >>>", attackerRoll, defenderRoll);
 | 
				
			||||||
    console.log("RdDCombat.encaisser >>>", attackerRoll, defenderTokenId);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (defenderRoll?.rolled && RdDCombat.isEchecTotal(defenderRoll)) {
 | 
					    if (defenderRoll?.rolled && RdDCombat.isEchecTotal(defenderRoll)) {
 | 
				
			||||||
      this._onEchecTotal(defenderRoll);
 | 
					      this._onEchecTotal(defenderRoll);
 | 
				
			||||||
@@ -1318,19 +1314,19 @@ export class RdDCombat {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (Misc.isOwnerPlayerOrUniqueConnectedGM(this.defender)) {
 | 
					    if (Misc.isOwnerPlayerOrUniqueConnectedGM(this.defender)) {
 | 
				
			||||||
      attackerRoll.attackerId = this.attackerId;
 | 
					      attackerRoll.attackerId = this.attackerId;
 | 
				
			||||||
      attackerRoll.defenderTokenId = defenderTokenId;
 | 
					      attackerRoll.defenderTokenId = this.defenderToken.id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      await this.computeRecul(defenderRoll);
 | 
					      await this.computeRecul(defenderRoll);
 | 
				
			||||||
      await this.defender.encaisserDommages(attackerRoll, this.attacker, defenderRoll?.show);
 | 
					      await this.defender.encaisserDommages(attackerRoll, this.attacker, this.attackerToken, defenderRoll?.show);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else { // envoi à un GM: les joueurs n'ont pas le droit de modifier les personnages qu'ils ne possèdent pas
 | 
					    else { // envoi à un GM: les joueurs n'ont pas le droit de modifier les personnages qu'ils ne possèdent pas
 | 
				
			||||||
      game.socket.emit(SYSTEM_SOCKET_ID, {
 | 
					      game.socket.emit(SYSTEM_SOCKET_ID, {
 | 
				
			||||||
        msg: "msg_encaisser",
 | 
					        msg: "msg_encaisser",
 | 
				
			||||||
        data: {
 | 
					        data: {
 | 
				
			||||||
          attackerId: this.attackerId,
 | 
					          attackerId: this.attackerId,
 | 
				
			||||||
          attackerTokenId: this.attackerTokenId,
 | 
					          attackerRoll: attackerRoll,
 | 
				
			||||||
          defenderTokenId: defenderTokenId,
 | 
					          attackerToken: this.attackerToken,
 | 
				
			||||||
          attackerRoll: attackerRoll
 | 
					          defenderToken: this.defenderToken
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -1354,12 +1350,12 @@ export class RdDCombat {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    await ChatMessage.create({
 | 
					    await ChatMessage.create({
 | 
				
			||||||
      content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-acteur.hbs`, formData),
 | 
					      content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-acteur.hbs`, formData),
 | 
				
			||||||
      alias: actor.name
 | 
					      alias: token.name ?? actor.name
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
    await ChatMessage.create({
 | 
					    await ChatMessage.create({
 | 
				
			||||||
      content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-sante.hbs`, formData),
 | 
					      content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-sante.hbs`, formData),
 | 
				
			||||||
      whisper: ChatUtility.getOwners(actor),
 | 
					      whisper: ChatUtility.getOwners(actor),
 | 
				
			||||||
      alias: actor.name
 | 
					      alias: token.name ?? actor.name
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -72,6 +72,6 @@ export class RdDEncaisser extends Dialog {
 | 
				
			|||||||
        encaisserSpecial: this.encaisserSpecial,
 | 
					        encaisserSpecial: this.encaisserSpecial,
 | 
				
			||||||
        mortalite: mortalite
 | 
					        mortalite: mortalite
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    });
 | 
					    })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -563,14 +563,14 @@ export class RdDUtility {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  static async jetEncaissement(rollData, armure, options = { showDice: HIDE_DICE }) {
 | 
					  static async jetEncaissement(actor, rollData, armure, options = { showDice: HIDE_DICE }) {
 | 
				
			||||||
    const diff = Math.abs(rollData.diffLibre);
 | 
					    const diff = Math.abs(rollData.diffLibre);
 | 
				
			||||||
    let formula = RdDUtility.formuleEncaissement(diff, options)
 | 
					    let formula = RdDUtility.formuleEncaissement(diff, options)
 | 
				
			||||||
    const roll = await RdDDice.roll(formula, options);
 | 
					    const roll = await RdDDice.roll(formula, options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RdDUtility.remplaceDeMinParDifficulte(roll, diff, options);
 | 
					    RdDUtility.remplaceDeMinParDifficulte(roll, diff, options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return await RdDUtility.prepareEncaissement(rollData, roll, armure);
 | 
					    return await RdDUtility.prepareEncaissement(actor, rollData, roll, armure);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static remplaceDeMinParDifficulte(roll, diff, options) {
 | 
					  static remplaceDeMinParDifficulte(roll, diff, options) {
 | 
				
			||||||
@@ -602,15 +602,20 @@ export class RdDUtility {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  static async prepareEncaissement(rollData, roll, armure) {
 | 
					  static async prepareEncaissement(actor, rollData, roll, armure) {
 | 
				
			||||||
    // La difficulté d'ataque s'ajoute aux dégâts
 | 
					    // La difficulté d'ataque s'ajoute aux dégâts
 | 
				
			||||||
    const bonusDegatsDiffLibre = ReglesOptionnelles.isUsing('degat-ajout-malus-libre') ? Math.abs(rollData.diffLibre ?? 0) : 0
 | 
					    const bonusDegatsDiffLibre = ReglesOptionnelles.isUsing('degat-ajout-malus-libre') ? Math.abs(rollData.diffLibre ?? 0) : 0
 | 
				
			||||||
    const jetTotal = roll.total + rollData.dmg.total - armure + bonusDegatsDiffLibre
 | 
					    const jetTotal = roll.total + rollData.dmg.total - armure + bonusDegatsDiffLibre
 | 
				
			||||||
    const encaissement = RdDUtility._selectEncaissement(jetTotal, rollData.dmg.mortalite);
 | 
					    const encaissement = RdDUtility._selectEncaissement(jetTotal, rollData.dmg.mortalite);
 | 
				
			||||||
    const over20 = Math.max(jetTotal - 20, 0);
 | 
					    const over20 = Math.max(jetTotal - 20, 0);
 | 
				
			||||||
    encaissement.dmg = rollData.dmg;
 | 
					    encaissement.dmg = rollData.dmg
 | 
				
			||||||
    encaissement.dmg.loc = rollData.dmg.loc ?? await RdDUtility.getLocalisation(this.type);
 | 
					    if (ReglesOptionnelles.isUsing('localisation-aleatoire')){
 | 
				
			||||||
    encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;';
 | 
					      encaissement.dmg.loc = rollData.dmg.loc ?? await RdDUtility.getLocalisation(actor.type)
 | 
				
			||||||
 | 
					      encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;'
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else{
 | 
				
			||||||
 | 
					      encaissement.dmg.loc = {label:''}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    encaissement.dmg.bonusDegatsDiffLibre = bonusDegatsDiffLibre
 | 
					    encaissement.dmg.bonusDegatsDiffLibre = bonusDegatsDiffLibre
 | 
				
			||||||
    encaissement.roll = roll;
 | 
					    encaissement.roll = roll;
 | 
				
			||||||
    encaissement.armure = armure;
 | 
					    encaissement.armure = armure;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,7 @@ const listeReglesOptionnelles = [
 | 
				
			|||||||
  { group: 'Récupération', name: 'recuperation-moral',              descr: "Le moral revient vers 0 durant Château Dormant"},
 | 
					  { group: 'Récupération', name: 'recuperation-moral',              descr: "Le moral revient vers 0 durant Château Dormant"},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  { group: 'Règles de combat', name: 'localisation-aleatoire',      descr: "Proposer une localisation aléatoire des blessures" },
 | 
				
			||||||
  { group: 'Règles de combat', name: 'recul',                       descr: "Appliquer le recul en cas de particulière en force ou de charge" },
 | 
					  { group: 'Règles de combat', name: 'recul',                       descr: "Appliquer le recul en cas de particulière en force ou de charge" },
 | 
				
			||||||
  { group: 'Règles de combat', name: 'resistanceArmeParade',        descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" },
 | 
					  { group: 'Règles de combat', name: 'resistanceArmeParade',        descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" },
 | 
				
			||||||
  { group: 'Règles de combat', name: 'deteriorationArmure',         descr: "Tenir compte de la détérioration des armures" },
 | 
					  { group: 'Règles de combat', name: 'deteriorationArmure',         descr: "Tenir compte de la détérioration des armures" },
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user