From b417fdfe329cbd8ba3eea6c45f566c8771e31290 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 2 Jul 2022 01:41:55 +0200 Subject: [PATCH 1/2] Fix possession MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On peut maintenant lutter pour les haut-rêvants Les messages ont été clarifiés --- module/actor.js | 35 +++-- module/rdd-possession.js | 135 +++++++----------- module/rdd-utility.js | 2 +- templates/actor-sheet.html | 43 +++--- templates/chat-resultat-possession.html | 15 +- templates/dialog-roll-defense-possession.html | 6 +- 6 files changed, 114 insertions(+), 122 deletions(-) diff --git a/module/actor.js b/module/actor.js index c2b41701..de4ec700 100644 --- a/module/actor.js +++ b/module/actor.js @@ -372,12 +372,27 @@ export class RdDActor extends Actor { const list = this.getDraconicList(); return duplicate(list[0]); } - getDraconicOrZero() { - const list = this.getDraconicList().filter(it => Misc.data(it).data.niveau >= 0); - if (list.length == 0) { - return { name: "Aucun", data: { niveau: 0 } }; + getDraconicOuPossession() { + const possessions = this.items.filter(it => Misc.data(it).type == 'competencecreature' && Misc.templateData(it).ispossession) + .sort(Misc.descending(it => Misc.templateData(it).niveau)); + if (possessions.length>0) { + return duplicate(possessions[0]); } - return duplicate(list[0]); + const draconics = this.getDraconicList().filter(it => Misc.data(it).data.niveau >= 0); + if (draconics.length> 0) { + return duplicate(draconics[0]); + } + return { + img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp', + name: 'Sans draconic', + data: { + niveau: 0, + defaut_carac: "reve", + } + }; + } + getPossession(possessionId) { + return this.items.find(it => it.type == 'possession' && it.data.data.possessionid == possessionId); } getDemiReve() { @@ -783,7 +798,7 @@ export class RdDActor extends Actor { async combattreReveDeDragon(force) { let rollData = { actor: this, - competence: duplicate(this.getDraconicOrZero()), + competence: duplicate(this.getDraconicOuPossession()), canClose: false, rencontre: duplicate(TMRRencontres.getRencontre('rdd')), tmr: true, @@ -2538,7 +2553,7 @@ export class RdDActor extends Actor { if (rollData.competence.type == 'competencecreature') { if (rollData.competence.data.iscombat) { if (rollData.competence.data.ispossession) { - RdDPossession.managePossession(this, rollData.competence) + RdDPossession.onAttaquePossession(this, rollData.competence) } else { const arme = RdDItemCompetenceCreature.toArme(rollData.competence) RdDCombat.createUsingTarget(this)?.attaque(competence, arme) @@ -2566,8 +2581,8 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ conjurerPossession(possession) { - let draconic = this.getBestDraconic(); - RdDPossession.managePossession(this, draconic, possession) + let draconic = this.getDraconicOuPossession(); + RdDPossession.onAttaquePossession(this, draconic, possession) } /* -------------------------------------------- */ @@ -3206,7 +3221,7 @@ export class RdDActor extends Actor { let competence = Misc.data(this.getCompetence(arme.data.competence)); if (arme || (competence.type == 'competencecreature' && competence.data.iscombat)) { if (competence.data.ispossession) { - RdDPossession.managePossession(this, competence); + RdDPossession.onAttaquePossession(this, competence); } else { RdDCombat.createUsingTarget(this)?.attaque(competence, arme); } diff --git a/module/rdd-possession.js b/module/rdd-possession.js index ed5c88fa..26db48f0 100644 --- a/module/rdd-possession.js +++ b/module/rdd-possession.js @@ -14,44 +14,44 @@ Donc la compétence Possession ne peut être démarrée que par le MJ. export class RdDPossession { /* -------------------------------------------- */ - static init() { + static init() { } /* -------------------------------------------- */ - static searchPossessionFromEntite( attacker, defender) { - let poss = attacker.data.items.find( poss => poss.type == 'possession' && poss.data.data.possedeid == defender.data._id); + static searchPossessionFromEntite(attacker, defender) { + let poss = attacker.data.items.find(poss => poss.type == 'possession' && poss.data.data.possedeid == defender.data._id); if (!poss) { - poss = defender.data.items.find( poss => poss.type == 'possession' && poss.data.data.possedeid == defender.data._id); + poss = defender.data.items.find(poss => poss.type == 'possession' && poss.data.data.possedeid == defender.data._id); } return poss && duplicate(poss) || undefined; } /* -------------------------------------------- */ - static updateEtatPossession( possession ) { + static updateEtatPossession(possession) { possession.ptsConjuration = 0 possession.ptsPossession = 0 console.log("Possession", possession) - if ( possession.data.compteur > 0) { + if (possession.data.compteur > 0) { possession.ptsPossession = possession.data.compteur - } - if ( possession.data.compteur < 0) { + } + if (possession.data.compteur < 0) { possession.ptsConjuration = Math.abs(possession.data.compteur) - } + } possession.isPosseder = false possession.isConjurer = false - if (possession.ptsPossession >= 2 ) { + if (possession.ptsPossession >= 2) { possession.isPosseder = true } - if (possession.ptsConjuration >= 2 ) { + if (possession.ptsConjuration >= 2) { possession.isConjurer = true } } /* -------------------------------------------- */ - static async resultConjuration( rollData) { + static async resultConjuration(rollData) { let actor = game.actors.get(rollData.possession.data.possedeid) - if ( !rollData.rolled.isSuccess ) { - if( rollData.isECNIDefender) { + if (!rollData.rolled.isSuccess) { + if (rollData.isECNIDefender) { rollData.possession.data.compteur-- } else { rollData.possession.data.compteur++ @@ -59,55 +59,46 @@ export class RdDPossession { let update = { _id: rollData.possession._id, "data.compteur": rollData.possession.data.compteur } await actor.updateEmbeddedDocuments('Item', [update]) } - + this.updateEtatPossession(rollData.possession) await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-possession.html') - if ( rollData.possession.isPosseder || rollData.possession.isConjurer) { + if (rollData.possession.isPosseder || rollData.possession.isConjurer) { actor.deleteEmbeddedDocuments("Item", [rollData.possession._id]) } } /* -------------------------------------------- */ - static async onDefensePossession( attackerId, defenderId, possessionId) { + static async onDefensePossession(attackerId, defenderId, possessionId) { let attacker = game.actors.get(attackerId) let defender = game.actors.get(defenderId) - - let possession = attacker.items.find( item => item.type =='possession' && item.data.data.possessionid == possessionId) - if ( !possession ) { - possession = defender.items.find( item => item.type =='possession' && item.data.data.possessionid == possessionId) - if ( !possession) { - ui.notifications.warn("Une erreur s'est produite : Aucune possession trouvée !!") - return - } + let possession = attacker.getPossession(possessionId) ?? defender.getPossession(possessionId) ; + if (!possession) { + ui.notifications.warn("Une erreur s'est produite : Aucune possession trouvée !!") + return } - possession = duplicate(possession) - // Update for draconic roll let rollData = { - possession: possession + mode: "conjuration", + isECNIDefender: defender.type == "entite", + possession: duplicate(possession), + attacker: attacker, + defender: defender, + competence: defender.getDraconicOuPossession(), + selectedCarac: defender.data.data.carac.reve, } - rollData.actor = defender - if ( defender.type == "personnage") { - rollData.competence = duplicate(defender.getDraconicOrZero()) - rollData.competence.data.defaut_carac = 'reve-actuel' - rollData.forceCarac = { 'reve-actuel': { label: "Rêve Actuel", value: defender.getReveActuel() } } - rollData.selectedCarac = defender.data.data.carac.reve - rollData.isECNIDefender = false - } else { - rollData.competence = duplicate(defender.getCompetence("Possession")) + + if (rollData.isECNIDefender) { rollData.competence.data.defaut_carac = "reve" rollData.forceCarac = { 'reve': { label: "Rêve", value: defender.data.data.carac.reve.value } } - rollData.selectedCarac = defender.data.data.carac.reve - rollData.isECNIDefender = true - //RdDItemCompetenceCreature.setRollDataCreature( rollData ) + } else { + rollData.competence.data.defaut_carac = 'reve-actuel' + rollData.forceCarac = { 'reve-actuel': { label: "Rêve Actuel", value: defender.getReveActuel() } } } - rollData.mode = "conjuration" - rollData.possesseur = attacker.name const dialog = await RdDRoll.create(defender, rollData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-possession.html', - options: { height: 400 } + options: { height: 450 } }, { name: 'conjurer', @@ -121,54 +112,38 @@ export class RdDPossession { } /* -------------------------------------------- */ - static async _onRollPossession( rollData, isSuccess ) { - let possession = rollData.possession - possession.isSuccess = isSuccess - this.updateEtatPossession( possession) - await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-possession.html'); - } - - /* -------------------------------------------- */ - static async managePossession(attacker, competence, possession=undefined) { - + static async onAttaquePossession(attacker, competence, possession = undefined) { const target = RdDCombat.getTarget() if (target == undefined) { ui.notifications.warn((game.user.targets?.size ?? 0) > 1 ? "Vous devez choisir une seule cible à posséder!" : "Vous devez choisir une cible à posséder!"); return; - } - - const defender = target.actor; - if ( !possession) { - possession = this.searchPossessionFromEntite( attacker, defender) - if ( !possession) { - possession = await this.createPossession(attacker, defender) - } } - possession = duplicate(possession); + const defender = target.actor; + possession = duplicate(possession ?? this.searchPossessionFromEntite(attacker, defender) ??(await this.createPossession(attacker, defender))); + this.updateEtatPossession(possession) let rollData = { - competence: competence.data.data.niveau >=0 ? competence : RdDPossession.competenceNonHautRevant(), + mode: "possession", + isECNIDefender: defender.type == "entite", + competence: competence, possession: possession, - possede: defender.name, - possesseur: attacker.name, - attackerId: attacker.data._id, - defenderId: defender.data._id, - mode: "possession" + attacker: attacker, + defender: defender }; - if ( attacker.isCreature()) { + if (attacker.isCreature()) { RdDItemCompetenceCreature.setRollDataCreature(rollData) } - const dialog = await RdDRoll.create( attacker, rollData, + const dialog = await RdDRoll.create(attacker, rollData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html', options: { height: 540 } }, { name: 'jet-possession', - label: 'Possession: ', + label: rollData.isECNIDefender ? 'Conjurer la possession' : 'Possession', callbacks: [ { condition: r => (r.rolled.isSuccess), action: async r => await this._onRollPossession(r, true) }, { condition: r => (r.rolled.isEchec), action: async r => await this._onRollPossession(r, false) }, @@ -177,21 +152,15 @@ export class RdDPossession { dialog.render(true) } - static competenceNonHautRevant() { - return { - img: 'systems/foundryvtt-reve-de-dragon/icons/competence_vigilance.webp', - name: 'non Haut-rêvant', - data: { - data: { - niveau: 0, - defaut_carac: "reve", - } - } - }; + /* -------------------------------------------- */ + static async _onRollPossession(rollData, isSuccess) { + rollData.possession.isSuccess = isSuccess; + this.updateEtatPossession(rollData.possession); + await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-possession.html'); } /* -------------------------------------------- */ - static async createPossession( attacker, defender ) { + static async createPossession(attacker, defender) { let possessionData = { name: "Possession en cours de " + attacker.name, type: 'possession', img: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp", diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 7e5cd962..d6f26d13 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -694,7 +694,7 @@ export class RdDUtility { actor.tmrApp.lancerSortEnReserve(coord, sortId); }); - // gestion bouton tchat Acheter + // gestion bouton tchat Possession html.on("click", '.defense-possession', event => { let attackerId = event.currentTarget.attributes['data-attackerId'].value let defenderId = event.currentTarget.attributes['data-defenderId'].value diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 88e76ad8..dd4e86f8 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -321,6 +321,7 @@ {{!-- Liste de blessures --}} {{> "systems/foundryvtt-reve-de-dragon/templates/actor-liste-blessures-partial.html" this}} + {{#if maladiesPoisons.length}} {{!-- Maladies & Poison --}}

Maladies & Poisons:

+ {{/if}} - {{!-- Possession --}} -

Possession:

- + {{/if}} {{!-- Connaissances Tab --}} diff --git a/templates/chat-resultat-possession.html b/templates/chat-resultat-possession.html index 025ba08a..adcaf444 100644 --- a/templates/chat-resultat-possession.html +++ b/templates/chat-resultat-possession.html @@ -1,29 +1,30 @@

{{#if (eq mode "possession")}} - {{alias}} tente de posséder {{possede}} + {{attacker.name}} tente de {{#if isECNIDefender}}conjurer la possession de{{else}}posséder{{/if}} {{defender.name}} {{else}} - {{alias}} tente de conjurer la possession de {{possesseur}} + {{defender.name}} tente de {{#if isECNIDefender}}résister à{{else}}conjurer la possession de{{/if}} {{attacker.name}} {{/if}}

{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
-

{{#if (eq mode "possession")}} {{#if possession.isSuccess}} - Résister à la possession - + Résister à la possession + {{else}} La Tentative de Possession a échouée ! {{/if}} {{else}} {{#if rolled.isSuccess}} - La Tentative de Possession a été conjurée ! {{alias}} résiste à la tentative de possession. + La Tentative de Possession a été conjurée ! {{defender.name}} résiste à la tentative de possession. {{else}} La Tentative de Possession n'a pas pu être conjurée ! {{/if}} diff --git a/templates/dialog-roll-defense-possession.html b/templates/dialog-roll-defense-possession.html index 1ff1f5eb..8eea43bf 100644 --- a/templates/dialog-roll-defense-possession.html +++ b/templates/dialog-roll-defense-possession.html @@ -1,5 +1,9 @@
-

Conjuration d'une Possession {{possession.name}}!

+

+ {{defender.name}} tente de + {{#if isECNIDefender}}maintenir{{else}}résister à{{/if}} + la possession de {{attacker.name}} +

{{competence.name}} From 70c26ebfe025ea660e8e64e1d28392939e635687 Mon Sep 17 00:00:00 2001 From: sladecraven Date: Sat, 2 Jul 2022 08:54:55 +0200 Subject: [PATCH 2/2] Fix possession --- system.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system.json b/system.json index c4abab3f..8bd6c4ac 100644 --- a/system.json +++ b/system.json @@ -29,7 +29,7 @@ "url": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/", "license": "LICENSE.txt", "flags": {}, - "version": "1.5.79", + "version": "1.5.80", "minimumCoreVersion": "0.8.0", "compatibleCoreVersion": "9", "scripts": [], @@ -500,7 +500,7 @@ "dependencies": [], "socket": true, "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v1.5/system.json", - "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-1.5.79.zip", + "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-1.5.80.zip", "protected": false, "gridDistance": 1, "gridUnits": "m",