diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 29170dc2..c14aee91 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -62,7 +62,7 @@ export class RdDActorSheet extends ActorSheet { if (this.actor.data.type == 'creature') return formData; // Shortcut - formData.competenceByCategory = Misc.classify(formData.data.competences, item => item.data.categorie); + formData.competenceByCategory = Misc.classify(formData.data.competences, it => it.data.categorie); formData.calc = { comptageArchetype: RdDItemCompetence.computeResumeArchetype(formData.data.competences), @@ -453,9 +453,7 @@ export class RdDActorSheet extends ActorSheet { // On pts de reve change html.find('.pointsreve-value').change((event) => { let reveValue = event.currentTarget.value; - let reve = duplicate(this.actor.data.data.reve.reve); - reve.value = reveValue; - this.actor.update({ "data.reve.reve": reve }); + this.actor.update({ "data.reve.reve.value": reveValue }); }); // On seuil de reve change @@ -465,7 +463,7 @@ export class RdDActorSheet extends ActorSheet { }); html.find('#attribut-protection-edit').change((event) => { - this.actor.updateProtectionValue(event.currentTarget.attributes.name.value, parseInt(event.target.value)); + this.actor.updateAttributeValue(event.currentTarget.attributes.name.value, parseInt(event.target.value)); }); // On stress change diff --git a/module/actor.js b/module/actor.js index 68bf750e..8097e01c 100644 --- a/module/actor.js +++ b/module/actor.js @@ -160,65 +160,66 @@ export class RdDActor extends Actor { if (!this.isPersonnage()) { return 0; } - return Misc.toInt(this.data.data.sante.fatigue?.value); + return Misc.toInt(Misc.templateData(this).sante.fatigue?.value); } /* -------------------------------------------- */ getFatigueMax() { if (!this.isPersonnage()) { return 1; } - return Misc.toInt(this.data.data.sante.fatigue?.max); + return Misc.toInt(Misc.templateData(this).sante.fatigue?.max); } /* -------------------------------------------- */ getReveActuel() { - return Misc.toInt(this.data.data.reve?.reve?.value ?? this.data.data.carac.reve.value); + const actorData = Misc.data(this); + return Misc.toInt(actorData.data.reve?.reve?.value ?? actorData.data.carac.reve.value); } /* -------------------------------------------- */ getChanceActuel() { - return Misc.toInt(this.data.data.compteurs.chance?.value ?? 10); + return Misc.toInt(Misc.templateData(this).compteurs.chance?.value ?? 10); } /* -------------------------------------------- */ getTaille() { - return Misc.toInt(this.data.data.carac.taille?.value); + return Misc.toInt(Misc.templateData(this).carac.taille?.value); } /* -------------------------------------------- */ getForce() { if (this.isEntiteCauchemar()) { - return Misc.toInt(this.data.data.carac.reve?.value); + return Misc.toInt(Misc.templateData(this).carac.reve?.value); } - return Misc.toInt(this.data.data.carac.force?.value); + return Misc.toInt(Misc.templateData(this).carac.force?.value); } /* -------------------------------------------- */ getAgilite() { switch (this.data.type) { - case 'personnage': return Misc.toInt(this.data.data.carac.agilite?.value); - case 'creature': return Misc.toInt(this.data.data.carac.force?.value); - case 'entite': return Misc.toInt(this.data.data.carac.reve?.value); + case 'personnage': return Misc.toInt(Misc.templateData(this).carac.agilite?.value); + case 'creature': return Misc.toInt(Misc.templateData(this).carac.force?.value); + case 'entite': return Misc.toInt(Misc.templateData(this).carac.reve?.value); } return 10; } /* -------------------------------------------- */ getChance() { - return Misc.toInt(this.data.data.carac.chance?.value ?? 10); + return Misc.toInt(Misc.templateData(this).carac.chance?.value ?? 10); } getMoralTotal() { - return Misc.toInt(this.data.data.compteurs.moral?.value); + return Misc.toInt(Misc.templateData(this).compteurs.moral?.value); } /* -------------------------------------------- */ getBonusDegat() { // TODO: gérer séparation et +dom créature/entité indépendament de la compétence - return Misc.toInt(this.data.data.attributs.plusdom.value); + return Misc.toInt(Misc.templateData(this).attributs.plusdom.value); } /* -------------------------------------------- */ getProtectionNaturelle() { - return Misc.toInt(this.data.data.attributs.protection.value); + return Misc.toInt(Misc.templateData(this).attributs.protection.value); } /* -------------------------------------------- */ getEtatGeneral() { - return Misc.toInt(this.data.data.compteurs.etat?.value); + return Misc.toInt(Misc.templateData(this).compteurs.etat?.value); } getMalusArmure() { - return Misc.toInt(this.data.data.attributs?.malusarmure?.value); + return Misc.toInt(Misc.templateData(this).attributs?.malusarmure?.value); } getEncTotal() { return Math.floor(this.encTotal ?? 0); @@ -227,11 +228,11 @@ export class RdDActor extends Actor { return Math.floor(this.prixTotalEquipement ?? 0); } getSurenc() { - return Misc.toInt(this.data.data.compteurs.surenc?.value); + return Misc.toInt(Misc.templateData(this).compteurs.surenc?.value); } /* -------------------------------------------- */ loadCompendiumNames() { - return this.data.items.filter((item) => item.type == 'competence'); + return this.data.items.filter(item => item.type == 'competence'); } /* -------------------------------------------- */ getCompetence(name) { @@ -271,11 +272,11 @@ export class RdDActor extends Actor { return duplicate(list[0]); } getDemiReve() { - return this.data.data.reve.tmrpos.coord; + return Misc.templateData(this).reve.tmrpos.coord; } /* -------------------------------------------- */ async deleteSortReserve(sortReserve) { - let reserve = duplicate(this.data.data.reve.reserve); + let reserve = duplicate(Misc.templateData(this).reve.reserve); let tmr = TMRUtility.getTMR(sortReserve.coord); let index = reserve.list.findIndex(tmr.type == 'fleuve' ? sort => (TMRUtility.getTMR(sort.coord).type == 'fleuve' && sort.sort.name == sortReserve.sort.name) @@ -308,7 +309,7 @@ export class RdDActor extends Actor { content: "" }; - const blessures = duplicate(this.data.data.blessures); + const blessures = duplicate(Misc.templateData(this).blessures); await this._recupererBlessures(message, "legere", blessures.legeres.liste.filter(b => b.active), []); await this._recupererBlessures(message, "grave", blessures.graves.liste.filter(b => b.active), blessures.legeres.liste); await this._recupererBlessures(message, "critique", blessures.critiques.liste.filter(b => b.active), blessures.graves.liste); @@ -381,9 +382,10 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async _recupererVie(message) { - let blessures = [].concat(this.data.data.blessures.legeres.liste).concat(this.data.data.blessures.graves.liste).concat(this.data.data.blessures.critiques.liste); + const tData = Misc.templateData(this); + let blessures = [].concat(tData.blessures.legeres.liste).concat(tData.blessures.graves.liste).concat(tData.blessures.critiques.liste); let nbBlessures = blessures.filter(b => b.active); - let vieManquante = this.data.data.sante.vie.max - this.data.data.sante.vie.value; + let vieManquante = tData.sante.vie.max - tData.sante.vie.value; if (nbBlessures == 0 && vieManquante > 0) { let bonusSoins = 0; for (let b of blessures) { @@ -407,8 +409,9 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async _jetRecuperationConstitution(bonusSoins, message = undefined) { - let difficulte = Misc.toInt(bonusSoins) + Math.min(0, this.data.data.sante.vie.value - this.data.data.sante.vie.max); - let rolled = await RdDResolutionTable.roll(this.data.data.carac.constitution.value, difficulte); + const tData = Misc.templateData(this); + let difficulte = Misc.toInt(bonusSoins) + Math.min(0, tData.sante.vie.value - tData.sante.vie.max); + let rolled = await RdDResolutionTable.roll(tData.carac.constitution.value, difficulte); if (message) { message.content += RdDResolutionTable.explain(rolled).replace(/Jet :/, "Constitution :"); } @@ -421,13 +424,14 @@ export class RdDActor extends Actor { whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: "Remise à neuf de " + this.name }; + const actorData = Misc.data(this); if (this.isEntiteCauchemar()) { - await this.santeIncDec("endurance", this.data.data.sante.endurance.max - this.data.data.sante.endurance.value); + await this.santeIncDec("endurance", actorData.data.sante.endurance.max - actorData.data.sante.endurance.value); } else { - if (this.data.data.blessures) { - const blessures = duplicate(this.data.data.blessures); + if (actorData.data.blessures) { + const blessures = duplicate(actorData.data.blessures); for (let listeBlessures of [blessures.legeres.liste, blessures.graves.liste, blessures.critiques.liste]) { for (let blessure of listeBlessures) { this._supprimerBlessure(blessure); @@ -439,9 +443,9 @@ export class RdDActor extends Actor { await this.setEthylisme(1); } - await this.santeIncDec("vie", this.data.data.sante.vie.max - this.data.data.sante.vie.value); - await this.santeIncDec("endurance", this.data.data.sante.endurance.max - this.data.data.sante.endurance.value); - if (this.data.data.sante.fatigue) { + await this.santeIncDec("vie", actorData.data.sante.vie.max - actorData.data.sante.vie.value); + await this.santeIncDec("endurance", actorData.data.sante.endurance.max - actorData.data.sante.endurance.value); + if (actorData.data.sante.fatigue) { await this.update({ "data.sante.fatigue.value": 0 }); } } @@ -469,7 +473,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async _recupererEthylisme(message) { - let ethylisme = duplicate(this.data.data.compteurs.ethylisme); + let ethylisme = duplicate(Misc.templateData(this).compteurs.ethylisme); ethylisme.nb_doses = 0; ethylisme.jet_moral = false; if (ethylisme.value < 1) { @@ -483,7 +487,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async recupereEndurance(message) { - const manquant = this._computeEnduranceMax() - this.data.data.sante.endurance.value; + const manquant = this._computeEnduranceMax() - Misc.templateData(this).sante.endurance.value; if (manquant > 0) { await this.santeIncDec("endurance", manquant); message.content += "Vous récuperez " + manquant + " points d'endurance. "; @@ -492,7 +496,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async recupererFatigue(message) { - let fatigue = this.data.data.sante.fatigue.value; + let fatigue = Misc.templateData(this).sante.fatigue.value; const fatigueMin = this._computeFatigueMin(); if (fatigue <= fatigueMin) { message.content += "Vous êtes déjà reposé. "; @@ -508,7 +512,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ _calculRecuperationSegment(actuel) { - const segments = RdDUtility.getSegmentsFatigue(this.data.data.sante.endurance.max); + const segments = RdDUtility.getSegmentsFatigue(Misc.templateData(this).sante.endurance.max); let cumul = 0; let i; for (i = 0; i < 11; i++) { @@ -528,7 +532,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async recuperationReve(message) { - const seuil = this.data.data.reve.seuil.value; + const seuil = Misc.templateData(this).reve.seuil.value; const reveActuel = this.getReveActuel(); if (reveActuel >= seuil) { message.content += `Vous avez suffisament rêvé, au delà de votre seuil. `; @@ -550,7 +554,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async retourSeuilDeReve(message) { - const seuil = this.data.data.reve.seuil.value; + const seuil = Misc.templateData(this).reve.seuil.value; const reveActuel = this.getReveActuel(); if (reveActuel > seuil) { message.content += `
Votre rêve redescend vers son seuil naturel (${seuil}, nouveau rêve actuel ${(reveActuel - 1)})`; @@ -640,7 +644,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async sortMisEnReserve(rollData, sort) { - let reserve = duplicate(this.data.data.reve.reserve.list); + let reserve = duplicate(Misc.templateData(this).reve.reserve.list); reserve.push({ coord: rollData.tmr.coord, sort: sort, draconic: duplicate(rollData.competence) }); await this.update({ "data.reve.reserve.list": reserve }); this.currentTMR.updateTokens(); @@ -648,24 +652,24 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async updateCarac(caracName, caracValue) { - let caracpath = "data.carac." + caracName + ".value" if (caracName == "force") { if (Number(caracValue) > this.getTaille() + 4) { ui.notifications.warn("Votre FORCE doit être au maximum de TAILLE+4"); return; } } + const actorData = Misc.data(this); if (caracName == "reve") { - if (caracValue > Misc.toInt(this.data.data.reve.seuil.value)) { + if (caracValue > Misc.toInt(actorData.data.reve.seuil.value)) { this.setPointsDeSeuil(caracValue); } } if (caracName == "chance") { - if (caracValue > Misc.toInt(this.data.data.compteurs.chance.value)) { + if (caracValue > Misc.toInt(actorData.data.compteurs.chance.value)) { this.setPointsDeChance(caracValue); } } - await this.update({ [caracpath]: caracValue }); + await this.update({ [`data.carac.${caracName}.value`]: caracValue }); } /* -------------------------------------------- */ @@ -673,8 +677,7 @@ export class RdDActor extends Actor { if (caracName == 'Taille') { return; } - let caracpath = "data.carac." + caracName + ".xp"; - await this.update({ [caracpath]: caracXP ?? 0 }); + await this.update({ [`data.carac.${caracName}.xp`]: caracXP ?? 0 }); this.checkCaracXP(caracName); } @@ -758,16 +761,12 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async updateCompteurValue(fieldName, fieldValue) { - let compteurs = duplicate(this.data.data.compteurs); - compteurs[fieldName].value = fieldValue; - await this.update({ "data.compteurs": compteurs }); + await this.update({ [`data.compteurs.${fieldName}.value`]: fieldValue }); } /* -------------------------------------------- */ - async updateProtectionValue(fieldName, fieldValue) { - let attributs = duplicate(this.data.data.attributs); - attributs[fieldName].value = fieldValue; - await this.update({ "data.attributs": attributs }); + async updateAttributeValue(fieldName, fieldValue) { + await this.update({ [`data.attributs.${fieldName}.value`]: fieldValue }); } /* -------------------------------------------- */ @@ -941,9 +940,9 @@ export class RdDActor extends Actor { detectSurEncombrement() { let maxEnc = 0; if (this.data.type == 'vehicule') - maxEnc = this.data.data.capacite_encombrement; + maxEnc = Misc.templateData(this).capacite_encombrement; else - maxEnc = this.data.data.attributs.encombrement.value; + maxEnc = Misc.templateData(this).attributs.encombrement.value; let diffEnc = Number(this.encTotal) - Number(maxEnc); return Math.max(0, Math.ceil(diffEnc)); } @@ -952,20 +951,19 @@ export class RdDActor extends Actor { async computeEncombrementTotalEtMalusArmure() { let encTotal = 0; let newMalusArmure = 0; - for (const item of this.data.items) { - if (item.type == 'armure' && item.data.equipe) { // Armure équipée, intégration du malus armure total - newMalusArmure += item.data.malus; + for (const itemData of this.data.items) { + if (itemData.type == 'armure' && itemData.data.equipe) { // Armure équipée, intégration du malus armure total + newMalusArmure += itemData.data.malus; } // Calcul encombrement - if (item.data && item.data.encombrement != undefined) { - if (!Number(item.data.encombrement)) item.data.encombrement = 0; // Auto-fix - if (item.data.quantite == undefined) item.data.quantite = 1; // Auto-fix - if (item.data.quantite < 0) item.data.quantite = 0; // Auto-fix - item.data.encTotal = Number(item.data.encombrement) * Number(item.data.quantite); - //console.log("Enc:", item.name, item.data.encombrement, item.data.quantite, item.data.encTotal); - encTotal += item.data.encTotal; + if (itemData.data && itemData.data.encombrement != undefined) { + if (!Number(itemData.data.encombrement)) itemData.data.encombrement = 0; // Auto-fix + if (itemData.data.quantite == undefined) itemData.data.quantite = 1; // Auto-fix + if (itemData.data.quantite < 0) itemData.data.quantite = 0; // Auto-fix + itemData.data.encTotal = Number(itemData.data.encombrement) * Number(itemData.data.quantite); + encTotal += itemData.data.encTotal; } else { - item.data.encTotal = 0; // Force default enc + itemData.data.encTotal = 0; // Force default enc } } // Mise à jour valeur totale et états @@ -973,8 +971,8 @@ export class RdDActor extends Actor { this.detectSurEncombrement(); // Mise à jour éventuelle du malus armure - if (this.data.data.attributs?.malusarmure && newMalusArmure != this.data.data.attributs.malusarmure.value) { - await this.update({ "data.attributs.malusarmure.value ": newMalusArmure }); + if (newMalusArmure && Misc.templateData(this).attributs?.malusarmure?.value != newMalusArmure) { + await this.updateAttributeValue("malusarmure", newMalusArmure); } return this.encTotal; } @@ -984,12 +982,12 @@ export class RdDActor extends Actor { let prixTotalEquipement = 0; // prix total de l'équipement est la somme du cout de chaque équipement multiplié par sa quantité. - for (const item of this.data.items) { - if (item.data && item.data.cout != undefined) { - if (!Number(item.data.cout)) item.data.cout = 0; // Auto-fix - if (item.data.quantite == undefined) item.data.quantite = 1; // Auto-fix - if (item.data.cout < 0) item.data.cout = 0; // Auto-fix - prixTotalEquipement += Number(item.data.cout) * Number(item.data.quantite); + for (const itemData of this.data.items) { + if (itemData.data && itemData.data.cout != undefined) { + if (!Number(itemData.data.cout)) itemData.data.cout = 0; // Auto-fix + if (itemData.data.quantite == undefined) itemData.data.quantite = 1; // Auto-fix + if (itemData.data.cout < 0) itemData.data.cout = 0; // Auto-fix + prixTotalEquipement += Number(itemData.data.cout) * Number(itemData.data.quantite); } } // Mise à jour valeur totale de l'équipement @@ -998,7 +996,8 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - computeResumeBlessure(blessures = this.data.data.blessures) { + computeResumeBlessure(blessures = undefined) { + blessures = blessures ?? Misc.templateData(this).blessures; let nbLegeres = this.countBlessures(blessures.legeres.liste); let nbGraves = this.countBlessures(blessures.graves.liste); let nbCritiques = this.countBlessures(blessures.critiques.liste); @@ -1027,30 +1026,32 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ computeEtatGeneral() { - let data = this.data.data; + const actorData = Misc.data(this); + console.info("computeEtatGeneral", actorData) + // Pas d'état général pour les entités forçage à 0 if (this.data.type == 'entite') { - data.compteurs.etat.value = 0; + actorData.data.compteurs.etat.value = 0; return; } // Pour les autres - let state = - (data.sante.vie.max - data.sante.vie.value); - if (data.sante.fatigue) { + let state = - (actorData.data.sante.vie.max - actorData.data.sante.vie.value); + if (actorData.data.sante.fatigue) { // Creatures n'ont pas de fatigue - state += RdDUtility.currentFatigueMalus(data.sante.fatigue.value, data.sante.endurance.max); + state += RdDUtility.currentFatigueMalus(actorData.data.sante.fatigue.value, actorData.data.sante.endurance.max); } // Ajout de l'éthylisme - state += Math.min(0, (data.compteurs.ethylisme?.value ?? 0)); + state += Math.min(0, (actorData.data.compteurs.ethylisme?.value ?? 0)); - data.compteurs.etat.value = state; - if (data.compteurs && data.compteurs.surenc) { - data.compteurs.surenc.value = - this.detectSurEncombrement(); + actorData.data.compteurs.etat.value = state; + if (actorData.data.compteurs && actorData.data.compteurs.surenc) { + actorData.data.compteurs.surenc.value = - this.detectSurEncombrement(); } } /* -------------------------------------------- */ async ajouterRefoulement(value = 1) { - let refoulement = this.data.data.reve.refoulement.value + value; + let refoulement = Misc.templateData(this).reve.refoulement.value + value; let total = new Roll("1d20").roll().total; if (total <= refoulement) { refoulement = 0; @@ -1076,7 +1077,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async ajouterQueue(options = { chat: false }) { let queue; - if (this.data.data.reve.reve.thanatosused) { + if (Misc.templateData(this).reve.reve.thanatosused) { queue = await RdDRollTables.getOmbre(); await this.update({ "data.reve.reve.thanatosused": false }); } @@ -1113,7 +1114,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ getTMRRencontres() { - return this.data.data.reve.rencontre.list; + return Misc.templateData(this).reve.rencontre.list; } /* -------------------------------------------- */ @@ -1137,7 +1138,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async deleteTMRRencontre(rencontreKey) { - let list = duplicate(this.data.data.reve.rencontre.list); + let list = duplicate(Misc.templateData(this).reve.rencontre.list); let newList = []; for (let i = 0; i < list.length; i++) { if (i != rencontreKey) @@ -1153,14 +1154,14 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async reveActuelIncDec(value) { - let reve = Math.max(this.data.data.reve.reve.value + value, 0); + let reve = Math.max(Misc.templateData(this).reve.reve.value + value, 0); await this.update({ "data.reve.reve.value": reve }); } /* -------------------------------------------- */ async updatePointDeSeuil(value = 1) { - const seuil = Misc.toInt(this.data.data.reve.seuil.value); - const reve = Misc.toInt(this.data.data.carac.reve.value); + const seuil = Misc.toInt(Misc.templateData(this).reve.seuil.value); + const reve = Misc.toInt(Misc.templateData(this).carac.reve.value); if (seuil < reve) { await this.setPointsDeSeuil(Math.min(seuil + value, reve)); } @@ -1173,17 +1174,17 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async setPointsDeChance(chance) { - await this.update({ "data.compteurs.chance.value": chance }); + await this.updateCompteurValue("chance", chance); } /* -------------------------------------------- */ getSonne() { - return !this.isEntiteCauchemar() && (this.data.data.sante.sonne?.value ?? false); + return !this.isEntiteCauchemar() && (Misc.templateData(this).sante.sonne?.value ?? false); } /* -------------------------------------------- */ getSonneRound() { - return !this.isEntiteCauchemar() && (this.data.data.sante.sonne?.round ?? false); + return !this.isEntiteCauchemar() && (Misc.templateData(this).sante.sonne?.round ?? false); } /* -------------------------------------------- */ @@ -1211,7 +1212,7 @@ export class RdDActor extends Actor { if (this.isEntiteCauchemar()) { return; } - let sonneData = duplicate(this.data.data.sante.sonne); + let sonneData = duplicate(Misc.templateData(this).sante.sonne); sonneData.value = sonne; sonneData.round = round; await this.update({ "data.sante.sonne": sonneData }); @@ -1222,7 +1223,7 @@ export class RdDActor extends Actor { if (this.isEntiteCauchemar()) { return 0; } - return RdDCarac.calculSConst(this.data.data.carac.constitution.value); + return RdDCarac.calculSConst(Misc.templateData(this).carac.constitution.value); } /* -------------------------------------------- */ @@ -1246,7 +1247,7 @@ export class RdDActor extends Actor { } async ajoutXpConstitution(xp) { - await this.update({ "data.carac.constitution.xp": Misc.toInt(this.data.data.carac.constitution.xp) + xp }); + await this.update({ "data.carac.constitution.xp": Misc.toInt(Misc.templateData(this).carac.constitution.xp) + xp }); } /* -------------------------------------------- */ @@ -1255,7 +1256,7 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ countBlessuresByName(name) { - return this.countBlessures(this.data.data.blessures[name].liste); + return this.countBlessures(Misc.templateData(this).blessures[name].liste); } /* -------------------------------------------- */ @@ -1264,8 +1265,9 @@ export class RdDActor extends Actor { myRoll.showDice = true; await RdDDice.show(myRoll); - let msgText = "Jet d'Endurance : " + myRoll.total + " / " + this.data.data.sante.endurance.value + "
"; - if (myRoll.total == 1 || (myRoll.total != 20 && myRoll.total <= this.data.data.sante.endurance.value)) { + const actorData = Misc.data(this); + let msgText = "Jet d'Endurance : " + myRoll.total + " / " + actorData.data.sante.endurance.value + "
"; + if (myRoll.total == 1 || (myRoll.total != 20 && myRoll.total <= actorData.data.sante.endurance.value)) { msgText += `${this.name} a réussi son Jet d'Endurance !`; if (myRoll.total == 1) { await this.ajoutXpConstitution(); @@ -1288,8 +1290,9 @@ export class RdDActor extends Actor { myRoll.showDice = true; await RdDDice.show(myRoll); - let msgText = "Jet de Vie : " + myRoll.total + " / " + this.data.data.sante.vie.value + "
"; - if (myRoll.total <= this.data.data.sante.vie.value) { + const actorData = Misc.data(this); + let msgText = "Jet de Vie : " + myRoll.total + " / " + actorData.data.sante.vie.value + "
"; + if (myRoll.total <= actorData.data.sante.vie.value) { msgText += "Jet réussi, pas de perte de point de vie (prochain jet dans 1 round pour 1 critique, SC minutes pour une grave)"; if (myRoll.total == 1) { msgText += "La durée entre 2 jets de vie est multipliée par 20 (20 rounds pour une critique, SCx20 minutes pour une grave)"; @@ -1311,7 +1314,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async santeIncDec(name, inc, isCritique = false) { - const sante = duplicate(this.data.data.sante); + const sante = duplicate(Misc.templateData(this).sante); let compteur = sante[name]; if (!compteur) { return; @@ -1361,29 +1364,30 @@ export class RdDActor extends Actor { } isDead() { - return !this.isEntiteCauchemar() && this.data.data.sante.vie.value < -this.getSConst() + return !this.isEntiteCauchemar() && Misc.templateData(this).sante.vie.value < -this.getSConst() } /* -------------------------------------------- */ _computeFatigueMin() { - return this.data.data.sante.endurance.max - this.data.data.sante.endurance.value; + return Misc.templateData(this).sante.endurance.max - Misc.templateData(this).sante.endurance.value; } /* -------------------------------------------- */ _computeEnduranceMax() { - let blessures = this.data.data.blessures; - let diffVie = this.data.data.sante.vie.max - this.data.data.sante.vie.value; - let maxEndVie = this.data.data.sante.endurance.max - (diffVie * 2); + const actorData = Misc.data(this); + let blessures = actorData.data.blessures; + let diffVie = actorData.data.sante.vie.max - actorData.data.sante.vie.value; + let maxEndVie = actorData.data.sante.endurance.max - (diffVie * 2); let nbGraves = this.countBlessures(blessures.graves.liste); let nbCritiques = this.countBlessures(blessures.critiques.liste); - let maxEndGraves = Math.floor(this.data.data.sante.endurance.max / (2 * nbGraves)); - let maxEndCritiques = nbCritiques > 0 ? 1 : this.data.data.sante.endurance.max; + let maxEndGraves = Math.floor(actorData.data.sante.endurance.max / (2 * nbGraves)); + let maxEndCritiques = nbCritiques > 0 ? 1 : actorData.data.sante.endurance.max; return Math.max(0, Math.min(maxEndVie, maxEndGraves, maxEndCritiques)); } /* -------------------------------------------- */ async manageBlessureFromSheet(gravite, index) { - let listBlessures = duplicate(this.data.data.blessures); + let listBlessures = duplicate(Misc.templateData(this).blessures); let blessure = listBlessures[gravite + "s"].liste[index]; blessure.active = !blessure.active; if (!blessure.active) { @@ -1394,7 +1398,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async setDataBlessureFromSheet(gravite, index, psoins, pcomplets, jours, loc) { - let listBlessures = duplicate(this.data.data.blessures); + let listBlessures = duplicate(Misc.templateData(this).blessures); let blessure = listBlessures[gravite + "s"].liste[index]; blessure.premiers_soins = psoins; blessure.soins_complets = pcomplets; @@ -1407,7 +1411,7 @@ export class RdDActor extends Actor { async jetDeMoral(situation) { let jetMoral = new Roll("1d20").roll(); RdDDice.show(jetMoral); - let moralActuel = Misc.toInt(this.data.data.compteurs.moral.value); + let moralActuel = Misc.toInt(Misc.templateData(this).compteurs.moral.value); const difficulte = 10 + moralActuel; const succes = jetMoral.total <= difficulte; @@ -1425,19 +1429,20 @@ export class RdDActor extends Actor { async moralIncDec(ajustementMoral) { if (ajustementMoral != 0) { - let moral = Misc.toInt(this.data.data.compteurs.moral.value) + ajustementMoral + const actorData = Misc.data(this); + let moral = Misc.toInt(actorData.data.compteurs.moral.value) + ajustementMoral if (moral > 3) { // exaltation - const exaltation = Misc.toInt(this.data.data.compteurs.exaltation.value) + moral - 3; - await this.update({ 'data.compteurs.exaltation.value': exaltation }); + const exaltation = Misc.toInt(actorData.data.compteurs.exaltation.value) + moral - 3; + await this.updateCompteurValue('exaltation', exaltation); } if (moral < -3) { // dissolution - const dissolution = Misc.toInt(this.data.data.compteurs.dissolution.value) + 3 - moral; - await this.update({ 'data.compteurs.dissolution.value': dissolution }); + const dissolution = Misc.toInt(actorData.data.compteurs.dissolution.value) + 3 - moral; + await this.updateCompteurValue('dissolution', dissolution); } moral = Math.max(-3, Math.min(moral, 3)); - await this.update({ 'data.compteurs.moral.value': moral }); + await this.updateCompteurValue('moral', moral); } - return this.data.data.compteurs.moral.value; + return actorData.data.compteurs.moral.value; } /* -------------------------------------------- */ @@ -1454,7 +1459,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async setEthylisme(degre) { - let ethylisme = duplicate(this.data.data.compteurs.ethylisme); + let ethylisme = duplicate(Misc.templateData(this).compteurs.ethylisme); ethylisme.value = degre; ethylisme.nb_doses = 0; if (degre == 1) { @@ -1465,10 +1470,11 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async ethylismeTest() { + const actorData = Misc.data(this); let rollData = { - vieValue: this.data.data.sante.vie.value, - etat: this.getEtatGeneral() - Math.min(0, this.data.data.compteurs.ethylisme.value), // Pour les jets d'Ethylisme, on ignore le degré d'éthylisme (p.162) - diffNbDoses: -Number(this.data.data.compteurs.ethylisme.nb_doses || 0), + vieValue: actorData.data.sante.vie.value, + etat: this.getEtatGeneral() - Math.min(0, actorData.data.compteurs.ethylisme.value), // Pour les jets d'Ethylisme, on ignore le degré d'éthylisme (p.162) + diffNbDoses: -Number(actorData.data.compteurs.ethylisme.nb_doses || 0), finalLevel: 0, diffConditions: 0, ajustementsConditions: CONFIG.RDD.ajustementsConditions, @@ -1480,7 +1486,8 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async performEthylisme(rollData) { - let ethylisme = duplicate(this.data.data.compteurs.ethylisme); + const actorData = Misc.data(this); + let ethylisme = duplicate(actorData.data.compteurs.ethylisme); // Je d'ethylisme let rollEthylisme = await RdDResolutionTable.roll(rollData.vieValue, rollData.finalLevel); @@ -1496,7 +1503,7 @@ export class RdDActor extends Actor { await this.santeIncDec("endurance", -enduranceLost); const ajustementEthylique = ethylisme.value; // Qui a bu boira (p 164) - let rollVolonte = await RdDResolutionTable.roll(this.data.data.carac.volonte.value, Math.min(ajustementEthylique, 0) + this.data.data.compteurs.moral.value); + let rollVolonte = await RdDResolutionTable.roll(actorData.data.carac.volonte.value, Math.min(ajustementEthylique, 0) + actorData.data.compteurs.moral.value); const quiABuBoira = (rollVolonte.isSuccess ? "vous êtes libre de continuer à boire ou pas." : "vous avez une envie irrépréssible de reprendre un verre."); @@ -1538,7 +1545,8 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async transformerStress() { - const stress = Misc.toInt(this.data.data.compteurs.stress.value); + const actorData = Misc.data(this); + const stress = Misc.toInt(actorData.data.compteurs.stress.value); if (stress <= 0) { return; } @@ -1546,8 +1554,8 @@ export class RdDActor extends Actor { const stressRoll = await this._stressRoll(this.getReveActuel()); const conversion = Math.floor(stress * stressRoll.factor / 100); - let dissolution = Math.max(0, Misc.toInt(this.data.data.compteurs.dissolution.value)); - let exaltation = Math.max(0, Misc.toInt(this.data.data.compteurs.exaltation.value)); + let dissolution = Math.max(0, Misc.toInt(actorData.data.compteurs.dissolution.value)); + let exaltation = Math.max(0, Misc.toInt(actorData.data.compteurs.exaltation.value)); const annule = Math.min(dissolution, exaltation); dissolution -= annule; exaltation -= annule; @@ -1555,7 +1563,7 @@ export class RdDActor extends Actor { let stressRollData = { alias: this.name, - selectedCarac: this.data.data.carac.reve, + selectedCarac: actorData.data.carac.reve, rolled: stressRoll, stress: stress, perte: Math.min(conversion, stress), @@ -1570,7 +1578,7 @@ export class RdDActor extends Actor { content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-transformer-stress.html`, stressRollData) }); - let compteurs = duplicate(this.data.data.compteurs); + let compteurs = duplicate(actorData.data.compteurs); compteurs.stress.value = Math.max(stress - stressRollData.perte - 1, 0); compteurs.experience.value += stressRollData.xp; compteurs.dissolution.value = dissolution - perteDissolution; @@ -1623,7 +1631,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async checkCaracXP(caracName) { - let carac = this.data.data.carac[caracName]; + let carac = Misc.templateData(this).carac[caracName]; if (carac && carac.xp > 0) { let xpNeeded = RdDCarac.getCaracNextXp(carac.value + 1); if (carac.xp >= xpNeeded) { @@ -1731,7 +1739,7 @@ export class RdDActor extends Actor { let bestDraconic = this.getBestDraconic(); for (let sort of sortList) { let voie = sort.data.draconic.toLowerCase(); - let draconic = draconicList.find(item => item.data.categorie == 'draconic' && item.name.toLowerCase().includes(voie)); + let draconic = draconicList.find(it => it.data.categorie == 'draconic' && it.name.toLowerCase().includes(voie)); if (sort.name.toLowerCase().includes('aura')) { draconic = bestDraconic; } @@ -1765,17 +1773,18 @@ export class RdDActor extends Actor { if (this.currentTMR) this.currentTMR.minimize(); // Hide let draconicList = this.filterDraconicList(sortList); + const actorData = Misc.data(this); let rollData = { - forceCarac: { 'reve': duplicate(this.data.data.carac.reve) }, - selectedCarac: duplicate(this.data.data.carac.reve), + forceCarac: { 'reve': duplicate(actorData.data.carac.reve) }, + selectedCarac: duplicate(actorData.data.carac.reve), draconicList: draconicList, sortList: sortList, competence: draconicList[0], selectedSort: sortList[0], tmr: TMRUtility.getTMR(coord), diffLibre: sortList[0].data.difficulte, // Per default at startup - coutreve: Array(20).fill().map((item, index) => 1 + index), - carac: { 'reve': duplicate(this.data.data.carac.reve) } + coutreve: Array(30).fill().map((item, index) => 1 + index), + carac: { 'reve': duplicate(actorData.data.carac.reve) } } if (this.currentTMR) this.currentTMR.minimize(); // Hide @@ -1863,7 +1872,7 @@ export class RdDActor extends Actor { rollData.show = {} rollData.depenseReve = Number(selectedSort.data.ptreve_reel); - let myReve = duplicate(this.data.data.reve.reve); + let reveActuel = Misc.templateData(this).reve.reve.value; if (rolled.isSuccess) { // Réussite du sort ! if (rolled.isPart) { rollData.depenseReve = Math.max(Math.floor(rollData.depenseReve / 2), 1); @@ -1872,9 +1881,9 @@ export class RdDActor extends Actor { rollData.depenseReve++; } if (rollData.competence.name.includes('Thanatos')) { // Si Thanatos - myReve.thanatosused = true; + await this.update({ "data.reve.reve.thanatosused": true }); } - if (myReve.value > rollData.depenseReve) { + if (reveActuel > rollData.depenseReve) { // Incrémenter/gére le bonus de case RdDItemSort.incrementBonusCase(this, selectedSort, rollData.tmr.coord); @@ -1890,15 +1899,15 @@ export class RdDActor extends Actor { } } else { if (rolled.isETotal) { // Echec total ! - rollData.depenseReve = Math.min(myReve.value, Math.floor(rollData.depenseReve * 1.5)) + rollData.depenseReve = Math.min(reveActuel, Math.floor(rollData.depenseReve * 1.5)) // TODO: mise en réserve d'un échec total... } else { rollData.depenseReve = 0 } } - myReve.value = Math.max(myReve.value - rollData.depenseReve, 0); - await this.update({ "data.reve.reve": myReve }); + reveActuel = Math.max(reveActuel - rollData.depenseReve, 0); + await this.update({ "data.reve.reve.value": reveActuel }); if (closeTMR) { this.currentTMR.close(); // Close TMR ! @@ -1908,7 +1917,7 @@ export class RdDActor extends Actor { // Final chat message RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-sort.html'); - if (myReve.value == 0) { // 0 points de reve + if (reveActuel == 0) { // 0 points de reve ChatMessage.create({ content: this.name + " est réduit à 0 Points de Rêve, et tombe endormi !" }); closeTMR = true; } @@ -1953,7 +1962,7 @@ export class RdDActor extends Actor { RdDItemCompetenceCreature.setRollDataCreature(rollData); } else { - rollData.carac = this.data.data.carac; + rollData.carac = Misc.templateData(this).carac; } console.log("rollCompetence !!!", rollData); @@ -1971,18 +1980,18 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async creerTacheDepuisLivre(item) { + const itemData = Misc.data(item); let tache = { name: "Lire " + item.name, type: 'tache', data: { carac: 'intellect', competence: 'Ecriture', - difficulte: item.data.data.difficulte, + difficulte: itemData.data.difficulte, periodicite: "60 minutes", fatigue: 2, - points_de_tache: item.data.data.points_de_tache, + points_de_tache: itemData.data.points_de_tache, points_de_tache_courant: 0, - description: "Lecture du livre " + item.name + - " - XP : " + item.data.data.xp + " - Compétences : " + item.data.data.competence + description: "Lecture du livre " + item.name + " - XP : " + itemData.data.xp + " - Compétences : " + itemData.data.competence } } await this.createOwnedItem(tache, { renderSheet: true }); @@ -2000,7 +2009,7 @@ export class RdDActor extends Actor { use: { libre: false, conditions: false }, carac: {} }; - rollData.carac[tache.data.carac] = duplicate(this.data.data.carac[tache.data.carac]); // Single carac + rollData.carac[tache.data.carac] = duplicate(Misc.templateData(this).carac[tache.data.carac]); // Single carac console.log("rollTache !!!", rollData); @@ -2035,6 +2044,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async _rollArt(artData, selected, oeuvre, callBackResult = r => this._resultArt(r)) { + const actorData = Misc.data(this); mergeObject(artData, { oeuvre: oeuvre, art: oeuvre.type, @@ -2042,12 +2052,12 @@ export class RdDActor extends Actor { diffLibre: - (oeuvre.data.niveau ?? 0), diffConditions: 0, use: { libre: false, conditions: true }, - selectedCarac: duplicate(this.data.data.carac[selected]) + selectedCarac: duplicate(actorData.data.carac[selected]) }); artData.competence.data.defaut_carac = selected; if (!artData.forceCarac) { artData.forceCarac = {}; - artData.forceCarac[selected] = duplicate(this.data.data.carac[selected]); + artData.forceCarac[selected] = duplicate(actorData.data.carac[selected]); } console.log("rollArt !!!", artData); @@ -2083,14 +2093,15 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async rollDanse(id) { + const actorData = Misc.data(this); const artData = { art: 'danse', verbe: 'Danser', forceCarac: {} }; const oeuvre = duplicate(this.getOeuvre(id, artData.art)); const selectedCarac = this._getCaracDanse(oeuvre); if (oeuvre.data.agilite) { - artData.forceCarac['agilite'] = duplicate(this.data.data.carac.agilite); + artData.forceCarac['agilite'] = duplicate(actorData.data.carac.agilite); } if (oeuvre.data.apparence) { - artData.forceCarac['apparence'] = duplicate(this.data.data.carac.apparence); + artData.forceCarac['apparence'] = duplicate(actorData.data.carac.apparence); } await this._rollArt(artData, selectedCarac, oeuvre); } @@ -2160,7 +2171,7 @@ export class RdDActor extends Actor { use: { libre: false, conditions: true, }, carac: {} }; - meditationData.carac["intellect"] = duplicate(this.data.data.carac["intellect"]); + meditationData.carac["intellect"] = duplicate(Misc.templateData(this).carac["intellect"]); console.log("rollMeditation !!!", meditationData); @@ -2238,21 +2249,20 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async chanceActuelleIncDec(value, limit = true) { - let chance = duplicate(this.data.data.compteurs.chance); - chance.value = Math.max(chance.value + value, 0); + chance = Math.max(Misc.templateData(this).compteurs.chance.value + value, 0); if (limit) { - chance.value = Math.min(chance.value, this.getChance()) + chance = Math.min(chance.value, this.getChance()) } - await this.update({ "data.compteurs.chance": chance }); + await this.updateCompteurValue("chance", chance); } /* -------------------------------------------- */ async appelDestinee(onSuccess = () => { }, onEchec = () => { }) { - if (this.data.data.compteurs.destinee?.value ?? 0 > 0) { + let destinee = Misc.templateData(this).compteurs.destinee?.value ?? 0; + if (destinee > 0) { ChatMessage.create({ content: `${this.name} a fait appel à la Destinée !` }); - let destinee = duplicate(this.data.data.compteurs.destinee); - destinee.value = destinee.value - 1; - await this.update({ "data.compteurs.destinee": destinee }); + destinee--; + await this.updateCompteurValue( "destinee", destinee); onSuccess(); } else { @@ -2266,8 +2276,9 @@ export class RdDActor extends Actor { if (this.isCreature()) { return 0; } + const actorData = Misc.data(this); // selon l'heure de naissance... - return game.system.rdd.calendrier.getAjustementAstrologique(this.data.data.heure, this.data.name); + return game.system.rdd.calendrier.getAjustementAstrologique(actorData.data.heure, this.name); } /* -------------------------------------------- */ checkDesirLancinant() { @@ -2301,7 +2312,7 @@ export class RdDActor extends Actor { xpCarac = Math.max(xpCarac, 1); } if (xpCarac > 0) { - let carac = duplicate(this.data.data.carac); + let carac = duplicate(Misc.templateData(this).carac); let selectedCarac = RdDActor._findCaracByName(carac, caracName); if (!selectedCarac.derivee) { selectedCarac.xp = Misc.toInt(selectedCarac.xp) + xpCarac; @@ -2322,7 +2333,7 @@ export class RdDActor extends Actor { async ajouteNombreAstral(data) { // Gestion expérience (si existante) data.competence = RdDItemCompetence.findCompetence(this.data.items, "astrologie"); - data.selectedCarac = this.data.data.carac["vue"]; + data.selectedCarac = Misc.templateData(this).carac["vue"]; this._appliquerAjoutExperience(data); // Ajout du nombre astral @@ -2333,8 +2344,8 @@ export class RdDActor extends Actor { await this.createEmbeddedEntity("OwnedItem", item); // Suppression des anciens nombres astraux - let toDelete = this.data.items.filter((item) => item.data.jourindex < game.system.rdd.calendrier.getCurrentDayIndex()); - const deletions = toDelete.map(i => i._id); + let toDelete = this.data.items.filter(it => it.data.jourindex < game.system.rdd.calendrier.getCurrentDayIndex()); + const deletions = toDelete.map(it => it._id); await this.deleteEmbeddedEntity("OwnedItem", deletions); // Affichage Dialog @@ -2364,7 +2375,7 @@ export class RdDActor extends Actor { type: "number" }; } - return RdDActor._findCaracByName(this.data.data.carac, caracName); + return RdDActor._findCaracByName(Misc.templateData(this).carac, caracName); } /* -------------------------------------------- */ @@ -2386,17 +2397,17 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ getSortList() { - return this.data.items.filter(item => item.type == "sort"); + return this.data.items.filter(it => it.type == "sort"); } /* -------------------------------------------- */ getDraconicList() { - return this.data.items.filter(item => item.data.categorie == 'draconic') + return this.data.items.filter(it => it.data.categorie == 'draconic') } /* -------------------------------------------- */ countMonteeLaborieuse() { // Return +1 par queue/ombre/souffle Montée Laborieuse présente - let countMonteeLaborieuse = this.data.items.filter(item => EffetsDraconiques.isMonteeLaborieuse(item)).length; + let countMonteeLaborieuse = this.data.items.filter(it => EffetsDraconiques.isMonteeLaborieuse(it)).length; if (countMonteeLaborieuse > 0) { ChatMessage.create({ content: `Vous êtes sous le coup d'une Montée Laborieuse : vos montées en TMR coûtent ${countMonteeLaborieuse} Point de Rêve de plus.`, @@ -2428,26 +2439,29 @@ export class RdDActor extends Actor { } } - let data = { + const actorData = Misc.data(this); + const fatigue = actorData.data.sante.fatigue.value; + const endurance = actorData.data.sante.endurance.max; + let tmrFormData = { mode: mode, fatigue: { - malus: RdDUtility.calculMalusFatigue(this.data.data.sante.fatigue.value, this.data.data.sante.endurance.max), - html: "" + RdDUtility.makeHTMLfatigueMatrix(this.data.data.sante.fatigue.value, this.data.data.sante.endurance.max).html() + "
" + malus: RdDUtility.calculMalusFatigue(fatigue, endurance), + html: "" + RdDUtility.makeHTMLfatigueMatrix(fatigue, endurance).html() + "
" }, draconic: this.getDraconicList(), sort: this.getSortList(), - caracReve: this.data.data.carac.reve.value, + caracReve: actorData.data.carac.reve.value, pointsReve: this.getReveActuel(), isRapide: isRapide } - let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html', data); - this.currentTMR = await RdDTMRDialog.create(html, this, data); + let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html', tmrFormData); + this.currentTMR = await RdDTMRDialog.create(html, this, tmrFormData); this.currentTMR.render(true); } /* -------------------------------------------- */ rollArme(compName, armeName = undefined) { - let arme = armeName ? this.data.items.find(item => item.name == armeName && RdDItemArme.isArme(item)) : undefined; + let arme = armeName ? this.data.items.find(it => it.name == armeName && RdDItemArme.isArme(it)) : undefined; let competence = this.getCompetence(compName); if (arme || armeName || (competence.type == 'competencecreature' && competence.data.iscombat)) { @@ -2474,11 +2488,12 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - verifierForceMin(item) { - if (item.type == 'arme' && item.data.force > this.data.data.carac.force.value) { + verifierForceMin(itemData) { + const actorData = Misc.data(this); + if (itemData.type == 'arme' && itemData.data.force > actorData.data.carac.force.value) { ChatMessage.create({ - content: `${this.name} s'est équipé(e) de l'arme ${item.name}, mais n'a pas une force suffisante pour l'utiliser normalement - (${item.data.force} nécessaire pour une Force de ${this.data.data.carac.force.value})` + content: `${this.name} s'est équipé(e) de l'arme ${itemData.name}, mais n'a pas une force suffisante pour l'utiliser normalement + (${itemData.data.force} nécessaire pour une Force de ${actorData.data.carac.force.value})` }); } } @@ -2486,30 +2501,32 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async equiperObjet(itemID) { let item = this.getOwnedItem(itemID); - if (item && item.data.data) { - let update = { _id: item._id, "data.equipe": !item.data.data.equipe }; + if (item?.data?.data) { + let itemData = Misc.itemData(item); + const isEquipe = !itemData.data.equipe; + let update = { _id: item._id, "data.equipe": isEquipe }; await this.updateEmbeddedEntity("OwnedItem", update); this.computeEncombrementTotalEtMalusArmure(); // Mise à jour encombrement this.computePrixTotalEquipement(); // Mis à jour du prix total de l'équipement - if (item.data.data.equipe) - this.verifierForceMin(item.data); + if (isEquipe) + this.verifierForceMin(itemData); } } /* -------------------------------------------- */ computeArmure(attackerRoll) { let dmg = (attackerRoll.dmg.dmgArme ?? 0) + (attackerRoll.dmg.dmgActor ?? 0); - let arme = attackerRoll.arme; + let armeData = attackerRoll.arme; let protection = 0; const armures = this.data.items.filter(it => it.type == "armure" && it.data.equipe); - for (const item of armures) { - protection += new Roll(item.data.protection.toString()).roll().total; + for (const itemData of armures) { + protection += new Roll(itemData.data.protection.toString()).roll().total; if (dmg > 0) { - this._deteriorerArmure(item, dmg); + this._deteriorerArmure(itemData, dmg); dmg = 0; } } - const penetration = arme ? Misc.toInt(arme.data.penetration) : 0; + const penetration = armeData ? Misc.toInt(armeData.data.penetration) : 0; protection = Math.max(protection - penetration, 0); protection += this.getProtectionNaturelle(); // Gestion des cas particuliers sur la fenêtre d'encaissement @@ -2528,24 +2545,24 @@ export class RdDActor extends Actor { if (!ReglesOptionelles.isUsing('deteriorationArmure')) { return; } - let update = duplicate(item); - update.data.deterioration = (update.data.deterioration ?? 0) + dmg; - if (update.data.deterioration >= 10) { - update.data.deterioration = 0; - let res = /\d+/.exec(update.data.protection); + let itemData = duplicate(Misc.itemData(item)); + itemData.data.deterioration = (itemData.data.deterioration ?? 0) + dmg; + if (itemData.data.deterioration >= 10) { + itemData.data.deterioration = 0; + let res = /\d+/.exec(itemData.data.protection); if (!res) { - update.data.protection = "1d" + update.data.protection; + itemData.data.protection = "1d" + itemData.data.protection; } - else if (res = /(\d+d\d+)(\-\d+)?/.exec(update.data.protection)) { + else if (res = /(\d+d\d+)(\-\d+)?/.exec(itemData.data.protection)) { let malus = Misc.toInt(res[2]) - 1; - update.data.protection = res[1] + malus; + itemData.data.protection = res[1] + malus; } else { ui.notifications.warn(`La valeur d'armure de votre ${item.name} est incorrecte`); } - ChatMessage.create({ content: "Votre armure s'est détériorée, elle protège maintenant de " + update.data.protection }); + ChatMessage.create({ content: "Votre armure s'est détériorée, elle protège maintenant de " + itemData.data.protection }); } - this.updateEmbeddedEntity("OwnedItem", update); + this.updateEmbeddedEntity("OwnedItem", itemData); } /* -------------------------------------------- */ @@ -2563,7 +2580,7 @@ export class RdDActor extends Actor { console.log("encaisserDommages", rollData) - let santeOrig = duplicate(this.data.data.sante); + let santeOrig = duplicate(Misc.templateData(this).sante); let encaissement = this.jetEncaissement(rollData); this.ajouterBlessure(encaissement); // Will upate the result table @@ -2575,10 +2592,11 @@ export class RdDActor extends Actor { this.computeEtatGeneral(); this.sheet.render(false); + const actorData = Misc.data(this); mergeObject(encaissement, { - alias: this.data.name, + alias: this.name, hasPlayerOwner: this.hasPlayerOwner, - resteEndurance: this.data.data.sante.endurance.value, + resteEndurance: actorData.data.sante.endurance.value, sonne: perteEndurance.sonne, jetEndurance: perteEndurance.jetEndurance, endurance: santeOrig.endurance.value - perteEndurance.newValue, @@ -2627,12 +2645,12 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ ajouterBlessure(encaissement) { - // Fast exit - if (this.data.type == 'entite') return; // Une entité n'a pas de blessures + const actorData = Misc.data(this); + if (actorData.type == 'entite') return; // Une entité n'a pas de blessures if (encaissement.legeres + encaissement.graves + encaissement.critiques == 0) return; - const endActuelle = Number(this.data.data.sante.endurance.value); - let blessures = duplicate(this.data.data.blessures); + const endActuelle = Number(actorData.data.sante.endurance.value); + let blessures = duplicate(actorData.data.blessures); let count = encaissement.legeres; // Manage blessures @@ -2741,11 +2759,12 @@ export class RdDActor extends Actor { } let rolled = await RdDResolutionTable.roll(this.getReveActuel(), - Number(entite.data.data.carac.niveau.value)); + const actorData = Misc.data(this); const rollData = { alias: this.name, rolled: rolled, entite: entite.name, - selectedCarac: this.data.data.carac.reve + selectedCarac: actorData.data.carac.reve }; if (rolled.isSuccess) { @@ -2767,7 +2786,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ isEntiteCauchemarAccordee(attaquant) { if (!this.isEntiteCauchemar()) { return true; } - let resonnance = this.data.data.sante.resonnance; + let resonnance = Misc.templateData(this).sante.resonnance; return (resonnance.actors.find(it => it == attaquant._id)); } @@ -2777,7 +2796,7 @@ export class RdDActor extends Actor { ui.notifications.error("Impossible de s'accorder à " + this.name + ": ce n'est pas une entite de cauchemer/rêve"); return; } - let resonnance = duplicate(this.data.data.sante.resonnance); + let resonnance = duplicate(Misc.templateData(this).sante.resonnance); if (resonnance.actors.find(it => it == attaquant._id)) { // déjà accordé return; @@ -2813,8 +2832,7 @@ export class RdDActor extends Actor { sumDenier = Number(sumDenier); let denierDisponible = 0; - let monnaie = this.data.items.filter(item => item.type == 'monnaie'); - for (let piece of monnaie) { + for (let piece of monnaies) { denierDisponible += piece.data.valeur_deniers * Number(piece.data.quantite); } console.log("DENIER", game.user.character, sumDenier, denierDisponible); @@ -2856,6 +2874,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async effectuerTacheAlchimie(recetteId, alchimieName, alchimieData) { let recette = this.data.items.find(item => item.type == 'recettealchimique' && item._id == recetteId); + const actorData = Misc.data(this); if (recette) { let competence = this.data.items.find(item => item.type == 'competence' && item.name.toLowerCase() == "alchimie"); let diffAlchimie = RdDAlchimie.getDifficulte(alchimieData); @@ -2865,10 +2884,10 @@ export class RdDActor extends Actor { diffLibre: diffAlchimie // Per default at startup } if (alchimieName == "couleur") { - rollData.selectedCarac = this.data.data.carac.vue, + rollData.selectedCarac = actorData.data.carac.vue, rollData.alchimieTexte = `Couleurs ${alchimieData} (${diffAlchimie}) (Malus de -4 si vous ne possédez pas de Cristal Alchimique)`; } else { - rollData.selectedCarac = this.data.data.carac.dexterite, + rollData.selectedCarac = actorData.data.carac.dexterite, rollData.alchimieTexte = `Consistances ${alchimieData} (${diffAlchimie})`; } @@ -2897,8 +2916,9 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ listeVehicules() { + const actorData = Misc.data(this); return this._buildActorLinksList( - this.data.data.subacteurs?.vehicules ?? [], + actorData.data.subacteurs?.vehicules ?? [], vehicle => { return { id: vehicle.id, name: vehicle.data.name, categorie: vehicle.data.data.categorie, @@ -2909,12 +2929,12 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ listeSuivants() { - return this._buildActorLinksList(this.data.data.subacteurs?.suivants ?? []); + return this._buildActorLinksList(Misc.templateData(this).subacteurs?.suivants ?? []); } /* -------------------------------------------- */ listeMontures() { - return this._buildActorLinksList(this.data.data.subacteurs?.montures ?? []); + return this._buildActorLinksList(Misc.templateData(this).subacteurs?.montures ?? []); } _buildActorLinksList(links, actorTransformation = it => { return { id: it.id, name: it.data.name, img: it.data.img }; }) { @@ -2936,16 +2956,17 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - addSubacteur(actorId) { - let actor = game.actors.get(actorId); + addSubacteur(subActorId) { + let subActor = game.actors.get(subActorId); //console.log("Ajout acteur : ", actor, this); - if (actor && actor.owner) { - if (actor.data.type == 'vehicule') { - this.pushSubacteur(actor, this.data.data.subacteurs.vehicules, 'data.subacteurs.vehicules', 'Ce Véhicule'); - } else if (actor.data.type == 'creature') { - this.pushSubacteur(actor, this.data.data.subacteurs.montures, 'data.subacteurs.montures', 'Cette Monture'); - } else if (actor.data.type == 'personnage') { - this.pushSubacteur(actor, this.data.data.subacteurs.suivants, 'data.subacteurs.suivants', 'Ce Suivant'); + if (subActor && subActor.owner) { + const actorData = Misc.data(this); + if (subActor.data.type == 'vehicule') { + this.pushSubacteur(subActor, actorData.data.subacteurs.vehicules, 'data.subacteurs.vehicules', 'Ce Véhicule'); + } else if (subActor.data.type == 'creature') { + this.pushSubacteur(subActor, actorData.data.subacteurs.montures, 'data.subacteurs.montures', 'Cette Monture'); + } else if (subActor.data.type == 'personnage') { + this.pushSubacteur(subActor, actorData.data.subacteurs.suivants, 'data.subacteurs.suivants', 'Ce Suivant'); } } else { ui.notifications.warn("Vous n'avez pas les droits sur l'acteur que vous attachez.") @@ -2954,9 +2975,10 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async removeSubacteur(actorId) { - let newVehicules = this.data.data.subacteurs.vehicules.filter(function (obj, index, arr) { return obj.id != actorId }); - let newSuivants = this.data.data.subacteurs.suivants.filter(function (obj, index, arr) { return obj.id != actorId }); - let newMontures = this.data.data.subacteurs.montures.filter(function (obj, index, arr) { return obj.id != actorId }); + const actorData = Misc.data(this); + let newVehicules = actorData.data.subacteurs.vehicules.filter(function (obj, index, arr) { return obj.id != actorId }); + let newSuivants = actorData.data.subacteurs.suivants.filter(function (obj, index, arr) { return obj.id != actorId }); + let newMontures = actorData.data.subacteurs.montures.filter(function (obj, index, arr) { return obj.id != actorId }); await this.update({ 'data.subacteurs.vehicules': newVehicules }); await this.update({ 'data.subacteurs.suivants': newSuivants }); await this.update({ 'data.subacteurs.montures': newMontures }); diff --git a/module/item-arme.js b/module/item-arme.js index 0d6ea65d..638a4320 100644 --- a/module/item-arme.js +++ b/module/item-arme.js @@ -1,4 +1,5 @@ import { RdDItemCompetenceCreature } from "./item-competencecreature.js" +import { Misc } from "./misc.js"; import { RdDCombatManager } from "./rdd-combat.js"; const nomCategorieParade = { @@ -17,16 +18,18 @@ const nomCategorieParade = { /* -------------------------------------------- */ export class RdDItemArme extends Item { - static isArme(item) { - return (item.type == 'competencecreature' && item.data.iscombat) || item.type == 'arme'; + static isArme(itemData) { + itemData = Misc.data(itemData); + return (itemData.type == 'competencecreature' && itemData.data.iscombat) || itemData.type == 'arme'; } /* -------------------------------------------- */ - static getArmeData(item) { - switch (item ? item.data.type : '') { - case 'arme': return item.data; + static getArmeData(armeData) { + armeData = Misc.data(armeData); + switch (armeData ? armeData.type : '') { + case 'arme': return armeData; case 'competencecreature': - return RdDItemCompetenceCreature.toArme(item.data); + return RdDItemCompetenceCreature.toArme(armeData); } return RdDItemArme.mainsNues(); } @@ -61,21 +64,22 @@ export class RdDItemArme extends Item { } /* -------------------------------------------- */ - static getCategorieParade(arme) { - if (arme.data.categorie_parade) { - return arme.data.categorie_parade; + static getCategorieParade(armeData) { + armeData = Misc.data(armeData); + if (armeData.data.categorie_parade) { + return armeData.data.categorie_parade; } // pour compatibilité avec des personnages existants - if (arme.type == 'competencecreature' || arme.data.categorie == 'creature') { - return arme.data.categorie_parade || (arme.data.isparade ? 'sans-armes' : ''); + if (armeData.type == 'competencecreature' || armeData.data.categorie == 'creature') { + return armeData.data.categorie_parade || (armeData.data.isparade ? 'sans-armes' : ''); } - if (!arme.type.match(/arme|competencecreature/)) { + if (!armeData.type.match(/arme|competencecreature/)) { return ''; } - if (arme.data.competence == undefined) { + if (armeData.data.competence == undefined) { return 'competencecreature'; } - let compname = arme.data.competence.toLowerCase(); + let compname = armeData.data.competence.toLowerCase(); if (compname.match(/^(dague de jet|javelot|fouet|arc|arbalête|fronde|hache de jet|fléau)$/)) return ''; if (compname.match('hache')) return 'haches'; @@ -84,9 +88,9 @@ export class RdDItemArme extends Item { if (compname.match('bouclier')) return 'boucliers'; if (compname.match('masse')) return 'masses'; if (compname.match('epée') || compname.match('épée')) { - if (arme.name.toLowerCase().match(/(gnome)/)) + if (armeData.name.toLowerCase().match(/(gnome)/)) return 'epees-courtes'; - if (arme.name.toLowerCase().match(/((e|é)pée dragone|esparlongue|demi-dragonne)/)) + if (armeData.name.toLowerCase().match(/((e|é)pée dragone|esparlongue|demi-dragonne)/)) return 'epees-longues'; return 'epees-lourdes'; } @@ -131,33 +135,35 @@ export class RdDItemArme extends Item { } /* -------------------------------------------- */ - static armeUneOuDeuxMains(arme, aUneMain) { - if (arme) { - arme.data.unemain = arme.data.unemain || !arme.data.deuxmains; - const uneOuDeuxMains = arme.data.unemain && arme.data.deuxmains; - const containsSlash = !Number.isInteger(arme.data.dommages) && arme.data.dommages.includes("/"); + static armeUneOuDeuxMains(armeData, aUneMain) { + armeData = Misc.data(armeData); + if (armeData) { + armeData.data.unemain = armeData.data.unemain || !armeData.data.deuxmains; + const uneOuDeuxMains = armeData.data.unemain && armeData.data.deuxmains; + const containsSlash = !Number.isInteger(armeData.data.dommages) && armeData.data.dommages.includes("/"); if (containsSlash) { // Sanity check - arme = duplicate(arme); + armeData = duplicate(armeData); - const tableauDegats = arme.data.dommages.split("/"); + const tableauDegats = armeData.data.dommages.split("/"); if (aUneMain) - arme.data.dommagesReels = Number(tableauDegats[0]); + armeData.data.dommagesReels = Number(tableauDegats[0]); else // 2 mains - arme.data.dommagesReels = Number(tableauDegats[1]); + armeData.data.dommagesReels = Number(tableauDegats[1]); } else { - arme.data.dommagesReels = Number(arme.data.dommages); + armeData.data.dommagesReels = Number(armeData.data.dommages); } if (uneOuDeuxMains != containsSlash) { - ui.notifications.info("Les dommages de l'arme à 1/2 mains " + arme.name + " ne sont pas corrects (ie sous la forme X/Y)"); + ui.notifications.info("Les dommages de l'arme à 1/2 mains " + armeData.name + " ne sont pas corrects (ie sous la forme X/Y)"); } } - return arme; + return armeData; } - static isArmeUtilisable(item) { - return item.type == 'arme' && item.data.equipe && (item.data.resistance > 0 || item.data.portee_courte > 0); + static isArmeUtilisable(itemData) { + itemData = Misc.data(itemData); + return itemData.type == 'arme' && itemData.data.equipe && (itemData.data.resistance > 0 || itemData.data.portee_courte > 0); } static ajoutCorpsACorps(armes, competences, carac) { diff --git a/module/item-competence.js b/module/item-competence.js index 98a422f6..a399e6fd 100644 --- a/module/item-competence.js +++ b/module/item-competence.js @@ -148,7 +148,7 @@ export class RdDItemCompetence extends Item { static computeCompetenceXPCost(competence) { let xp = RdDItemCompetence.getDeltaXp(competence.data.base, competence.data.niveau ?? competence.data.base); xp += competence.data.xp ?? 0; - if ( competence.name.includes('Thanatos') ) xp *= 2; /// Thanatos compte double ! + if (competence.name.includes('Thanatos')) xp *= 2; /// Thanatos compte double ! xp += competence.data.xp_sort ?? 0; return xp; } @@ -158,33 +158,33 @@ export class RdDItemCompetence extends Item { let economie = 0; for (let troncList of competenceTroncs) { let list = troncList.map(name => RdDItemCompetence.findCompetence(competences, name)) - .sort( (c1, c2) => c2.data.niveau - c1.data.niveau); // tri du plus haut au plus bas - list.splice(0,1); // ignorer la plus élevée + .sort((c1, c2) => c2.data.niveau - c1.data.niveau); // tri du plus haut au plus bas + list.splice(0, 1); // ignorer la plus élevée list.forEach(c => { - economie += RdDItemCompetence.getDeltaXp(c.data.base, Math.min(c.data.niveau, 0) ); + economie += RdDItemCompetence.getDeltaXp(c.data.base, Math.min(c.data.niveau, 0)); }); } return economie; } - static levelUp(item) { - item.data.xpNext = RdDItemCompetence.getCompetenceNextXp(item.data.niveau); - item.data.isLevelUp = item.data.xp >= item.data.xpNext; + static levelUp(itemData) { + itemData.data.xpNext = RdDItemCompetence.getCompetenceNextXp(itemData.data.niveau); + itemData.data.isLevelUp = itemData.data.xp >= itemData.data.xpNext; } - static isVisible(item) { - return Number(item.data.niveau) != RdDItemCompetence.getNiveauBase(item.data.categorie); + static isVisible(itemData) { + return Number(itemData.data.niveau) != RdDItemCompetence.getNiveauBase(itemData.data.categorie); } - + /* -------------------------------------------- */ - static isNiveauBase(item) { - return Number(item.data.niveau) == RdDItemCompetence.getNiveauBase(item.data.categorie); + static isNiveauBase(itemData) { + return Number(itemData.data.niveau) == RdDItemCompetence.getNiveauBase(itemData.data.categorie); } /* -------------------------------------------- */ static findCompetence(list, name) { name = name.toLowerCase(); - return list.find(item => item.name.toLowerCase() == name && (item.type == "competence" || item.type == "competencecreature")) + return list.find(it => it.name.toLowerCase() == name && (it.type == "competence" || it.type == "competencecreature")) } /* -------------------------------------------- */ @@ -206,26 +206,26 @@ export class RdDItemCompetence extends Item { } /* -------------------------------------------- */ - static _valideNiveau(niveau){ + static _valideNiveau(niveau) { if (niveau < -11 || niveau > competence_niveau_max) { console.warn(`Niveau ${niveau} en dehors des niveaux de compétences: [-11, ${competence_niveau_max} ]`); } } - + /* -------------------------------------------- */ static computeResumeArchetype(competences) { const archetype = RdDItemCompetence.getLimitesArchetypes(); - competences.forEach(item => { - let niveau = (item.data.niveau_archetype < 0) ? 0 : item.data.niveau_archetype; + competences.forEach(it => { + let niveau = Math.max(0, it.data.niveau_archetype); archetype[niveau] = archetype[niveau] ?? { "niveau": niveau, "nombreMax": 0, "nombre": 0 }; archetype[niveau].nombre = (archetype[niveau]?.nombre ?? 0) + 1; }); return archetype; } - /* -------------------------------------------- */ - static getLimitesArchetypes() { - return duplicate(limitesArchetypes); - } - + /* -------------------------------------------- */ + static getLimitesArchetypes() { + return duplicate(limitesArchetypes); + } + } \ No newline at end of file diff --git a/module/item-competencecreature.js b/module/item-competencecreature.js index 3835bc12..e6140035 100644 --- a/module/item-competencecreature.js +++ b/module/item-competencecreature.js @@ -1,3 +1,5 @@ +import { Misc } from "./misc.js"; + /* -------------------------------------------- */ export class RdDItemCompetenceCreature extends Item { @@ -15,12 +17,13 @@ export class RdDItemCompetenceCreature extends Item { } /* -------------------------------------------- */ - static toArme(item) { - if (RdDItemCompetenceCreature.isCompetenceAttaque(item)) { - let arme = { name: item.name, data: duplicate(item.data) }; + static toArme(itemData) { + if (RdDItemCompetenceCreature.isCompetenceAttaque(itemData)) { + itemData = Misc.data(itemData); + let arme = { name: itemData.name, data: duplicate(itemData) }; mergeObject(arme.data, { - competence: item.name, + competence: itemData.name, resistance: 100, equipe: true, penetration: 0, @@ -29,17 +32,19 @@ export class RdDItemCompetenceCreature extends Item { }); return arme; } - console.error("RdDItemCompetenceCreature.toArme(", item, ") : impossible de transformer l'Item en arme"); + console.error("RdDItemCompetenceCreature.toArme(", itemData, ") : impossible de transformer l'Item en arme"); return undefined; } /* -------------------------------------------- */ - static isCompetenceAttaque(item) { - return item.type == 'competencecreature' && item.data.iscombat; + static isCompetenceAttaque(itemData) { + itemData = Misc.data(itemData); + return itemData.type == 'competencecreature' && itemData.data.iscombat; } - + /* -------------------------------------------- */ - static isCompetenceParade(item) { - return item.type == 'competencecreature' && item.data.isparade; + static isCompetenceParade(itemData) { + itemData = Misc.data(itemData); + return itemData.type == 'competencecreature' && itemData.data.isparade; } } diff --git a/module/item-rdd.js b/module/item-rdd.js index 362cb61e..cb86ecaa 100644 --- a/module/item-rdd.js +++ b/module/item-rdd.js @@ -1,3 +1,4 @@ +import { Misc } from "./misc.js"; import { RdDUtility } from "./rdd-utility.js"; /* -------------------------------------------- */ @@ -7,7 +8,8 @@ export class RdDItem extends Item { async postItem() { console.log(this); const properties = this[`_${this.data.type}ChatData`](); - let chatData = duplicate(this.data); + const itemData = Misc.data(this); + let chatData = duplicate(itemData); chatData["properties"] = properties //Check if the posted item should have availability/pay buttons @@ -49,17 +51,17 @@ export class RdDItem extends Item { { if (this.isOwned) { - if (this.data.data.quantite == 0) + if (itemData.data.quantite == 0) dialogResult[0] = -1 - else if (this.data.data.quantite < dialogResult[0]) + else if (itemData.data.quantite < dialogResult[0]) { - dialogResult[0] = this.data.data.quantite; + dialogResult[0] = itemData.data.quantite; ui.notifications.notify(`Impossible de poster plus que ce que vous avez. La quantité à été réduite à ${dialogResult[0]}.`) this.update({"data.quantite" : 0}) } else { ui.notifications.notify(`Quantité réduite par ${dialogResult[0]}.`) - this.update({"data.quantite" : this.data.data.quantite - dialogResult[0]}) + this.update({"data.quantite" : itemData.data.quantite - dialogResult[0]}) } } } @@ -84,7 +86,7 @@ export class RdDItem extends Item { chatData.jsondata = JSON.stringify( { compendium : "postedItem", - payload: this.data, + payload: itemData, }); renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-item.html', chatData).then(html => { @@ -95,217 +97,217 @@ export class RdDItem extends Item { /* -------------------------------------------- */ _objetChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Encombrement: ${data.encombrement}` + `Encombrement: ${rddData.encombrement}` ] return properties; } /* -------------------------------------------- */ _armeChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Compétence: ${data.competence}`, - `Dommages: ${data.dommages}`, - `Force minimum: ${data.force}`, - `Resistance: ${data.resistance}`, - `Encombrement: ${data.encombrement}` + `Compétence: ${rddData.competence}`, + `Dommages: ${rddData.dommages}`, + `Force minimum: ${rddData.force}`, + `Resistance: ${rddData.resistance}`, + `Encombrement: ${rddData.encombrement}` ] return properties; } /* -------------------------------------------- */ _conteneurChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Capacité: ${data.capacite} Enc.`, - `Encombrement: ${data.encombrement}` + `Capacité: ${rddData.capacite} Enc.`, + `Encombrement: ${rddData.encombrement}` ] return properties; } /* -------------------------------------------- */ _munitionChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Encombrement: ${data.encombrement}` + `Encombrement: ${rddData.encombrement}` ] return properties; } /* -------------------------------------------- */ _armureChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Protection: ${data.protection}`, - `Détérioration: ${data.deterioration}`, - `Malus armure: ${data.malus}`, - `Encombrement: ${data.encombrement}` + `Protection: ${rddData.protection}`, + `Détérioration: ${rddData.deterioration}`, + `Malus armure: ${rddData.malus}`, + `Encombrement: ${rddData.encombrement}` ] return properties; } /* -------------------------------------------- */ _competenceChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Catégorie: ${data.categorie}`, - `Niveau: ${data.niveau}`, - `Caractéristique par défaut: ${data.carac_defaut}`, - `XP: ${data.xp}` + `Catégorie: ${rddData.categorie}`, + `Niveau: ${rddData.niveau}`, + `Caractéristique par défaut: ${rddData.carac_defaut}`, + `XP: ${rddData.xp}` ] return properties; } /* -------------------------------------------- */ _competencecreatureChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Catégorie: ${data.categorie}`, - `Niveau: ${data.niveau}`, - `Caractéristique: ${data.carac_value}`, - `XP: ${data.xp}` + `Catégorie: ${rddData.categorie}`, + `Niveau: ${rddData.niveau}`, + `Caractéristique: ${rddData.carac_value}`, + `XP: ${rddData.xp}` ] return properties; } /* -------------------------------------------- */ _sortChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Draconic: ${data.draconic}`, - `Difficulté: ${data.difficulte}`, - `Case TMR: ${data.caseTMR}`, - `Points de Rêve: ${data.ptreve}` + `Draconic: ${rddData.draconic}`, + `Difficulté: ${rddData.difficulte}`, + `Case TMR: ${rddData.caseTMR}`, + `Points de Rêve: ${rddData.ptreve}` ] return properties; } /* -------------------------------------------- */ _herbeChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Milieu: ${data.milieu}`, - `Rareté: ${data.rarete}`, - `Catégorie: ${data.categorie}`, + `Milieu: ${rddData.milieu}`, + `Rareté: ${rddData.rarete}`, + `Catégorie: ${rddData.categorie}`, ] return properties; } /* -------------------------------------------- */ _ingredientChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Milieu: ${data.milieu}`, - `Rareté: ${data.rarete}`, - `Catégorie: ${data.categorie}`, + `Milieu: ${rddData.milieu}`, + `Rareté: ${rddData.rarete}`, + `Catégorie: ${rddData.categorie}`, ] return properties; } /* -------------------------------------------- */ _tacheChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Caractéristique: ${data.carac}`, - `Compétence: ${data.competence}`, - `Périodicité: ${data.periodicite}`, - `Fatigue: ${data.fatigue}`, - `Difficulté: ${data.difficulte}`, - `Points de Tâche: ${data.points_de_tache}`, - `Points de Tâche atteints: ${data.points_de_tache_courant}` + `Caractéristique: ${rddData.carac}`, + `Compétence: ${rddData.competence}`, + `Périodicité: ${rddData.periodicite}`, + `Fatigue: ${rddData.fatigue}`, + `Difficulté: ${rddData.difficulte}`, + `Points de Tâche: ${rddData.points_de_tache}`, + `Points de Tâche atteints: ${rddData.points_de_tache_courant}` ] return properties; } /* -------------------------------------------- */ _livreChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Compétence: ${data.competence}`, - `Auteur: ${data.auteur}`, - `Difficulté: ${data.difficulte}`, - `Points de Tâche: ${data.points_de_tache}`, - `Encombrement: ${data.encombrement}` + `Compétence: ${rddData.competence}`, + `Auteur: ${rddData.auteur}`, + `Difficulté: ${rddData.difficulte}`, + `Points de Tâche: ${rddData.points_de_tache}`, + `Encombrement: ${rddData.encombrement}` ] return properties; } /* -------------------------------------------- */ _potionChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Rareté: ${data.rarete}`, - `Catégorie: ${data.categorie}`, - `Encombrement: ${data.encombrement}`, + `Rareté: ${rddData.rarete}`, + `Catégorie: ${rddData.categorie}`, + `Encombrement: ${rddData.encombrement}`, ] return properties; } /* -------------------------------------------- */ _queueChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Refoulement: ${data.refoulement}` + `Refoulement: ${rddData.refoulement}` ] return properties; } /* -------------------------------------------- */ _ombreChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Refoulement: ${data.refoulement}` + `Refoulement: ${rddData.refoulement}` ] return properties; } /* -------------------------------------------- */ _souffleChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = []; return properties; } /* -------------------------------------------- */ _teteChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = []; return properties; } /* -------------------------------------------- */ _tarotChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Concept: ${data.concept}`, - `Aspect: ${data.aspect}`, + `Concept: ${rddData.concept}`, + `Aspect: ${rddData.aspect}`, ] return properties; } /* -------------------------------------------- */ _nombreastralChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Valeur: ${data.value}`, - `Jour: ${data.jourlabel}`, + `Valeur: ${rddData.value}`, + `Jour: ${rddData.jourlabel}`, ] return properties; } /* -------------------------------------------- */ _monnaieChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Valeur en Deniers: ${data.valeur_deniers}`, - `Encombrement: ${data.encombrement}` + `Valeur en Deniers: ${rddData.valeur_deniers}`, + `Encombrement: ${rddData.encombrement}` ] return properties; } /* -------------------------------------------- */ _meditationChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Thème: ${data.theme}`, - `Compétence: ${data.competence}`, - `Support: ${data.support}`, - `Heure: ${data.heure}`, - `Purification: ${data.purification}`, - `Vêture: ${data.veture}`, - `Comportement: ${data.comportement}`, - `Case TMR: ${data.tmr}` + `Thème: ${rddData.theme}`, + `Compétence: ${rddData.competence}`, + `Support: ${rddData.support}`, + `Heure: ${rddData.heure}`, + `Purification: ${rddData.purification}`, + `Vêture: ${rddData.veture}`, + `Comportement: ${rddData.comportement}`, + `Case TMR: ${rddData.tmr}` ] return properties; } /* -------------------------------------------- */ _casetmrChatData() { - const data = duplicate(this.data.data); + const rddData = Misc.data(this).data; let properties = [ - `Coordonnée: ${data.coord}`, - `Spécificité: ${data.specific}` + `Coordonnée: ${rddData.coord}`, + `Spécificité: ${rddData.specific}` ] return properties; } diff --git a/module/item-sheet.js b/module/item-sheet.js index 1808ec81..b51cb2ab 100644 --- a/module/item-sheet.js +++ b/module/item-sheet.js @@ -3,6 +3,7 @@ import { RdDUtility } from "./rdd-utility.js"; import { RdDItem } from "./item-rdd.js"; import { RdDAlchimie } from "./rdd-alchimie.js"; import { RdDItemCompetence } from "./item-competence.js"; +import { Misc } from "./misc.js"; /** * Extend the basic ItemSheet with some very simple modifications @@ -30,7 +31,7 @@ export class RdDItemSheet extends ItemSheet { { class: "post", icon: "fas fa-comment", - onclick: ev => new RdDItem(this.item.data).postItem() + onclick: ev => new RdDItem(Misc.data(this.item)).postItem() }) return buttons } diff --git a/module/misc.js b/module/misc.js index 8f972c7b..fcc89b22 100644 --- a/module/misc.js +++ b/module/misc.js @@ -6,26 +6,24 @@ export class Misc { static isFunction(v) { return v && {}.toString.call(v) === '[object Function]'; - } + } static upperFirst(text) { return text.charAt(0).toUpperCase() + text.slice(1); } - static toSignedString(number){ + static toSignedString(number) { const value = parseInt(number) const isPositiveNumber = value != NaN && value > 0; - return isPositiveNumber ? "+"+number : number + return isPositiveNumber ? "+" + number : number } /** * Converts the value to an integer, or to 0 if undefined/null/not representing integer * @param {*} value value to convert to an integer using parseInt */ - static toInt(value) - { - if (value == undefined) - { + static toInt(value) { + if (value == undefined) { return 0; } const parsed = parseInt(value); @@ -78,4 +76,25 @@ export class Misc { return [...new Set(array)]; } + static actorData(actor) { + return Misc.data(actor); + } + + static itemData(item) { + return Misc.data(item); + } + + static data(it) { + if (it instanceof Item) { + return it.data; + } + if (it instanceof Actor) { + return it.data; + } + return it; + } + + static templateData(it) { + return Misc.data(it)?.data ?? {} + } } \ No newline at end of file diff --git a/module/rdd-astrologie-joueur.js b/module/rdd-astrologie-joueur.js index eccad906..b1d6d45c 100644 --- a/module/rdd-astrologie-joueur.js +++ b/module/rdd-astrologie-joueur.js @@ -1,4 +1,5 @@ import { RdDItemCompetence } from "./item-competence.js"; +import { Misc } from "./misc.js"; /** @@ -61,7 +62,7 @@ export class RdDAstrologieJoueur extends Dialog { /* -------------------------------------------- */ requestJetAstrologie( ) { let data = { id: this.actor.data._id, - carac_vue: this.actor.data.data.carac['vue'].value, + carac_vue: Misc.data(this.actor).data.carac['vue'].value, etat: this.dataNombreAstral.etat, astrologie: this.dataNombreAstral.astrologie, conditions: $("#diffConditions").val(), diff --git a/module/rdd-combat.js b/module/rdd-combat.js index e668de44..79ea86d7 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -82,22 +82,22 @@ export class RdDCombatManager extends Combat { if (!rollFormula) { let armeCombat, competence; if (c.actor.data.type == 'creature' || c.actor.data.type == 'entite') { - for (const competenceItem of c.actor.data.items) { - if (competenceItem.data.iscombat) { - competence = duplicate(competenceItem); + for (const competenceItemData of c.actor.data.items) { + if (competenceItemData.data.iscombat) { + competence = duplicate(competenceItemData); } } rollFormula = "2+( (" + RdDCombatManager.calculInitiative(competence.data.niveau, competence.data.carac_value) + ")/100)"; } else { - for (const item of c.actor.data.items) { - if (item.type == "arme" && item.data.equipe) { - armeCombat = duplicate(item); + for (const itemData of c.actor.data.items) { + if (itemData.type == "arme" && itemData.data.equipe) { + armeCombat = duplicate(itemData); } } let compName = (armeCombat == undefined) ? "Corps à corps" : armeCombat.data.competence; competence = RdDItemCompetence.findCompetence(c.actor.data.items, compName); let bonusEcaille = (armeCombat && armeCombat.data.magique) ? armeCombat.data.ecaille_efficacite : 0; - rollFormula = "2+( (" + RdDCombatManager.calculInitiative(competence.data.niveau, c.actor.data.data.carac[competence.data.defaut_carac].value, bonusEcaille) + ")/100)"; + rollFormula = "2+( (" + RdDCombatManager.calculInitiative(competence.data.niveau, Misc.data(c.actor).data.carac[competence.data.defaut_carac].value, bonusEcaille) + ")/100)"; } } //console.log("Combatat", c); @@ -192,7 +192,7 @@ export class RdDCombatManager extends Combat { .concat(RdDItemArme.mainsNues()); let competences = items.filter(it => it.type == 'competence'); - actions = actions.concat(RdDCombatManager.finalizeArmeList(armes, competences, combatant.actor.data.data.carac)); + actions = actions.concat(RdDCombatManager.finalizeArmeList(armes, competences, Misc.data(combatant.actor).data.carac)); actions.push({ name: "Draconic", data: { initOnly: true, competence: "Draconic" } }); } @@ -293,7 +293,7 @@ export class RdDCombatManager extends Combat { initOffset = 5; } } else { - caracForInit = combatant.actor.data.data.carac[competence.data.defaut_carac].value; + caracForInit = Misc.data(combatant.actor).data.carac[competence.data.defaut_carac].value; if (competence.data.categorie == "lancer") { // Offset de principe pour les armes de jet initOffset = 4; } @@ -861,7 +861,7 @@ export class RdDCombat { /* -------------------------------------------- */ _filterArmesParade(defender, competence) { let items = defender.data.items; - items = items.filter(item => RdDItemArme.isArmeUtilisable(item) || RdDItemCompetenceCreature.isCompetenceParade(item)); + items = items.filter(it => RdDItemArme.isArmeUtilisable(it) || RdDItemCompetenceCreature.isCompetenceParade(it)); for (let item of items) { item.data.nbUsage = defender.getItemUse(item._id); // Ajout du # d'utilisation ce round } diff --git a/module/rdd-roll.js b/module/rdd-roll.js index 07462460..4f796a60 100644 --- a/module/rdd-roll.js +++ b/module/rdd-roll.js @@ -38,18 +38,19 @@ export class RdDRoll extends Dialog { /* -------------------------------------------- */ static _setDefaultOptions(actor, rollData) { + const actorData = Misc.data(actor); let defaultRollData = { alias: actor.name, ajustementsConditions: CONFIG.RDD.ajustementsConditions, difficultesLibres: CONFIG.RDD.difficultesLibres, etat: actor.getEtatGeneral(), moral: actor.getMoralTotal(), /* La valeur du moral pour les jets de volonté */ - carac: actor.data.data.carac, + carac: actorData.data.carac, finalLevel: 0, diffConditions: 0, diffLibre: rollData.competence?.data.default_diffLibre ?? 0, malusArmureValue: actor.getMalusArmure(), - surencMalusFlag: actor.isPersonnage() ? (actor.data.data.compteurs.surenc.value < 0) : false, + surencMalusFlag: actor.isPersonnage() ? (actorData.data.compteurs.surenc.value < 0) : false, surencMalusValue: actor.getSurenc(), useMalusSurenc: false, useMoral: false, /* Est-ce que le joueur demande d'utiliser le moral ? Utile si le joueur change plusieurs fois de carac associée. */ diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index b1fe330a..92329451 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -11,6 +11,7 @@ import { EffetsDraconiques } from "./tmr/effets-draconiques.js"; import { PixiTMR } from "./tmr/pixi-tmr.js"; import { Draconique } from "./tmr/draconique.js"; import { Grammar } from "./grammar.js"; +import { Misc } from "./misc.js"; /* -------------------------------------------- */ export class RdDTMRDialog extends Dialog { @@ -72,7 +73,7 @@ export class RdDTMRDialog extends Dialog { } loadSortsReserve() { - this.sortsReserves = this.actor.data.data.reve.reserve.list; + this.sortsReserves = Misc.data(this.actor).data.reve.reserve.list; } loadRencontres() { @@ -136,7 +137,7 @@ export class RdDTMRDialog extends Dialog { return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortEnReserve.sort, () => sortEnReserve.coord); } _tokenDemiReve() { - return EffetsDraconiques.demiReve.token(this.pixiTMR, this.actor, () => this.actor.data.data.reve.tmrpos.coord); + return EffetsDraconiques.demiReve.token(this.pixiTMR, this.actor, () => Misc.data(this.actor).data.reve.tmrpos.coord); } _updateDemiReve() { @@ -155,7 +156,7 @@ export class RdDTMRDialog extends Dialog { else { // Roll Sort html.find('#lancer-sort').click((event) => { - this.actor.rollUnSort(this.actor.data.data.reve.tmrpos.coord); + this.actor.rollUnSort(Misc.data(this.actor).data.reve.tmrpos.coord); }); } if (this.viewOnly) { @@ -170,7 +171,7 @@ export class RdDTMRDialog extends Dialog { // Le reste... this.updateValuesDisplay(); - let tmr = TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord); + let tmr = TMRUtility.getTMR(Misc.data(this.actor).data.reve.tmrpos.coord); await this.manageRencontre(tmr, () => { this.postRencontre(tmr); }); @@ -179,21 +180,22 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ updateValuesDisplay() { let ptsreve = document.getElementById("tmr-pointsreve-value"); - ptsreve.innerHTML = this.actor.data.data.reve.reve.value; + const actorData = Misc.data(this.actor); + ptsreve.innerHTML = actorData.data.reve.reve.value; let tmrpos = document.getElementById("tmr-pos"); - let tmr = TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord); - tmrpos.innerHTML = this.actor.data.data.reve.tmrpos.coord + " (" + tmr.label + ")"; + let tmr = TMRUtility.getTMR(actorData.data.reve.tmrpos.coord); + tmrpos.innerHTML = actorData.data.reve.tmrpos.coord + " (" + tmr.label + ")"; let etat = document.getElementById("tmr-etatgeneral-value"); etat.innerHTML = this.actor.getEtatGeneral(); let refoulement = document.getElementById("tmr-refoulement-value"); - refoulement.innerHTML = this.actor.data.data.reve.refoulement.value; + refoulement.innerHTML = actorData.data.reve.refoulement.value; let fatigueItem = document.getElementById("tmr-fatigue-table"); - //console.log("Refresh : ", this.actor.data.data.sante.fatigue.value); - fatigueItem.innerHTML = "" + RdDUtility.makeHTMLfatigueMatrix(this.actor.data.data.sante.fatigue.value, this.actor.data.data.sante.endurance.max).html() + "
"; + //console.log("Refresh : ", actorData.data.sante.fatigue.value); + fatigueItem.innerHTML = "" + RdDUtility.makeHTMLfatigueMatrix(actorData.data.sante.fatigue.value, actorData.data.sante.endurance.max).html() + "
"; } /* -------------------------------------------- */ @@ -310,7 +312,7 @@ export class RdDTMRDialog extends Dialog { rencontre: this.currentRencontre, nbRounds: 1, canClose: false, - tmr: TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord) + tmr: TMRUtility.getTMR(Misc.data(this.actor).data.reve.tmrpos.coord) } await this._tentativeMaitrise(rencontreData); @@ -780,7 +782,7 @@ export class RdDTMRDialog extends Dialog { } async _onClickTMRPos(eventPos) { - let currentPos = TMRUtility.convertToCellPos(this.actor.data.data.reve.tmrpos.coord); + let currentPos = TMRUtility.convertToCellPos(Misc.data(this.actor).data.reve.tmrpos.coord); console.log("deplacerDemiReve >>>>", currentPos, eventPos); @@ -846,7 +848,7 @@ export class RdDTMRDialog extends Dialog { game.socket.emit("system.foundryvtt-reve-de-dragon", { msg: "msg_tmr_move", data: { actorId: this.actor.data._id, - tmrPos: this.actor.data.data.reve.tmrpos + tmrPos: Misc.data(this.actor).data.reve.tmrpos } }); diff --git a/module/rolldata-ajustements.js b/module/rolldata-ajustements.js index 1d4eb657..1164a345 100644 --- a/module/rolldata-ajustements.js +++ b/module/rolldata-ajustements.js @@ -18,9 +18,9 @@ import { ReglesOptionelles } from "./regles-optionelles.js"; */ export const referenceAjustements = { competence: { - isUsed: (rollData, actor) => rollData.competence, - getLabel: (rollData, actor) => rollData.competence?.name, - getValue: (rollData, actor) => rollData.competence?.data?.niveau, + isUsed: (rollData, actor) => Misc.data(rollData.competence), + getLabel: (rollData, actor) => Misc.data(rollData.competence)?.name, + getValue: (rollData, actor) => Misc.data(rollData.competence)?.data?.niveau, }, meditation: { isUsed: (rollData, actor) => rollData.meditation, @@ -32,7 +32,7 @@ export const referenceAjustements = { getLabel: (rollData, actor) => rollData.selectedSort?.name ?? rollData.attackerRoll ? 'Imposée' : 'Libre', getValue: (rollData, actor) => rollData.selectedSort ? RdDItemSort.getDifficulte(rollData.selectedSort, rollData.diffLibre) - : rollData.diffLibre ?? rollData.competence?.data.default_diffLibre ?? 0 + : rollData.diffLibre ?? Misc.data(rollData.competence)?.data.default_diffLibre ?? 0 }, diffConditions: { isUsed: (rollData, actor) => rollData.diffConditions != undefined, @@ -94,10 +94,10 @@ export const referenceAjustements = { getDescr: (rollData, actor) => rollData.diviseurSignificative > 1 ? `Facteur significative ×${Misc.getFractionHtml(rollData.diviseurSignificative)}` : '' }, isEcaille: { - isVisible: (rollData, actor) => rollData.arme?.data.magique && Number(rollData.arme?.data.ecaille_efficacite) > 0, - isUsed: (rollData, actor) => rollData.arme?.data.magique && Number(rollData.arme?.data.ecaille_efficacite) > 0, + isVisible: (rollData, actor) => Misc.data(rollData.arme)?.data.magique && Number(Misc.data(rollData.arme)?.data.ecaille_efficacite) > 0, + isUsed: (rollData, actor) => Misc.data(rollData.arme)?.data.magique && Number(Misc.data(rollData.arme)?.data.ecaille_efficacite) > 0, getLabel: (rollData, actor) => "Ecaille d'Efficacité: ", - getValue: (rollData, actor) => (rollData.arme?.data.magique && Number(rollData.arme.data.ecaille_efficacite) > 0) ? rollData.arme.data.ecaille_efficacite : 0, + getValue: (rollData, actor) => Math.max(Number(Misc.data(rollData.arme)?.data.ecaille_efficacite), 0), }, finesse: { isUsed: (rollData, actor) => RdDBonus.isDefenseAttaqueFinesse(rollData), diff --git a/module/tmr/effets-draconiques.js b/module/tmr/effets-draconiques.js index 6eefe7f3..a73fc272 100644 --- a/module/tmr/effets-draconiques.js +++ b/module/tmr/effets-draconiques.js @@ -16,6 +16,7 @@ import { Conquete } from "./conquete.js"; import { Pelerinage } from "./pelerinage.js"; import { Periple } from "./periple.js"; import { UrgenceDraconique } from "./urgence-draconique.js"; +import { Misc } from "../misc.js"; export class EffetsDraconiques { @@ -92,98 +93,100 @@ export class EffetsDraconiques { return EffetsDraconiques.presentCites.isCase(caseTMR, coord); } /* -------------------------------------------- */ - static isMauvaiseRencontre(element) { - return EffetsDraconiques.isMatching(element, it => Draconique.isQueueSouffle(it) && it.name.toLowerCase().includes('mauvaise rencontre')); + static isMauvaiseRencontre(item) { + return EffetsDraconiques.isMatching(item, it => Draconique.isQueueSouffle(it) && it.name.toLowerCase().includes('mauvaise rencontre')); } - static isMonteeLaborieuse(element) { - return EffetsDraconiques.isMatching(element, it => Draconique.isQueueSouffle(it) && it.name.toLowerCase().includes('montée laborieuse')); + static isMonteeLaborieuse(item) { + return EffetsDraconiques.isMatching(item, it => Draconique.isQueueSouffle(it) && it.name.toLowerCase().includes('montée laborieuse')); } /* -------------------------------------------- */ - static isFermetureCite(element) { - return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.fermetureCites.match(it)); + static isFermetureCite(item) { + return EffetsDraconiques.isMatching(item, it => EffetsDraconiques.fermetureCites.match(it)); } - static isPontImpraticable(element) { - return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.pontImpraticable.match(it)); + static isPontImpraticable(item) { + return EffetsDraconiques.isMatching(item, it => EffetsDraconiques.pontImpraticable.match(it)); } - static isDoubleResistanceFleuve(element) { - return EffetsDraconiques.isMatching(element, it => Draconique.isSouffleDragon(it) && it.name.toLowerCase().includes('résistance du fleuve')); + static isDoubleResistanceFleuve(item) { + return EffetsDraconiques.isMatching(item, it => Draconique.isSouffleDragon(it) && it.name.toLowerCase().includes('résistance du fleuve')); } - static isPeage(element) { - return EffetsDraconiques.isMatching(element, it => Draconique.isSouffleDragon(it) && it.name.toLowerCase().includes('péage')); + static isPeage(item) { + return EffetsDraconiques.isMatching(item, it => Draconique.isSouffleDragon(it) && it.name.toLowerCase().includes('péage')); } - static isPeriple(element) { - return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.periple.match(it)); + static isPeriple(item) { + return EffetsDraconiques.isMatching(item, it => EffetsDraconiques.periple.match(it)); } - static isDesorientation(element) { - return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.desorientation.match(it)); // TODO + static isDesorientation(item) { + return EffetsDraconiques.isMatching(item, it => EffetsDraconiques.desorientation.match(it)); // TODO } /* -------------------------------------------- */ - static isSortImpossible(element) { - return EffetsDraconiques.isMatching(element, it => + static isSortImpossible(item) { + return EffetsDraconiques.isMatching(item, it => EffetsDraconiques.conquete.match(it) || EffetsDraconiques.periple.match(it) || EffetsDraconiques.urgenceDraconique.match(it) || EffetsDraconiques.pelerinage.match(it) ); } - static isSortReserveImpossible(element) { - return EffetsDraconiques.isMatching(element, it => + + static isSortReserveImpossible(item) { + return EffetsDraconiques.isMatching(item, it => EffetsDraconiques.conquete.match(it) || EffetsDraconiques.periple.match(it) || EffetsDraconiques.pelerinage.match(it) ); } - static isConquete(element) { - return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.conquete.match(it)); + static isConquete(item) { + return EffetsDraconiques.isMatching(item, it => EffetsDraconiques.conquete.match(it)); } - static isPelerinage(element) { - return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.pelerinage.match(it)); + static isPelerinage(item) { + return EffetsDraconiques.isMatching(item, it => EffetsDraconiques.pelerinage.match(it)); } - - static countInertieDraconique(element) { - return EffetsDraconiques.count(element, it => Draconique.isQueueDragon(it) && it.name.toLowerCase().includes('inertie draconique')); + + static countInertieDraconique(item) { + return EffetsDraconiques.count(item, it => Draconique.isQueueDragon(it) && it.name.toLowerCase().includes('inertie draconique')); } - - static isUrgenceDraconique(element) { - return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.urgenceDraconique.match(it)); + + static isUrgenceDraconique(item) { + return EffetsDraconiques.isMatching(item, it => EffetsDraconiques.urgenceDraconique.match(it)); } - + /* -------------------------------------------- */ - static isDonDoubleReve(element) { - return EffetsDraconiques.isMatching(element, it => Draconique.isTeteDragon(it) && it.name == 'Don de double-rêve'); + static isDonDoubleReve(item) { + return EffetsDraconiques.isMatching(item, it => Draconique.isTeteDragon(it) && it.name == 'Don de double-rêve'); + } + + static isConnaissanceFleuve(item) { + return EffetsDraconiques.isMatching(item, it => Draconique.isTeteDragon(it) && it.name.toLowerCase().includes('connaissance du fleuve')); + } + + static isReserveEnSecurite(item) { + return EffetsDraconiques.isMatching(item, it => Draconique.isTeteDragon(it) && it.name.toLowerCase().includes(' en sécurité')); + } + + static isDeplacementAccelere(item) { + item = Misc.data(item); + return EffetsDraconiques.isMatching(item, it => Draconique.isTeteDragon(it) && it.name.toLowerCase().includes(' déplacement accéléré')); + } + + static isMatching(item, matcher) { + return EffetsDraconiques.toItems(item).find(matcher); + } + static count(item, matcher) { + return EffetsDraconiques.toItems(item).filter(matcher).length; } - static isConnaissanceFleuve(element) { - return EffetsDraconiques.isMatching(element, it => Draconique.isTeteDragon(it) && it.name.toLowerCase().includes('connaissance du fleuve')); - } - - static isReserveEnSecurite(element) { - return EffetsDraconiques.isMatching(element, it => Draconique.isTeteDragon(it) && it.name.toLowerCase().includes(' en sécurité')); - } - - static isDeplacementAccelere(element) { - return EffetsDraconiques.isMatching(element, it => Draconique.isTeteDragon(it) && it.name.toLowerCase().includes(' déplacement accéléré')); - } - - static isMatching(element, matcher) { - return EffetsDraconiques.toItems(element).find(matcher); - } - static count(element, matcher) { - return EffetsDraconiques.toItems(element).filter(matcher).length; - } - - static toItems(element) { - return (element?.entity === 'Actor') ? element.data.items : (element?.entity === 'Item') ? [element] : []; + static toItems(item) { + return (item?.entity === 'Actor') ? item.data.items : (item?.entity === 'Item') ? [Misc.data(item)] : []; } } \ No newline at end of file