diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 66ff36a1..d19ef734 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -84,7 +84,7 @@ export class RdDActorSheet extends RdDBaseActorSheet { RdDItemArme.ajoutCorpsACorps(formData.combat, formData.competences, formData.system.carac); formData.esquives = this.actor.getCompetences("Esquive"); formData.combat = RdDCombatManager.listActionsArmes(formData.combat, formData.competences, formData.system.carac); - formData.empoignades = this.actor.getEmpoignades("Esquive"); + formData.empoignades = this.actor.getEmpoignades(); this.armesList = formData.combat; diff --git a/module/actor.js b/module/actor.js index b4c90d44..abcfb45b 100644 --- a/module/actor.js +++ b/module/actor.js @@ -98,7 +98,7 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ async cleanupConteneurs() { - let updates = this.listItems('conteneur') + let updates = this.itemTypes['conteneur'] .filter(c => c.system.contenu.filter(id => this.getItem(id) == undefined).length > 0) .map(c => { return { _id: c._id, 'system.contenu': c.system.contenu.filter(id => this.getItem(id) != undefined) } }); if (updates.length > 0) { @@ -333,18 +333,12 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ hasArmeeMeleeEquipee() { // Return true si l'acteur possède au moins 1 arme de mêlée équipée - let melee = this.items.filter(it => it.type == "arme" && it.system.equipe && it.system.competence != "") - return (melee.length > 0) - } - isEmpoignadeEnCours() { - return this.items.find(it => it.type == "empoignade" && it.system.pointsemp > 0) + return this.itemTypes['arme'].find(it => it.system.equipe && it.system.competence != "") } /* -------------------------------------------- */ async roll() { - if (this.isEmpoignadeEnCours()) { - ui.notifications.warn("Une empoignade est en cours ! Normalement, vous ne pouvez rien faire d'autre que continuer l'empoignade ou la rompre.") - } + RdDEmpoignade.checkEmpoignadeEnCours(this) const carac = mergeObject(duplicate(this.system.carac), { @@ -1101,16 +1095,12 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ computeIsHautRevant() { if (this.isPersonnage()) { - this.system.attributs.hautrevant.value = this.hasItemNamed('tete', 'don de haut-reve') + this.system.attributs.hautrevant.value = this.itemTypes['tete'].find(it => Grammar.equalsInsensitive(it.name, 'don de haut-reve')) ? "Haut rêvant" : ""; } } - hasItemNamed(type, name) { - name = Grammar.toLowerCaseNoAccent(name); - return this.listItems(type).find(it => Grammar.toLowerCaseNoAccent(it.name) == name); - } /* -------------------------------------------- */ async computeMalusArmure() { @@ -1672,9 +1662,9 @@ export class RdDActor extends RdDBaseActor { await this.rollTache(tache.id); } } - async actionHerbe(item, onActionItem = async () => {}) { + async actionHerbe(item, onActionItem = async () => { }) { if (item.isHerbeAPotion()) { - return DialogFabriquerPotion.create(this, item, onActionItem); + return DialogFabriquerPotion.create(this, item, onActionItem); } return; } @@ -2076,16 +2066,13 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ async rollUnSort(coord) { - if (this.isEmpoignadeEnCours()) { - ui.notifications.warn("Une empoignade est en cours ! Normalement, vous ne pouvez rien faire d'autre que continuer l'empoignade ou la rompre.") - } - + RdDEmpoignade.checkEmpoignadeEnCours(this) if (EffetsDraconiques.isSortImpossible(this)) { ui.notifications.error("Une queue ou un souffle vous empèche de lancer de sort!"); return; } // Duplication car les pts de reve sont modifiés dans le sort - let sorts = duplicate(this.$filterSortList(this.getSortList(), coord)); + let sorts = duplicate(this.$filterSortList(this.itemTypes['sort'], coord)); if (sorts.length == 0) { ui.notifications.info(`Aucun sort disponible en ${TMRUtility.getTMR(coord).label} !`); return; @@ -2219,10 +2206,7 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ async rollCarac(caracName, jetResistance = undefined) { - if (this.isEmpoignadeEnCours()) { - ui.notifications.warn("Une empoignade est en cours ! Normalement, vous ne pouvez rien faire d'autre que continuer l'empoignade ou la rompre.") - } - + RdDEmpoignade.checkEmpoignadeEnCours(this) let selectedCarac = this.getCaracByName(caracName) await this._openRollDialog({ name: 'jet-' + caracName, @@ -2290,10 +2274,7 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ async rollCompetence(idOrName, options = { tryTarget: true }) { - if (this.isEmpoignadeEnCours()) { - ui.notifications.warn("Une empoignade est en cours ! Normalement, vous ne pouvez rien faire d'autre que continuer l'empoignade ou la rompre.") - } - + RdDEmpoignade.checkEmpoignadeEnCours(this) let rollData = { carac: this.system.carac, competence: this.getCompetence(idOrName) @@ -2365,7 +2346,7 @@ export class RdDActor extends RdDBaseActor { async getTacheBlessure(blesse, blessure) { const gravite = blessure?.system.gravite ?? 0; if (gravite > 0) { - const tache = this.listItems('tache').find(it => it.system.itemId == blessure.id) + const tache = this.itemTypes['tache'].find(it => it.system.itemId == blessure.id) ?? await RdDItemBlessure.createTacheSoinBlessure(this, gravite); await blessure?.updateTacheSoinBlessure(tache); return tache @@ -2374,10 +2355,7 @@ export class RdDActor extends RdDBaseActor { } async rollCaracCompetence(caracName, compName, diff, options = { title: "" }) { - if (this.isEmpoignadeEnCours()) { - ui.notifications.warn("Une empoignade est en cours ! Normalement, vous ne pouvez rien faire d'autre que continuer l'empoignade ou la rompre.") - } - + RdDEmpoignade.checkEmpoignadeEnCours(this) const competence = this.getCompetence(compName); await this._openRollDialog({ name: 'jet-competence', @@ -2398,10 +2376,7 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ async rollTache(id, options = {}) { - if (this.isEmpoignadeEnCours()) { - ui.notifications.warn("Une empoignade est en cours ! Normalement, vous ne pouvez rien faire d'autre que continuer l'empoignade ou la rompre.") - } - + RdDEmpoignade.checkEmpoignadeEnCours(this) const tacheData = this.getTache(id) const compData = this.getCompetence(tacheData.system.competence) compData.system.defaut_carac = tacheData.system.carac; // Patch ! @@ -2668,7 +2643,7 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ _getSignesDraconiques(coord) { const type = TMRUtility.getTMRType(coord); - return this.listItems("signedraconique").filter(it => it.system.typesTMR.includes(type)); + return this.itemTypes["signedraconique"].filter(it => it.system.typesTMR.includes(type)); } /* -------------------------------------------- */ @@ -2875,8 +2850,7 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ async resetNombresAstraux() { - let toDelete = this.listItems('nombreastral'); - const deletions = toDelete.map(it => it._id); + const deletions = this.itemTypes['nombreastral'].map(it => it._id); await this.deleteEmbeddedDocuments("Item", deletions); } @@ -2900,7 +2874,7 @@ export class RdDActor extends RdDBaseActor { async supprimerAnciensNombresAstraux() { const calendrier = game.system.rdd.calendrier; if (calendrier) { - const toDelete = this.listItems('nombreastral') + const toDelete = this.itemTypes['nombreastral'] .filter(it => calendrier.isAfterIndexDate(it.system.jourindex)) .map(it => it._id); await this.deleteEmbeddedDocuments("Item", toDelete); @@ -2958,11 +2932,6 @@ export class RdDActor extends RdDBaseActor { return entry && entry.length > 0 ? carac[entry[0]] : undefined; } - /* -------------------------------------------- */ - getSortList() { - return this.listItems("sort"); - } - /* -------------------------------------------- */ countMonteeLaborieuse() { // Return +1 par queue/ombre/souffle Montée Laborieuse présente let countMonteeLaborieuse = EffetsDraconiques.countMonteeLaborieuse(this); @@ -3022,8 +2991,8 @@ export class RdDActor extends RdDBaseActor { mode: mode, fatigue: RdDUtility.calculFatigueHtml(fatigue, endurance), draconic: this.getDraconicList(), - sort: this.getSortList(), - signes: this.listItems("signedraconique"), + sort: this.itemTypes['sort'], + signes: this.itemTypes['signedraconique'], caracReve: this.system.carac.reve.value, pointsReve: this.getReveActuel(), isRapide: isRapide, @@ -3163,7 +3132,7 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ async equiperObjet(itemID) { let item = this.getEmbeddedDocument('Item', itemID); - if (item && ['arme', 'armure'].includes(item.type)) { + if (item?.isEquipable()) { const isEquipe = !item.system.equipe; await this.updateEmbeddedDocuments('Item', [{ _id: item.id, "system.equipe": isEquipe }]); this.computeEncTotal(); // Mise à jour encombrement diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index fde04a4f..92746eea 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -32,7 +32,7 @@ export class RdDBaseActor extends Actor { case "msg_refresh_nombre_astral": Hooks.callAll(APP_ASTROLOGIE_REFRESH); return; - } + } } static remoteActorCall(callData, userId = undefined) { @@ -109,7 +109,6 @@ export class RdDBaseActor extends Actor { isEntite() { return this.type == 'entite'; } isPersonnage() { return this.type == 'personnage'; } isVehicule() { return this.type == 'vehicule'; } - getItem(id, type = undefined) { const item = this.items.get(id); if (type == undefined || (item?.type == type)) { @@ -119,7 +118,7 @@ export class RdDBaseActor extends Actor { } listItems(type = undefined) { return (type ? this.itemTypes[type] : this.items); } - filterItems(filter, type = undefined) { return this.listItems(type)?.filter(filter) ?? []; } + filterItems(filter, type = undefined) { return type ? this.itemTypes[type]?.filter(filter) ?? [] : []; } findItemLike(idOrName, type) { return this.getItem(idOrName, type) ?? Misc.findFirstLike(idOrName, this.listItems(type), { description: Misc.typeName('Item', type) }); @@ -244,12 +243,16 @@ export class RdDBaseActor extends Actor { }); return; } - console.log('achatVente', achat); const cout = Number(achat.prixTotal ?? 0); const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined; const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined; const quantite = (achat.choix.nombreLots ?? 1) * (achat.vente.tailleLot); - const itemVendu = vendeur?.getItem(achat.vente.item._id); + const itemVendu = vendeur?.getItem(achat.vente.item._id) ?? game.items.get(achat.vente.item._id) ?? achat.vente.item; + if (!itemVendu) { + ui.notifications.warn("Erreur sur achat: rien à acheter
Si possible, transmettez les logs de la console aux développeurs"); + console.log('Erreur sur achat: rien à acheter', achat); + return; + } if (!this.verifierQuantite(vendeur, itemVendu, quantite)) { ChatUtility.notifyUser(achat.userId, 'warn', `Le vendeur n'a pas assez de ${itemVendu.name} !`); return diff --git a/module/dialog-item-achat.js b/module/dialog-item-achat.js index e43ea5d8..25e591c0 100644 --- a/module/dialog-item-achat.js +++ b/module/dialog-item-achat.js @@ -18,7 +18,7 @@ export class DialogItemAchat extends Dialog { } return { - item: (json ? JSON.parse(json) : undefined), + item: JSON.parse(json), vendeur, acheteur, nbLots: parseInt(chatButton.attributes['data-quantiteNbLots']?.value), @@ -34,7 +34,6 @@ export class DialogItemAchat extends Dialog { const venteData = { item, actingUserId: game.user.id, - vendeurId: vendeur?.id, vendeur, acheteur, tailleLot, diff --git a/module/item.js b/module/item.js index 4fc78004..679dd9da 100644 --- a/module/item.js +++ b/module/item.js @@ -34,6 +34,7 @@ const typesObjetsConnaissance = ["meditation", "recettealchimique", "sort"] const typesObjetsEffet = ["possession", "poison", "maladie", "blessure"] const typesObjetsCompetence = ["competence", "competencecreature"] const typesObjetsTemporels = ["blessure", "poison", "maladie", "queue", "ombre", "souffle", "signedraconique", "rencontre"] +const typesObjetsEquipable = ['arme', 'armure', 'objet']; const typesEnvironnement = typesInventaireMateriel; const encBrin = 0.00005; // un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc const encPepin = 0.0007; /* un pépin de gemme = 1/10 cm3 = 1/1000 l = 3.5/1000 kg = 7/2000 kg = 7/1000 enc @@ -81,6 +82,10 @@ export const defaultItemImg = { /* -------------------------------------------- */ export class RdDItem extends Item { + static get defaultIcon() { + return undefined; + } + static getDefaultImg(itemType) { return game.system.rdd.itemClasses[itemType]?.defaultIcon ?? defaultItemImg[itemType]; } @@ -139,10 +144,6 @@ export class RdDItem extends Item { super(docData, context); } - static get defaultIcon() { - return undefined; - } - getUniteQuantite() { switch (this.type) { case "monnaie": return "(Pièces)" @@ -158,6 +159,10 @@ export class RdDItem extends Item { return ''; } + isEquipable() { + return typesObjetsEquipable.includes(this.type) + } + isCompetencePersonnage() { return this.type == 'competence' } isCompetenceCreature() { return this.type == 'competencecreature' } isConteneur() { return this.type == 'conteneur'; } @@ -367,6 +372,7 @@ export class RdDItem extends Item { } this.system.actionPrincipale = this.getActionPrincipale({ warnIfNot: false }); } + this.equipable = this.isEquipable(); } prepareDataPotion() { diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 0851b208..b3beda45 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -96,15 +96,15 @@ export class RdDCombatManager extends Combat { let compName = "Corps à corps" if (armeCombat) { if (armeCombat.system.competence != "") { - compName = armeCombat.system.competence + compName = armeCombat.system.competence } if (armeCombat.system.lancer != "") { - compName = armeCombat.system.lancer + compName = armeCombat.system.lancer } if (armeCombat.system.tir != "") { - compName = armeCombat.system.tir + compName = armeCombat.system.tir } - } + } const competence = RdDItemCompetence.findCompetence(combatant.actor.items, compName); if (competence && competence.system.defaut_carac) { const carac = combatant.actor.system.carac[competence.system.defaut_carac].value; @@ -756,9 +756,7 @@ export class RdDCombat { RdDEmpoignade.onAttaqueEmpoignade(this.attacker, this.defender) return; } - if ( this.attacker.isEmpoignadeEnCours() ) { - ui.notifications.warn("Une empoignade est en cours ! Normalement, vous ne pouvez rien faire d'autre que continuer l'empoignade ou la rompre.") - } + RdDEmpoignade.checkEmpoignadeEnCours(this.attacker) let rollData = this._prepareAttaque(competence, arme); console.log("RdDCombat.attaque >>>", rollData); diff --git a/module/rdd-empoignade.js b/module/rdd-empoignade.js index 605b6fee..56094841 100644 --- a/module/rdd-empoignade.js +++ b/module/rdd-empoignade.js @@ -1,10 +1,9 @@ /* -------------------------------------------- */ -import { RdDCombat } from "./rdd-combat.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDRoll } from "./rdd-roll.js"; import { RdDItemCompetenceCreature } from "./item-competencecreature.js"; import { ChatUtility } from "./chat-utility.js"; -import { STATUSES, StatusEffects } from "./settings/status-effects.js"; +import { STATUSES } from "./settings/status-effects.js"; /* -------------------------------------------- */ @@ -15,22 +14,38 @@ export class RdDEmpoignade { static init() { } + /* -------------------------------------------- */ + static checkEmpoignadeEnCours(actor) { + // TODO: autoriser la perception? la comédie/séduction? + if (RdDEmpoignade.isEmpoignadeEnCours(actor)) { + ui.notifications.warn("Une empoignade est en cours ! Normalement, vous ne pouvez rien faire d'autre que continuer l'empoignade ou la rompre.") + return true; + } + return false; + } + + /* -------------------------------------------- */ + static isEmpoignadeEnCours(actor) { + return actor.itemTypes['empoignade'].find(it => it.system.pointsemp > 0) + } + /* -------------------------------------------- */ static getEmpoignadeById(actor, id) { - let emp = actor.items.find(emp => emp.type == 'empoignade' && emp.system.empoignadeid == id) + let emp = actor.itemTypes['empoignade'].find(it => it.system.empoignadeid == id) return emp && duplicate(emp) || undefined; } /* -------------------------------------------- */ static getEmpoignade(attacker, defender) { - let emp = attacker.items.find(emp => emp.type == 'empoignade' && emp.system.empoigneurid == attacker.id && emp.system.empoigneid == defender.id) + let emp = attacker.itemTypes['empoignade'].find(it => it.system.empoigneurid == attacker.id && it.system.empoigneid == defender.id) if (!emp) { - emp = attacker.items.find(emp => emp.type == 'empoignade' && emp.system.empoigneurid == defender.id && emp.system.empoigneid == attacker.id) + emp = attacker.itemTypes['empoignade'].find(it => it.system.empoigneurid == defender.id && it.system.empoigneid == attacker.id) } if (emp) { // TODO ? central storage ? + return duplicate(emp); } - return emp && duplicate(emp) || undefined; + return undefined; } /* -------------------------------------------- */ static getMalusTaille(emp, attacker, defender) { @@ -252,16 +267,16 @@ export class RdDEmpoignade { console.log("Perte d'endurance :!!!", perteMode) let endValue = defender.system.sante.endurance.value if (perteMode == "end0") { - await defender.santeIncDec("endurance", -defender.system.sante.endurance.value); + await defender.santeIncDec("endurance", -endValue); } if (perteMode == "end1") { - await defender.santeIncDec("endurance", -(defender.system.sante.endurance.value - 1)); + await defender.santeIncDec("endurance", -(endValue - 1)); } if (perteMode == "endmoitie") { - await defender.santeIncDec("endurance", -Math.floor(defender.system.sante.endurance.value / 2)); + await defender.santeIncDec("endurance", -Math.floor(endValue / 2)); } if (perteMode == "endquart") { - await defender.santeIncDec("endurance", -(3 * Math.floor(defender.system.sante.endurance.value / 4))); + await defender.santeIncDec("endurance", -(3 * Math.floor(endValue / 4))); } let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-perte-endurance.html'); ChatUtility.setMessageData(msg, "empoignade-roll-data", rollData) @@ -270,13 +285,11 @@ export class RdDEmpoignade { /* -------------------------------------------- */ static async deleteAllEmpoignades() { for (let actor of game.actors) { - let empList = actor.items.filter(it => it.type == "empoignade") - for (let emp of empList) { - await actor.deleteEmbeddedDocuments('Item', [emp.id]) - } + let empIds = actor.itemTypes["empoignade"].map(it => it.id) + await actor.deleteEmbeddedDocuments('Item', empIds) } } - + /* -------------------------------------------- */ static async deleteLinkedEmpoignade(actorId, empoignade) { let actorDeleteId = (actorId == empoignade.system.empoigneurid) ? empoignade.system.empoigneid : empoignade.system.empoigneurid @@ -290,7 +303,8 @@ export class RdDEmpoignade { /* -------------------------------------------- */ static async createEmpoignade(attacker, defender) { return await Item.create({ - name: "Empoignade en cours de " + attacker.name + ' sur ' + defender.name, type: 'empoignade', + name: "Empoignade en cours de " + attacker.name + ' sur ' + defender.name, + type: 'empoignade', img: "systems/foundryvtt-reve-de-dragon/icons/entites/possession2.webp", system: { description: "", empoignadeid: randomID(16), compteempoigne: 0, empoigneurid: attacker.id, empoigneid: defender.id, ptsemp: 0, empoigneurname: attacker.name, empoignename: defender.name } }, diff --git a/module/sommeil/app-astrologie.js b/module/sommeil/app-astrologie.js index cbe8daa4..82915238 100644 --- a/module/sommeil/app-astrologie.js +++ b/module/sommeil/app-astrologie.js @@ -57,7 +57,7 @@ export class AppAstrologie extends Application { if (this.actor) { return { actor: this.actor, - nombres: this._organizeNombresAstraux(this.actor.listItems('nombreastral')), + nombres: this._organizeNombresAstraux(this.actor.itemTypes['nombreastral']), ajustements: CONFIG.RDD.difficultesLibres, etat: this.actor.getEtatGeneral(), astrologie: this.actor.getCompetence('Astrologie') diff --git a/template.json b/template.json index 785059c7..2c7bf2e6 100644 --- a/template.json +++ b/template.json @@ -692,7 +692,7 @@ "capacite": 0 }, "objet": { - "templates": ["description", "inventaire"] + "templates": ["description", "equipement", "inventaire"] }, "monnaie": { "templates": ["description", "inventaire"] diff --git a/templates/actor/inventaire-item.html b/templates/actor/inventaire-item.html index a658fb12..79ba1eaf 100644 --- a/templates/actor/inventaire-item.html +++ b/templates/actor/inventaire-item.html @@ -28,7 +28,7 @@ {{#if options.isOwner}} {{#unless item.estContenu}} - {{#if (or (eq item.type 'arme') (eq item.type 'armure') )}} + {{#if item.equipable}} {{#if item.system.equipe}}{{else}}{{/if}} {{/if}} {{/unless}}