/* -------------------------------------------- */ import { RdDCombat } from "./rdd-combat.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDRoll } from "./rdd-roll.js"; import { RdDItemCompetenceCreature } from "./item-competencecreature.js"; /* -------------------------------------------- */ /* On part du principe qu'une entité démarre tjs une possession via le MJ (ie un joueur ne controle pas une entité) Donc la compétence Possession ne peut être démarrée que par le MJ. */ /* -------------------------------------------- */ export class RdDPossession { /* -------------------------------------------- */ static init() { } /* -------------------------------------------- */ 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); } return poss && duplicate(poss) || undefined; } /* -------------------------------------------- */ static updateEtatPossession(possession) { possession.ptsConjuration = 0 possession.ptsPossession = 0 console.log("Possession", possession) if (possession.data.compteur > 0) { possession.ptsPossession = possession.data.compteur } if (possession.data.compteur < 0) { possession.ptsConjuration = Math.abs(possession.data.compteur) } possession.isPosseder = false possession.isConjurer = false if (possession.ptsPossession >= 2) { possession.isPosseder = true } if (possession.ptsConjuration >= 2) { possession.isConjurer = true } } /* -------------------------------------------- */ static async resultConjuration(rollData) { let actor = game.actors.get(rollData.possession.data.possedeid) if (!rollData.rolled.isSuccess) { if (rollData.isECNIDefender) { rollData.possession.data.compteur-- } else { rollData.possession.data.compteur++ } 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) { actor.deleteEmbeddedDocuments("Item", [rollData.possession._id]) } } /* -------------------------------------------- */ static async onDefensePossession(attackerId, defenderId, possessionId) { let attacker = game.actors.get(attackerId) let defender = game.actors.get(defenderId) let possession = attacker.getPossession(possessionId) ?? defender.getPossession(possessionId) ; if (!possession) { ui.notifications.warn("Une erreur s'est produite : Aucune possession trouvée !!") return } // Update for draconic roll let rollData = { mode: "conjuration", isECNIDefender: defender.type == "entite", possession: duplicate(possession), attacker: attacker, defender: defender, competence: defender.getDraconicOuPossession(), selectedCarac: defender.data.data.carac.reve, } if (rollData.isECNIDefender) { rollData.competence.data.defaut_carac = "reve" rollData.forceCarac = { 'reve': { label: "Rêve", value: defender.data.data.carac.reve.value } } } else { rollData.competence.data.defaut_carac = 'reve-actuel' rollData.forceCarac = { 'reve-actuel': { label: "Rêve Actuel", value: defender.getReveActuel() } } } const dialog = await RdDRoll.create(defender, rollData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-possession.html', options: { height: 450 } }, { name: 'conjurer', label: 'Conjurer une Possession', callbacks: [ { action: async r => await this.resultConjuration(r) } ] } ); dialog.render(true) } /* -------------------------------------------- */ 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; possession = duplicate(possession ?? this.searchPossessionFromEntite(attacker, defender) ??(await this.createPossession(attacker, defender))); this.updateEtatPossession(possession) let rollData = { mode: "possession", isECNIDefender: defender.type == "entite", competence: competence, possession: possession, attacker: attacker, defender: defender }; if (attacker.isCreature()) { RdDItemCompetenceCreature.setRollDataCreature(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: 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) }, ] }); dialog.render(true) } /* -------------------------------------------- */ 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) { let possessionData = { name: "Possession en cours de " + attacker.name, type: 'possession', img: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp", data: { description: "", typepossession: attacker.name, possede: false, possessionid: randomID(16), possesseurid: attacker.data._id, possedeid: defender.data._id, date: 0, compteur: 0 } } // Creates only the possession on the personnage side let poss = await defender.createEmbeddedDocuments('Item', [possessionData]) return duplicate(poss[0]) } }