Manage possession

This commit is contained in:
2021-11-21 12:04:42 +01:00
parent 8f890dad66
commit ada4aadf24
9 changed files with 200 additions and 68 deletions

View File

@ -19,24 +19,86 @@ export class RdDPossession {
/* -------------------------------------------- */
static init() {
this.possessionList = [];
}
/* -------------------------------------------- */
static searchPossessionFromEntite( attacker, target) {
let poss = this.possessionList.find( poss => poss.entiteId == attacker.data._id && poss.pjId == defender.data._id);
return poss;
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 _onReussitePossession( r ) {
console.log("Success", r);
ui.notifications.warn("Succès du jet de Possession ! Mais La gestion des possessions n'est pas encore disponible, merci de la gérer manuellement");
static updateEtatPossession( possession ) {
possession.ptsConjuration = 0;
possession.ptsPossession = 0;
if ( possession.data.compteur > 0) {
possession.ptsPossession = possession.data.compteur;
}
if ( possession.data.compteur < 0) {
possession.ptsConjuration = Math.abs(possession.data.compteur);
}
if (possession.ptsPossession >= 2 ) {
// Possede
}
if (possession.ptsConjuration <= -2 ) {
// Libere
}
console.log("Poss", possession);
}
/* -------------------------------------------- */
static _onEchecPossession( r ) {
console.log("Echec", r);
ui.notifications.warn("Echec du jet de Possession ! Mais La gestion des possessions n'est pas encore disponible, merci de la gérer manuellement");
static resultConjuration( rollData) {
console.log("RollData!!!", rollData);
if ( !rollData.rolled.isSuccess ) {
rollData.possession.data.compteur++;
}
this.updateEtatPossession(rollData.possession);
RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-possession.html');
}
/* -------------------------------------------- */
static async onDefensePossession( actorId, possessionId) {
let actor = game.actors.get(actorId);
console.log("onDefensePossession", actor, possessionId);
let possession = duplicate(actor.items.find( item => item.type =='possession' && item.data.data.possessionid == possessionId));
let attacker = game.actors.get(possession.data.possesseurid);
// Update for draconic roll
let rollData = {
possession: possession
}
rollData.actor = actor;
rollData.competence = duplicate(actor.getDraconicOrZero());
rollData.competence.data.defaut_carac = 'reve-actuel';
rollData.forceCarac = { 'reve-actuel': { label: "Rêve Actuel", value: actor.getReveActuel() } }
rollData.mode = "conjuration";
rollData.possesseur = attacker.name;
const dialog = await RdDRoll.create(actor, rollData,
{
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-possession.html',
options: { height: 400 }
},
{
name: 'conjurer',
label: 'Conjurer une Possession',
callbacks: [
{ action: async r => this.resultConjuration(r) }
]
}
);
dialog.render(true);
}
/* -------------------------------------------- */
static _onRollPossession( rollData, isSuccess ) {
let possession = rollData.possession;
possession.isSuccess = isSuccess;
this.updateEtatPossession( possession);
RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-possession.html');
}
/* -------------------------------------------- */
@ -52,19 +114,24 @@ export class RdDPossession {
const defender = target.actor;
let possession = this.searchPossessionFromEntite( attacker, defender);
if ( possession) {
// Manage ongoing possession
} else {
this.createPossession(attacker, defender);
if ( !possession) {
possession = this.createPossession(attacker, defender);
}
console.log("Creation de possession", attacker, defender, competence);
this.updateEtatPossession(possession);
let rollData = {
competence: competence,
possession: possession,
possede: defender.name,
possesseur: attacker.name,
attackerId: attacker.data._id,
defenderId: defender.data._id,
mode: "possession"
};
if ( attacker.isCreature()) {
RdDItemCompetenceCreature.setRollDataCreature(rollData);
}
console.log("Creation de possession2", attacker, rollData);
const dialog = await RdDRoll.create( attacker, rollData,
{
@ -74,20 +141,23 @@ export class RdDPossession {
name: 'jet-possession',
label: 'Possession: ',
callbacks: [
{ condition: r => (r.rolled.isSuccess), action: r => this._onReussitePossession(r) },
{ condition: r => (r.rolled.isEchec), action: r => this._onEchecPossession(r) },
{ condition: r => (r.rolled.isSuccess), action: r => this._onRollPossession(r, true) },
{ condition: r => (r.rolled.isEchec), action: r => this._onRollPossession(r, false) },
]
});
dialog.render(true);
}
/* -------------------------------------------- */
static createPossession( attacker, defender ) {
let poss = { entiteid: attacker.data._id,
pjId: defender.data._id,
possessionCount: 0, // Negative : conjuration, Positif : possession
}
this.possessionList.push( poss);
static async createPossession( attacker, defender ) {
let posessionData = {
name: "Possession en cours", type: 'possession',
img: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp",
data: { description: "", possede: false, possessionid: randomID(16), possesseurid: attacker.data._id, possedeid: defender.data._id, date: 0 }
}
await attacker.createEmbeddedDocuments('Item', [posessionData])
let poss = await defender.createEmbeddedDocuments('Item', [posessionData])
return duplicate(poss[0]);
}
}