From 9e63706de6693689c991dd3ea66b360628cfe90a Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 22 Jul 2022 21:38:15 +0200 Subject: [PATCH] Support des blurettes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On peut définir Blurette comme type d'entité. Pas de jet poour s'accorder aux blurettes. --- module/actor.js | 39 +++++++++++++++++-------------- module/constants.js | 4 ++++ module/rdd-combat.js | 10 ++++---- module/rdd-roll-encaisser.js | 24 ++++++++++++------- templates/actor-entite-sheet.html | 1 + 5 files changed, 47 insertions(+), 31 deletions(-) diff --git a/module/actor.js b/module/actor.js index 0a31555f..31724a64 100644 --- a/module/actor.js +++ b/module/actor.js @@ -33,7 +33,8 @@ import { RollDataAjustements } from "./rolldata-ajustements.js"; import { DialogItemAchat } from "./dialog-item-achat.js"; import { RdDItem } from "./item.js"; import { RdDPossession } from "./rdd-possession.js"; -import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; +import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; + /* -------------------------------------------- */ /** @@ -239,7 +240,7 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ getForce() { - if (this.isEntiteCauchemar()) { + if (this.isEntite()) { return Misc.toInt(Misc.templateData(this).carac.reve?.value); } return Misc.toInt(Misc.templateData(this).carac.force?.value); @@ -612,7 +613,10 @@ export class RdDActor extends Actor { content: "Remise à neuf de " + this.name }; const actorData = Misc.data(this); - if (this.isEntiteCauchemar()) { + if (this.isEntite([ENTITE_NONINCARNE])) { + return; + } + if (this.isEntite([ENTITE_INCARNE, ENTITE_BLURETTE])) { await this.santeIncDec("endurance", actorData.data.sante.endurance.max - actorData.data.sante.endurance.value); } else { @@ -1622,7 +1626,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async setSonne(sonne = true) { - if (this.isEntiteCauchemar()) { + if (this.isEntite()) { return; } if (!game.combat && sonne) { @@ -1634,7 +1638,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ getSConst() { - if (this.isEntiteCauchemar()) { + if (this.isEntite()) { return 0; } return RdDCarac.calculSConst(Misc.templateData(this).carac.constitution.value); @@ -1751,7 +1755,7 @@ export class RdDActor extends Actor { result.newValue = Math.max(minValue, Math.min(compteur.value + inc, compteur.max)); //console.log("New value ", inc, minValue, result.newValue); let fatigue = 0; - if (name == "endurance" && !this.isEntiteCauchemar()) { + if (name == "endurance" && !this.isEntite()) { if (result.newValue == 0 && inc < 0 && !isCritique) { // perte endurance et endurance devient 0 (sauf critique) -> -1 vie sante.vie.value--; result.perteVie = true; @@ -1788,7 +1792,7 @@ export class RdDActor extends Actor { } isDead() { - return !this.isEntiteCauchemar() && Misc.templateData(this).sante.vie.value < -this.getSConst() + return !this.isEntite() && Misc.templateData(this).sante.vie.value < -this.getSConst() } /* -------------------------------------------- */ @@ -3347,7 +3351,7 @@ export class RdDActor extends Actor { let encaissement = await this.jetEncaissement(rollData); this.ajouterBlessure(encaissement); // Will upate the result table - const perteVie = this.isEntiteCauchemar() + const perteVie = this.isEntite() ? { newValue: 0 } : await this.santeIncDec("vie", - encaissement.vie); const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, encaissement.critiques > 0); @@ -3362,7 +3366,7 @@ export class RdDActor extends Actor { sonne: perteEndurance.sonne, jetEndurance: perteEndurance.jetEndurance, endurance: santeOrig.endurance.value - perteEndurance.newValue, - vie: this.isEntiteCauchemar() ? 0 : (santeOrig.vie.value - perteVie.newValue), + vie: this.isEntite() ? 0 : (santeOrig.vie.value - perteVie.newValue), show: defenderRoll?.show ?? {} }); @@ -3552,8 +3556,8 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async accorder(entite, when = 'avant-encaissement') { if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar") - || !entite.isEntiteCauchemar() - || entite.isEntiteCauchemarAccordee(this)) { + || !entite.isEntite([ENTITE_INCARNE]) + || entite.isEntiteAccordee(this)) { return true; } const tplData = Misc.templateData(this); @@ -3577,20 +3581,21 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - isEntiteCauchemar() { - return this.data.type == 'entite'; + isEntite(typeentite = [] ) { + return this.data.type == 'entite' && (typeentite.length == 0 || typeentite.includes(this.data.data.typeentite)); } /* -------------------------------------------- */ - isEntiteCauchemarAccordee(attaquant) { - if (!this.isEntiteCauchemar()) { return true; } + isEntiteAccordee(attaquant) { + if (!this.isEntite([ENTITE_INCARNE])) + { return true; } let resonnance = Misc.templateData(this).sante.resonnance; return (resonnance.actors.find(it => it == attaquant.id)); } /* -------------------------------------------- */ async setEntiteReveAccordee(attaquant) { - if (!this.isEntiteCauchemar()) { + if (!this.isEntite([ENTITE_INCARNE])) { ui.notifications.error("Impossible de s'accorder à " + this.name + ": ce n'est pas une entite de cauchemer/rêve"); return; } @@ -4153,7 +4158,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async setStatusEffect(label, status, updates = {}) { - if (this.isEntiteCauchemar() || this.data.type == 'vehicule') { + if (this.isEntite() || this.data.type == 'vehicule') { return; } console.log("setStatusEffect", label, status, updates) diff --git a/module/constants.js b/module/constants.js index 865a0559..675749ed 100644 --- a/module/constants.js +++ b/module/constants.js @@ -3,3 +3,7 @@ export const SYSTEM_SOCKET_ID = 'system.foundryvtt-reve-de-dragon'; export const HIDE_DICE = 'hide'; export const SHOW_DICE = 'show'; + +export const ENTITE_INCARNE = 'incarne'; +export const ENTITE_NONINCARNE = 'nonincarne'; +export const ENTITE_BLURETTE = 'blurette'; diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 455e76ff..0cc4a587 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -1,5 +1,5 @@ import { ChatUtility } from "./chat-utility.js"; -import { HIDE_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; +import { ENTITE_INCARNE, ENTITE_NONINCARNE, HIDE_DICE, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; import { Grammar } from "./grammar.js"; import { RdDItemArme } from "./item-arme.js"; import { RdDItemCompetence } from "./item-competence.js"; @@ -457,7 +457,7 @@ export class RdDCombat { else { const defender = target?.actor; const defenderTokenId = target?.data._id; - if ( defender.type == 'entite' && defender.data.data.definition.typeentite == 'nonincarne') { + if ( defender.type == 'entite' && defender.data.data.definition.typeentite == ENTITE_NONINCARNE) { ui.notifications.warn("Vous ne pouvez pas cibler une entité non incarnée !!!!"); } else { return this.create(attacker, defender, defenderTokenId, target) @@ -799,7 +799,7 @@ export class RdDCombat { async _onAttaqueNormale(attackerRoll) { console.log("RdDCombat.onAttaqueNormale >>>", attackerRoll); - attackerRoll.dmg = RdDBonus.dmg(attackerRoll, this.attacker.getBonusDegat(), this.defender.isEntiteCauchemar()); + attackerRoll.dmg = RdDBonus.dmg(attackerRoll, this.attacker.getBonusDegat(), this.defender.isEntite()); let defenderRoll = { attackerRoll: attackerRoll, passeArme: attackerRoll.passeArme, show: {} } attackerRoll.show = { cible: this.target ? this.defender.data.name : 'la cible', @@ -1249,8 +1249,8 @@ export class RdDCombat { async accorderEntite(when = 'avant-encaissement') { if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar") || this.defender == undefined - || !this.defender.isEntiteCauchemar() - || this.defender.isEntiteCauchemarAccordee(this.attacker)) { + || !this.defender.isEntite([ENTITE_INCARNE]) + || this.defender.isEntiteAccordee(this.attacker)) { return true; } diff --git a/module/rdd-roll-encaisser.js b/module/rdd-roll-encaisser.js index 55f2b8f5..8c8d8971 100644 --- a/module/rdd-roll-encaisser.js +++ b/module/rdd-roll-encaisser.js @@ -1,3 +1,5 @@ +import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE } from "./constants"; + /** * Extend the base Dialog entity by defining a custom window to perform roll. * @extends {Dialog} @@ -7,15 +9,19 @@ export class RdDEncaisser extends Dialog { /* -------------------------------------------- */ constructor(html, actor) { // Common conf - const buttonsCreatures = { - "mortel": { label: "Mortel", callback: html => this.performEncaisser("mortel") }, - "non-mortel": { label: "Non-mortel", callback: html => this.performEncaisser("non-mortel") }, - "sonne": { label: "Sonné", callback: html => this.actor.setSonne() }, - }; - const buttonsEntitesCauchemar = { - "cauchemar": { label: "cauchemar", callback: html => this.performEncaisser("cauchemar") } - }; - const buttons = actor.isEntiteCauchemar() ? buttonsEntitesCauchemar : buttonsCreatures; + let buttons = {}; + if (!actor.isEntite()){ + buttons = { + "mortel": { label: "Mortel", callback: html => this.performEncaisser("mortel") }, + "non-mortel": { label: "Non-mortel", callback: html => this.performEncaisser("non-mortel") }, + "sonne": { label: "Sonné", callback: html => this.actor.setSonne() }, + }; + } + else if (actor.isEntite([ENTITE_BLURETTE, ENTITE_INCARNE])){ + buttons = { + "cauchemar": { label: "cauchemar", callback: html => this.performEncaisser("cauchemar") } + } + } let dialogConf = { title: "Jet d'Encaissement", diff --git a/templates/actor-entite-sheet.html b/templates/actor-entite-sheet.html index 7bafd512..455d795e 100644 --- a/templates/actor-entite-sheet.html +++ b/templates/actor-entite-sheet.html @@ -65,6 +65,7 @@ {{#select data.definition.typeentite}} + {{/select}}