From 218f38e04461484649369c09c0278651ce7c7763 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 20 Mar 2021 00:09:29 +0100 Subject: [PATCH] =?UTF-8?q?Cleanup:=20r=C3=A9duction=20de=20duplicates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 213 ++++++++++++++++--------------------- module/rdd-carac.js | 1 - module/rdd-tmr-dialog.js | 24 +++-- module/tmr-utility.js | 2 +- templates/actor-sheet.html | 1 - 5 files changed, 104 insertions(+), 137 deletions(-) diff --git a/module/actor.js b/module/actor.js index c78b6419..68bf750e 100644 --- a/module/actor.js +++ b/module/actor.js @@ -266,7 +266,7 @@ export class RdDActor extends Actor { getBestDraconic() { const list = this.getDraconicList().sort((a, b) => b.data.niveau - a.data.niveau); if (list.length == 0) { - return { name: "none", data: { niveau: -11 } }; + return { name: "Aucun", data: { niveau: -11 } }; } return duplicate(list[0]); } @@ -309,27 +309,30 @@ export class RdDActor extends Actor { }; const blessures = duplicate(this.data.data.blessures); - console.log("dormirChateauDormant", 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); await this.update({ "data.blessures": blessures }); await this._recupererVie(message); await this.jetDeMoral('neutre'); - - // On ne récupère un point de chance que si aucun appel à la chance dans la journée - let utilisationChance = duplicate(this.getFlag('foundryvtt-reve-de-dragon', 'utilisationChance') ?? false); - if (!utilisationChance) { - await this.chanceActuelleIncDec(1); - } - await this.unsetFlag('foundryvtt-reve-de-dragon', 'utilisationChance'); // Nouveau jour, suppression du flag - - this.transformerStress(); + await this._recupereChance(); + await this.transformerStress(); await this.retourSeuilDeReve(message); message.content = `A la fin Chateau Dormant, ${message.content}
Un nouveau jour se lève`; ChatMessage.create(message); } + async _recupereChance() { + // On ne récupère un point de chance que si aucun appel à la chance dans la journée + if (this.getFlag('foundryvtt-reve-de-dragon', 'utilisationChance')) { + // Nouveau jour, suppression du flag + await this.unsetFlag('foundryvtt-reve-de-dragon', 'utilisationChance'); + } + else { + await this.chanceActuelleIncDec(1); + } + } + /* -------------------------------------------- */ async _recupererBlessures(message, type, liste, moindres) { let count = 0; @@ -439,9 +442,7 @@ export class RdDActor extends Actor { 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) { - let fatigue = duplicate(this.data.data.sante.fatigue) - fatigue.value = 0; - await this.update({ "data.sante.fatigue": fatigue }); + await this.update({ "data.sante.fatigue.value": 0 }); } } ChatMessage.create(message); @@ -491,16 +492,16 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async recupererFatigue(message) { - let fatigue = duplicate(this.data.data.sante.fatigue) + let fatigue = this.data.data.sante.fatigue.value; const fatigueMin = this._computeFatigueMin(); - if (fatigue.value <= fatigueMin) { + if (fatigue <= fatigueMin) { message.content += "Vous êtes déjà reposé. "; return; } - fatigue.value = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue.value)); + fatigue = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue)); console.log("recupererFatigue", fatigue) - await this.update({ "data.sante.fatigue": fatigue }); - if (fatigue.value == 0) { + await this.update({ "data.sante.fatigue.value": fatigue }); + if (fatigue == 0) { message.content += "Vous êtes complêtement reposé. "; } } @@ -639,9 +640,9 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async sortMisEnReserve(rollData, sort) { - let reserve = duplicate(this.data.data.reve.reserve); - reserve.list.push({ coord: rollData.tmr.coord, sort: sort, draconic: duplicate(rollData.competence) }); - await this.update({ "data.reve.reserve": reserve }); + let reserve = duplicate(this.data.data.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(); } @@ -711,7 +712,7 @@ export class RdDActor extends Actor { }); } const update = { _id: comp._id, 'data.niveau': nouveauNiveau }; - const updated = await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity + await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity } else { console.log("Competence not found", compName); } @@ -724,7 +725,7 @@ export class RdDActor extends Actor { compValue = compValue ?? 0; this.checkCompetenceXP(compName, compValue); const update = { _id: comp._id, 'data.xp': compValue }; - const updated = await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity + await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity } else { console.log("Competence not found", compName); } @@ -737,7 +738,7 @@ export class RdDActor extends Actor { if (comp) { compValue = compValue ?? 0; const update = { _id: comp._id, 'data.xp_sort': compValue }; - const updated = await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity + await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity } else { console.log("Competence not found", compName); } @@ -749,7 +750,7 @@ export class RdDActor extends Actor { if (comp) { compValue = compValue ?? 0; const update = { _id: comp._id, 'data.niveau_archetype': compValue }; - const updated = await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity + await this.updateEmbeddedEntity("OwnedItem", update); // Updates one EmbeddedEntity } else { console.log("Competence not found", compName); } @@ -757,7 +758,6 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async updateCompteurValue(fieldName, fieldValue) { - //console.log("Update", fieldName, fieldValue); let compteurs = duplicate(this.data.data.compteurs); compteurs[fieldName].value = fieldValue; await this.update({ "data.compteurs": compteurs }); @@ -951,8 +951,6 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async computeEncombrementTotalEtMalusArmure() { let encTotal = 0; - - let malusArmureData = (this.data.data.attributs && this.data.data.attributs.malusarmure) ? duplicate(this.data.data.attributs.malusarmure) : {}; 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 @@ -973,10 +971,10 @@ export class RdDActor extends Actor { // Mise à jour valeur totale et états this.encTotal = encTotal; this.detectSurEncombrement(); + // Mise à jour éventuelle du malus armure - if (this.data.data.attributs && this.data.data.attributs.malusarmure && newMalusArmure != malusArmureData.value) { - malusArmureData.value = newMalusArmure; - await this.update({ "data.attributs.malusarmure": malusArmureData }); + if (this.data.data.attributs?.malusarmure && newMalusArmure != this.data.data.attributs.malusarmure.value) { + await this.update({ "data.attributs.malusarmure.value ": newMalusArmure }); } return this.encTotal; } @@ -1008,12 +1006,12 @@ export class RdDActor extends Actor { let resume = "Blessures:"; if (nbCritiques > 0 || nbGraves > 0 || nbLegeres > 0) { if (nbLegeres > 0) { - resume += " " + nbLegeres + " légères"; + resume += " " + nbLegeres + " légère" + (nbLegeres > 1 ? "s" : ""); } if (nbGraves > 0) { if (nbLegeres > 0) resume += ","; - resume += " " + nbGraves + " graves"; + resume += " " + nbGraves + " grave" + (nbGraves > 1 ? "s" : ""); } if (nbCritiques > 0) { if (nbGraves > 0 || nbLegeres > 0) @@ -1022,7 +1020,7 @@ export class RdDActor extends Actor { } } else { - resume += " aucune"; + resume = "Aucune blessure"; } return resume; } @@ -1052,20 +1050,14 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async ajouterRefoulement(value = 1) { - let ret = "none"; - - let refoulement = duplicate(this.data.data.reve.refoulement); - refoulement.value = refoulement.value + value; - + let refoulement = this.data.data.reve.refoulement.value + value; let total = new Roll("1d20").roll().total; - if (total <= refoulement.value) { - refoulement.value = 0; - this.ajouterSouffle({ chat: true }); - ret = "souffle"; + if (total <= refoulement) { + refoulement = 0; + await this.ajouterSouffle({ chat: true }); } - - await this.update({ "data.reve.refoulement": refoulement }); - return ret; + await this.update({ "data.reve.refoulement.value": refoulement }); + return refoulement == 0 ? "souffle" : "none"; } /* -------------------------------------------- */ @@ -1078,7 +1070,6 @@ export class RdDActor extends Actor { content: this.name + " subit un Souffle de Dragon : " + souffle.name }); } - // TODO: fermeture cité return souffle; } @@ -1087,9 +1078,7 @@ export class RdDActor extends Actor { let queue; if (this.data.data.reve.reve.thanatosused) { queue = await RdDRollTables.getOmbre(); - let myReve = duplicate(this.data.data.reve.reve); - myReve.thanatosused = false; - await this.update({ "data.reve.reve": myReve }); + await this.update({ "data.reve.reve.thanatosused": false }); } else { queue = await RdDRollTables.getQueue(); @@ -1124,40 +1113,25 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ getTMRRencontres() { - return this.data.data.reve.rencontre; + return this.data.data.reve.rencontre.list; } /* -------------------------------------------- */ async deleteTMRRencontreAtPosition() { - let rencontres = duplicate(this.getTMRRencontres()); - let len = rencontres.list.length; - let i = 0; - //console.log("List", rencontres, len); - let newTable = []; - for (i = 0; i < len; i++) { - if (rencontres.list[i].coord != this.getDemiReve()) - newTable.push(rencontres.list[i]); - } - if (newTable.length != len) { - rencontres.list = newTable; - //console.log("Result: ", rencontres); - await this.update({ "data.reve.rencontre": rencontres }); + let rencontres = this.getTMRRencontres(); + let newRencontres = rencontres.filter(it => it.coord != this.getDemiReve()); + if (newRencontres.length != rencontres.length) { + await this.update({ "data.reve.rencontre.list": newRencontres }); } } /* -------------------------------------------- */ async addTMRRencontre(currentRencontre) { - let rencontres = duplicate(this.getTMRRencontres()); - let len = rencontres.list.length; - let i = 0; - let already = false; - for (i = 0; i < len; i++) { - if (rencontres.list[i].coord == this.getDemiReve()) - already = true; - } - if (!already) { - rencontres.list.push(currentRencontre); - await this.update({ "data.reve.rencontre": rencontres }); + let rencontres = this.getTMRRencontres(); + let newRencontres = rencontres.filter(it => it.coord != this.getDemiReve()); + if (newRencontres.length == rencontres.length) { + newRencontres.push(currentRencontre); + await this.update({ "data.reve.rencontre": newRencontres }); } } @@ -1179,9 +1153,8 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async reveActuelIncDec(value) { - let reve = duplicate(this.data.data.reve.reve); - reve.value = Math.max(reve.value + value, 0); - await this.update({ "data.reve.reve": reve }); + let reve = Math.max(this.data.data.reve.reve.value + value, 0); + await this.update({ "data.reve.reve.value": reve }); } /* -------------------------------------------- */ @@ -1194,17 +1167,13 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async setPointsDeSeuil(value) { - let seuil = duplicate(this.data.data.reve.seuil); - seuil.value = value; - await this.update({ "data.reve.seuil": seuil }); + async setPointsDeSeuil(seuil) { + await this.update({ "data.reve.seuil.value": seuil }); } /* -------------------------------------------- */ - async setPointsDeChance(value) { - let chance = duplicate(this.data.data.compteurs.chance); - chance.value = value; - await this.update({ "data.compteurs.chance": chance }); + async setPointsDeChance(chance) { + await this.update({ "data.compteurs.chance.value": chance }); } /* -------------------------------------------- */ @@ -1258,7 +1227,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async testSiSonne(sante, endurance) { - const roll = new Roll("1d20").roll(); + const roll = new Roll("1d20").evaluate(); roll.showDice = true; RdDDice.show(roll); let result = { @@ -1266,18 +1235,20 @@ export class RdDActor extends Actor { sonne: roll.total > endurance || roll.total == 20 // 20 is always a failure } if (roll.total == 1) { - let xp = Misc.toInt(this.data.data.carac.constitution.xp) + 1; - this.update({ "data.carac.constitution.xp": xp }); // +1 XP ! + await this.ajoutXpConstitution(1); // +1 XP ! ChatMessage.create({ content: `${this.name} a obenu 1 sur son Jet d'Endurance et a gagné 1 point d'Expérience en Constitution. Ce point d'XP a été ajouté automatiquement).` }); } if (result.sonne) { - await this.setSonne(); sante.sonne.value = true; } return result; } + async ajoutXpConstitution(xp) { + await this.update({ "data.carac.constitution.xp": Misc.toInt(this.data.data.carac.constitution.xp) + xp }); + } + /* -------------------------------------------- */ countBlessures(blessuresListe) { return blessuresListe.filter(b => b.active).length @@ -1297,14 +1268,12 @@ export class RdDActor extends Actor { if (myRoll.total == 1 || (myRoll.total != 20 && myRoll.total <= this.data.data.sante.endurance.value)) { msgText += `${this.name} a réussi son Jet d'Endurance !`; if (myRoll.total == 1) { + await this.ajoutXpConstitution(); msgText += `et gagne 1 Point d'Experience en Constitution`; - let constit = duplicate(this.data.data.carac.constitution) - constit.xp += 1; - await this.update({ "data.carac.constitution": constit }); } } else { - msgText += `${this.name} a échoué son Jet d'Endurance et devient Sonné`; await this.setSonne(); + msgText += `${this.name} a échoué son Jet d'Endurance et devient Sonné`; } const message = { content: msgText, @@ -1413,29 +1382,25 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async manageBlessureFromSheet(bType, index, active) { - let bList = duplicate(this.data.data.blessures); - let blessure = bList[bType + "s"].liste[index]; + async manageBlessureFromSheet(gravite, index) { + let listBlessures = duplicate(this.data.data.blessures); + let blessure = listBlessures[gravite + "s"].liste[index]; blessure.active = !blessure.active; if (!blessure.active) { - blessure.premiers_soins = 0; - blessure.soins_complets = 0; - blessure.jours = 0; - blessure.loc = ""; + this._supprimerBlessure(blessure); } - //console.log("Blessure update", bType, index, blessure, bList ); - await this.update({ 'data.blessures': bList }); + await this.update({ 'data.blessures': listBlessures }); } /* -------------------------------------------- */ - async setDataBlessureFromSheet(bType, index, psoins, pcomplets, jours, loc) { - let bList = duplicate(this.data.data.blessures); - let blessure = bList[bType + "s"].liste[index]; + async setDataBlessureFromSheet(gravite, index, psoins, pcomplets, jours, loc) { + let listBlessures = duplicate(this.data.data.blessures); + let blessure = listBlessures[gravite + "s"].liste[index]; blessure.premiers_soins = psoins; blessure.soins_complets = pcomplets; blessure.jours = jours; blessure.loc = loc; - await this.update({ 'data.blessures': bList }); + await this.update({ 'data.blessures': listBlessures }); } /* -------------------------------------------- */ @@ -1458,24 +1423,21 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async moralIncDec(ajustementMoral) { - let compteurs = duplicate(this.data.data.compteurs); - compteurs.moral.value = Misc.toInt(compteurs.moral.value);; if (ajustementMoral != 0) { - compteurs.moral.value += ajustementMoral; - if (compteurs.moral.value > 3) { - // exaltation - compteurs.moral.value--; - compteurs.exaltation.value = Misc.toInt(compteurs.exaltation.value) + 1; + let moral = Misc.toInt(this.data.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 }); } - if (compteurs.moral.value < -3) { - // dissolution - compteurs.moral.value++; - compteurs.dissolution.value = Misc.toInt(compteurs.dissolution.value) + 1; + if (moral < -3) { // dissolution + const dissolution = Misc.toInt(this.data.data.compteurs.dissolution.value) + 3 - moral; + await this.update({ 'data.compteurs.dissolution.value': dissolution }); } - await this.update({ 'data.compteurs': compteurs }); + moral = Math.max(-3, Math.min(moral, 3)); + await this.update({ 'data.compteurs.moral.value': moral }); } - return compteurs.moral.value; + return this.data.data.compteurs.moral.value; } /* -------------------------------------------- */ @@ -1535,11 +1497,14 @@ export class RdDActor extends Actor { 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); - msgText += `Vous avez échoué à votre jet d'éthylisme, vous êtes maintenant ${RdDUtility.getNomEthylisme(ajustementEthylique)} (${ajustementEthylique}).` - msgText += "
" + RdDResolutionTable.explain(rollVolonte) + "
"; - msgText += "Qui a bu boira : " + (rollVolonte.isSuccess + const quiABuBoira = (rollVolonte.isSuccess ? "vous êtes libre de continuer à boire ou pas." : "vous avez une envie irrépréssible de reprendre un verre."); + + msgText += `Vous avez échoué à votre jet d'éthylisme, vous êtes + maintenant ${RdDUtility.getNomEthylisme(ajustementEthylique)} (${ajustementEthylique}). +
${RdDResolutionTable.explain(rollVolonte)} +
Qui a bu boira : ${quiABuBoira}`; } ChatMessage.create({ diff --git a/module/rdd-carac.js b/module/rdd-carac.js index 516b4f9f..6dbe169c 100644 --- a/module/rdd-carac.js +++ b/module/rdd-carac.js @@ -1,5 +1,4 @@ import { Grammar } from "./grammar.js"; -import { RdDUtility } from "./rdd-utility.js"; const tableCaracDerivee = { // xp: coût pour passer du niveau inférieur à ce niveau diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index cbc1aafe..b1fe330a 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -72,11 +72,11 @@ export class RdDTMRDialog extends Dialog { } loadSortsReserve() { - this.sortsReserves = duplicate(this.actor.data.data.reve.reserve.list); + this.sortsReserves = this.actor.data.data.reve.reserve.list; } loadRencontres() { - this.rencontresExistantes = duplicate(this.actor.getTMRRencontres()).list; + this.rencontresExistantes = this.actor.getTMRRencontres(); } /* -------------------------------------------- */ @@ -389,6 +389,11 @@ export class RdDTMRDialog extends Dialog { ChatMessage.create({ content: message, user: game.user._id, whisper: ChatMessage.getWhisperRecipients("GM") }); } + /* -------------------------------------------- */ + _tellToUserAndGM(message) { + ChatMessage.create({ content: message, user: game.user._id, whisper: [game.user._id].concat(ChatMessage.getWhisperRecipients("GM")) }); + } + /* -------------------------------------------- */ async manageRencontre(tmr, postRencontre) { if (this.viewOnly) { @@ -669,8 +674,8 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async declencheSortEnReserve(coord) { - let sortReserveList = TMRUtility.getSortReserveList(this.sortsReserves, coord); - if (sortReserveList.length > 0) { + let sortsEnCoord = TMRUtility.getSortsReserve(this.sortsReserves, coord); + if (sortsEnCoord.length > 0) { if (EffetsDraconiques.isSortReserveImpossible(this.actor)) { ui.notifications.error("Une queue ou un souffle vous empèche de déclencher de sort!"); return; @@ -678,7 +683,7 @@ export class RdDTMRDialog extends Dialog { if (!EffetsDraconiques.isUrgenceDraconique(this.actor) && (EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord))) { let msg = "Vous êtes sur une case avec un Sort en Réserve. Grâce à votre Tête Reserve en Sécurité ou Réserve Exensible, vous pouvez contrôler le déclenchement. Cliquez si vous souhaitez le déclencher :