107 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
 | 
						|
import { ITEM_TYPES } from "../item.js";
 | 
						|
import { Misc } from "../misc.js";
 | 
						|
import { RdDEncaisser } from "../rdd-roll-encaisser.js";
 | 
						|
import { STATUSES } from "../settings/status-effects.js";
 | 
						|
import { RdDBaseActorReve } from "./base-actor-reve.js";
 | 
						|
 | 
						|
export class RdDEntite extends RdDBaseActorReve {
 | 
						|
 | 
						|
  static get defaultIcon() {
 | 
						|
    return "systems/foundryvtt-reve-de-dragon/icons/entites/darquoine.webp";
 | 
						|
  }
 | 
						|
 | 
						|
  canReceive(item) {
 | 
						|
    return item.type == ITEM_TYPES.competencecreature
 | 
						|
  }
 | 
						|
 | 
						|
  isEntite(typeentite = []) {
 | 
						|
    return (typeentite.length == 0 || typeentite.includes(this.system.definition.typeentite));
 | 
						|
  }
 | 
						|
  isNonIncarnee() { return this.isEntite([ENTITE_NONINCARNE]) }
 | 
						|
 | 
						|
  getReveActuel() {
 | 
						|
    return Misc.toInt(this.system.carac.reve?.value)
 | 
						|
  }
 | 
						|
 | 
						|
  getForce() { return this.getReve() }
 | 
						|
  getAgilite() { return this.getReve() }
 | 
						|
  getChance() { return this.getReve() }
 | 
						|
 | 
						|
  getDraconicOuPossession() {
 | 
						|
    return this.itemTypes[ITEM_TYPES.competencecreature]
 | 
						|
      .filter(it => it.system.categorie == 'possession')
 | 
						|
      .sort(Misc.descending(it => it.system.niveau))
 | 
						|
      .find(it => true);
 | 
						|
  }
 | 
						|
 | 
						|
  async remiseANeuf() {
 | 
						|
    await this.removeEffects(e => true);
 | 
						|
    if (!this.isNonIncarnee()) {
 | 
						|
      await this.update({
 | 
						|
        'system.sante.endurance.value': this.system.sante.endurance.max
 | 
						|
      });
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  isDead() {
 | 
						|
    return this.isNonIncarnee() ? false : this.system.sante.endurance.value <= 0
 | 
						|
  }
 | 
						|
 | 
						|
  async santeIncDec(name, inc, isCritique = false) {
 | 
						|
    if (name == 'endurance' && !this.isNonIncarnee()) {
 | 
						|
      const oldValue = this.system.sante.endurance.value;
 | 
						|
      const endurance = Math.max(0,
 | 
						|
        Math.min(oldValue + inc,
 | 
						|
          this.system.sante.endurance.max));
 | 
						|
      await this.update({ "system.sante.endurance.value": endurance })
 | 
						|
      await this.setEffect(STATUSES.StatusComma, endurance <= 0);
 | 
						|
      return {
 | 
						|
        perte: oldValue - endurance,
 | 
						|
        newValue: endurance
 | 
						|
      }
 | 
						|
    }
 | 
						|
    return {}
 | 
						|
  }
 | 
						|
  async encaisser() {
 | 
						|
    if (this.isNonIncarnee()) {
 | 
						|
      return
 | 
						|
    }
 | 
						|
    await RdDEncaisser.encaisser(this)
 | 
						|
  }
 | 
						|
 | 
						|
  isEffectAllowed(effectId) {
 | 
						|
    return [STATUSES.StatusComma].includes(effectId);
 | 
						|
  }
 | 
						|
 | 
						|
  async onAppliquerJetEncaissement(encaissement, attackerToken) {
 | 
						|
    const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance);
 | 
						|
    foundry.utils.mergeObject(encaissement, {
 | 
						|
      resteEndurance: perteEndurance.newValue,
 | 
						|
      endurance: perteEndurance.perte
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  isEntiteAccordee(attacker) {
 | 
						|
    if (this.isEntite([ENTITE_INCARNE])) {
 | 
						|
      let resonnance = this.system.sante.resonnance
 | 
						|
      return (resonnance.actors.find(it => it == attacker.id))
 | 
						|
    }
 | 
						|
    return true
 | 
						|
  }
 | 
						|
 | 
						|
  /* -------------------------------------------- */
 | 
						|
  async setEntiteReveAccordee(actor) {
 | 
						|
    if (this.isEntite([ENTITE_INCARNE])) {
 | 
						|
      if (this.system.sante.resonnance.actors.find(it => it == actor.id)) {
 | 
						|
        // déjà accordé
 | 
						|
        return
 | 
						|
      }
 | 
						|
      await this.update({ "system.sante.resonnance.actors": [...this.system.sante.resonnance.actors, actor.id] })
 | 
						|
    }
 | 
						|
    else {
 | 
						|
      super.setEntiteReveAccordee(actor)
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |