diff --git a/module/actor/base-actor-sheet.js b/module/actor/base-actor-sheet.js index a734f4c7..e0d92bd1 100644 --- a/module/actor/base-actor-sheet.js +++ b/module/actor/base-actor-sheet.js @@ -31,32 +31,21 @@ export class RdDBaseActorSheet extends ActorSheet { Monnaie.validerMonnaies(this.actor.itemTypes['monnaie']); this.actor.recompute(); - const userRightLevel = game.user.isGM ? CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER : this.actor.getUserLevel(game.user) - const options = duplicate(this.options); - mergeObject(options, { - isGM: game.user.isGM, - editable: this.isEditable, - cssClass: this.isEditable ? "editable" : "locked", - isLimited: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED, - isObserver: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER, - isOwner: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER, - owner: this.actor.isOwner, - }); - let formData = { title: this.title, id: this.actor.id, type: this.actor.type, img: this.actor.img, name: this.actor.name, - system: foundry.utils.deepClone(this.actor.system), + system: this.actor.system, description: await TextEditor.enrichHTML(this.actor.system.description, { async: true }), notesmj: await TextEditor.enrichHTML(this.actor.system.notesmj, { async: true }), - options: options, + options: RdDSheetUtility.mergeDocumentRights(this.options, this.actor, this.isEditable) } + RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes); formData.calc = { - fortune: this.toSolsDeniers(this.actor.getFortune()), + fortune: Monnaie.toSolsDeniers(this.actor.getFortune()), prixTotalEquipement: this.actor.computePrixTotalEquipement(), encTotal: await this.actor.computeEncTotal(), } @@ -64,17 +53,9 @@ export class RdDBaseActorSheet extends ActorSheet { this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets); formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs); - return formData; } - toSolsDeniers(fortune) { - return { - sols: Math.floor(fortune), - deniers: Math.round(100 * (fortune - Math.floor(fortune))) - }; - } - /* -------------------------------------------- */ static filterItemsPerTypeForSheet(formData, itemTypes) { formData.recettescuisine = Misc.arrayOrEmpty(itemTypes['recettecuisine']); diff --git a/module/dialog-item-vente.js b/module/dialog-item-vente.js index 5b6a62ce..fed81902 100644 --- a/module/dialog-item-vente.js +++ b/module/dialog-item-vente.js @@ -8,7 +8,7 @@ export class DialogItemVente extends Dialog { const venteData = { item: item, alias: item.actor?.name ?? game.user.name, - vendeurId: item.actor?.id , + vendeurId: item.actor?.id, prixOrigine: item.calculerPrixCommercant(), prixUnitaire: item.calculerPrixCommercant(), prixLot: item.calculerPrixCommercant(), @@ -40,51 +40,62 @@ export class DialogItemVente extends Dialog { activateListeners(html) { super.activateListeners(html); + this.html = html; - this.setQuantiteIllimite(this.venteData.quantiteIllimite); this.html.find(".tailleLot").change(event => this.setTailleLot(Number(event.currentTarget.value))); this.html.find(".quantiteNbLots").change(event => this.setNbLots(Number(event.currentTarget.value))); this.html.find(".quantiteIllimite").change(event => this.setQuantiteIllimite(event.currentTarget.checked)); this.html.find(".prixLot").change(event => this.setPrixLot(Number(event.currentTarget.value))); + + this.setQuantiteIllimite(this.venteData.quantiteIllimite); } async onProposer(it) { - await this.html.find(".tailleLot").change(); - await this.html.find(".quantiteNbLots").change(); - await this.html.find(".quantiteIllimite").change(); - await this.html.find(".prixLot").change(); + this.updateVente(this.getChoixVente()); this.callback(this.venteData); } + updateVente(update) { + mergeObject(this.venteData, update); + } + + getChoixVente() { + return { + quantiteNbLots: Number(this.html.find(".quantiteNbLots").val()), + tailleLot: Number(this.html.find(".tailleLot").val()), + quantiteIllimite: this.html.find(".quantiteIllimite").is(':checked'), + prixLot: Number(this.html.find(".prixLot").val()) + }; + } + /* -------------------------------------------- */ setPrixLot(prixLot) { this.venteData.prixLot = prixLot; } setTailleLot(tailleLot) { - // recalculer le prix du lot - if (tailleLot != this.venteData.tailleLot) { - this.venteData.prixLot = (tailleLot * this.venteData.prixOrigine).toFixed(2); - this.html.find(".prixLot").val(this.venteData.prixLot); - } - this.venteData.tailleLot = tailleLot; - // recalculer le nombre de lots max - this.venteData.quantiteMaxLots = Math.floor(this.venteData.quantiteMax / tailleLot); - this.venteData.quantiteNbLots = Math.min(this.venteData.quantiteMaxLots, this.venteData.quantiteNbLots); + const maxLots = Math.floor(this.venteData.quantiteMax / tailleLot); + this.updateVente({ + tailleLot, + quantiteNbLots: Math.min(maxLots, this.venteData.quantiteNbLots), + quantiteMaxLots: maxLots, + prixLot: (tailleLot * this.venteData.prixOrigine).toFixed(2) + }); + + this.html.find(".prixLot").val(this.venteData.prixLot); this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots); this.html.find(".quantiteNbLots").attr("max", this.venteData.quantiteMaxLots) } setNbLots(nbLots) { - if (this.venteData.isOwned) { - nbLots = Math.max(0, Math.min(nbLots, this.venteData.quantiteMaxLots)); - } - this.venteData.quantiteNbLots = nbLots; + this.updateVente({ + quantiteNbLots: this.venteData.isOwned ? Math.max(0, Math.min(nbLots, this.venteData.quantiteMaxLots)) : nbLots + }) this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots); } setQuantiteIllimite(checked) { - this.venteData.quantiteIllimite = checked; + this.updateVente({ quantiteIllimite: checked }) this.html.find(".label-quantiteIllimite").text(this.venteData.quantiteIllimite ? "Illimités" : "disponibles"); HtmlUtility.showControlWhen(this.html.find(".quantiteNbLots"), !this.venteData.quantiteIllimite) } diff --git a/module/item-monnaie.js b/module/item-monnaie.js index 5e091b7f..610ee2d9 100644 --- a/module/item-monnaie.js +++ b/module/item-monnaie.js @@ -62,6 +62,13 @@ export class Monnaie { return deniers; } + static toSolsDeniers(fortune) { + return { + sols: Math.floor(fortune), + deniers: Math.round(100 * (fortune - Math.floor(fortune))) + }; + } + static getFortune(monnaies) { return (monnaies??[]) .map(m => Number(m.system.cout) * Number(m.system.quantite)) diff --git a/module/item-sheet.js b/module/item-sheet.js index af48e451..8747e0a3 100644 --- a/module/item-sheet.js +++ b/module/item-sheet.js @@ -86,22 +86,17 @@ export class RdDItemSheet extends ItemSheet { /* -------------------------------------------- */ async getData() { let formData = { - id: this.item.id, title: this.item.name, + id: this.item.id, type: this.item.type, img: this.item.img, name: this.item.name, system: this.item.system, - isGM: game.user.isGM, actorId: this.actor?.id, - isOwned: this.actor ? true : false, - owner: this.item.isOwner, - editable: this.isEditable, - cssClass: this.isEditable ? "editable" : "locked", - isSoins: false, description: await TextEditor.enrichHTML(this.item.system.description, { async: true }), descriptionmj: await TextEditor.enrichHTML(this.item.system.descriptionmj, { async: true }), - isComestible: this.item.getUtilisationCuisine() + isComestible: this.item.getUtilisationCuisine(), + options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable) } const competences = await SystemCompendiums.getCompetences(this.actor?.type); @@ -138,12 +133,12 @@ export class RdDItemSheet extends ItemSheet { if (this.item.type == 'potion') { await RdDHerbes.addPotionFormData(formData); } - if (formData.isOwned && this.item.type == 'herbe' && (formData.system.categorie == 'Soin' || formData.system.categorie == 'Repos')) { + if (formData.options.isOwned && this.item.type == 'herbe' && (formData.system.categorie == 'Soin' || formData.system.categorie == 'Repos')) { formData.isIngredientPotionBase = true; } if (this.item.type == 'sortreserve') { const sortId = this.item.system.sortid; - formData.sort = formData.isOwned ? this.item.actor.items.get(sortId) : game.items.get(sortId); + formData.sort = formData.options.isOwned ? this.item.actor.items.get(sortId) : game.items.get(sortId); } formData.bonusCaseList = RdDItemSort.getBonusCaseList(formData, true); @@ -156,7 +151,9 @@ export class RdDItemSheet extends ItemSheet { super.activateListeners(html); this.html = html; - HtmlUtility.showControlWhen(this.html.find(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.item.isOwned); + HtmlUtility.showControlWhen(this.html.find(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') + || game.user.isGM + || !this.item.isOwned); HtmlUtility.showControlWhen(this.html.find(".item-magique"), this.item.isMagique()); // Everything below here is only needed if the sheet is editable diff --git a/module/item/sheet-conteneur.js b/module/item/sheet-conteneur.js index b5ff7855..fc0f7948 100644 --- a/module/item/sheet-conteneur.js +++ b/module/item/sheet-conteneur.js @@ -29,7 +29,6 @@ export class RdDConteneurItemSheet extends RdDItemInventaireSheet { /* -------------------------------------------- */ prepareConteneurData(formData) { RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes); - this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.objets); formData.subItems = formData.conteneurs.find(it => it._id == this.item.id)?.subItems; } @@ -44,7 +43,8 @@ export class RdDConteneurItemSheet extends RdDItemInventaireSheet { const dragData = { actorId: this.actor.id, type: "Item", - data: item.system + data: item.system, + uuid: item.uuid }; event.dataTransfer.setData("text/plain", JSON.stringify(dragData)); @@ -52,7 +52,8 @@ export class RdDConteneurItemSheet extends RdDItemInventaireSheet { async _onDropItem(event, dragData) { if (this.actor) { - const dropParams = await RdDSheetUtility.prepareItemDropParameters(this.item.id, this.actor, dragData, this.objetVersConteneur); + const destItemId = this.html.find(event.target)?.closest('.item').attr('data-item-id') ?? this.item.id + const dropParams = await RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor, dragData, this.objetVersConteneur); await this.actor.processDropItem(dropParams); await this.render(true); } diff --git a/module/item/sheet-service.js b/module/item/sheet-service.js index a819247d..b9b00146 100644 --- a/module/item/sheet-service.js +++ b/module/item/sheet-service.js @@ -6,7 +6,7 @@ export class RdDServiceItemSheet extends RdDItemSheet { async getData() { const formData = await super.getData(); - formData.disabled = formData.isGM || formData.isOwned ? '' : 'disabled'; + formData.disabled = formData.options.isGM || formData.options.isOwned ? '' : 'disabled'; return formData; } diff --git a/module/rdd-alchimie.js b/module/rdd-alchimie.js index add4bd7c..64605ab4 100644 --- a/module/rdd-alchimie.js +++ b/module/rdd-alchimie.js @@ -8,13 +8,11 @@ export class RdDAlchimie { /* -------------------------------------------- */ static processManipulation(recette, actorId = undefined) { - //console.log("CALLED", recette, recette.isOwned, actorId ); let manip = recette.system.manipulation; let matchArray = manip.match(matchOperations); if (matchArray) { for (let matchStr of matchArray) { let result = matchStr.match(matchOperationTerms); - //console.log("RESULT ", result); if (result[1] && result[2]) { let commande = Misc.upperFirst(result[1]); let replacement = this[`_alchimie${commande}`](recette, result[2], actorId); diff --git a/module/rdd-sheet-utility.js b/module/rdd-sheet-utility.js index e1090a04..da9732cb 100644 --- a/module/rdd-sheet-utility.js +++ b/module/rdd-sheet-utility.js @@ -1,9 +1,24 @@ import { DialogSplitItem } from "./dialog-split-item.js"; import { RdDItem } from "./item.js"; -import { SystemCompendiums } from "./settings/system-compendiums.js"; export class RdDSheetUtility { + static mergeDocumentRights(options, document, editable) { + const userRightLevel = game.user.isGM + ? CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER + : document.getUserLevel(game.user); + mergeObject(options, { + isGM: game.user.isGM, + isOwned: document.parent, + editable: editable, + cssClass: editable ? "editable" : "locked", + isLimited: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.LIMITED, + isObserver: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER, + isOwner: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER + }); + return options; + } + static getItem(event, actor) { return actor.items.get(RdDSheetUtility.getItemId(event)) } @@ -23,7 +38,7 @@ export class RdDSheetUtility { static async prepareItemDropParameters(destItemId, actor, dragData, objetVersConteneur) { let item = fromUuidSync(dragData.uuid); - if (item.pack && !item.system){ + if (item.pack && !item.system) { item = await RdDItem.getCorrespondingItem(item); } if (actor.canReceive(item)) { diff --git a/module/rdd-utility.js b/module/rdd-utility.js index ef8a1000..d0b8ccb5 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -278,8 +278,9 @@ export class RdDUtility { Handlebars.registerHelper('apostrophe', (article, str) => Grammar.apostrophe(article, str)); Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str)); Handlebars.registerHelper('accord', (genre, ...args) => Grammar.accord(genre, args)); - Handlebars.registerHelper('buildConteneur', (objet, templateItem, options) => { return new Handlebars.SafeString(RdDUtility.buildConteneur(objet, 1, templateItem, options)); }); - Handlebars.registerHelper('buildContenu', (objet) => { return new Handlebars.SafeString(RdDUtility.buildContenu(objet, 1, true)); }); + Handlebars.registerHelper('buildLigneInventaire', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildLigneInventaire(item, options)); }); + Handlebars.registerHelper('buildInventaireConteneur', (actorId, itemId, options) => { return new Handlebars.SafeString(RdDUtility.buildInventaireConteneur(actorId, itemId, options)); }); + Handlebars.registerHelper('buildContenuConteneur', (item, options) => { return new Handlebars.SafeString(RdDUtility.buildContenuConteneur(item, options)); }); Handlebars.registerHelper('calculerPrixCommercant', item => item.calculerPrixCommercant()); Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord)); Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord)); @@ -394,38 +395,58 @@ export class RdDUtility { return conteneurs.filter((conteneur, index, arr) => !conteneur.estContenu); } - /* -------------------------------------------- */ - /** Construit la structure récursive des conteneurs, avec imbrication potentielle - * - */ - static buildConteneur(objet, profondeur, templateItem, options) { - if (!profondeur) profondeur = 1; - if (!templateItem) templateItem = 'actor/inventaire-item.html' - objet.niveau = profondeur; - - const isConteneur = objet.type == 'conteneur'; - const isOuvert = isConteneur && this.getAfficheContenu(objet._id); - const isVide = isConteneur && objet.system.contenu.length == 0; - const conteneur = Handlebars.partials[`systems/foundryvtt-reve-de-dragon/templates/${templateItem}`]({ - item: objet, - vide: isVide, - ouvert: isOuvert, - options: options - }); - const contenu = isConteneur ? RdDUtility.buildContenu(objet, profondeur, isOuvert, templateItem, options) : ''; - return conteneur + contenu; + static prepareOptionsArbreInventaire(item, optionsArbre) { + if (!optionsArbre.profondeur) { + optionsArbre.profondeur = 1 + }; + if (!optionsArbre.templateItem) { + optionsArbre.templateItem = item.parent?.type == 'commerce' + ? "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire-item.html" + : "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-item.html"; + } + item.niveau = optionsArbre.profondeur; } /* -------------------------------------------- */ - static buildContenu(objet, profondeur, afficherContenu, templateItem, options) { - if (!profondeur) profondeur = 1; - if (!templateItem) templateItem = 'actor/inventaire-item.html' - objet.niveau = profondeur; - const display = afficherContenu ? 'item-display-show' : 'item-display-hide'; - let strContenu = ` diff --git a/templates/actor/editor-notes-mj.html b/templates/actor/editor-notes-mj.html index c34e91b8..32c17a6e 100644 --- a/templates/actor/editor-notes-mj.html +++ b/templates/actor/editor-notes-mj.html @@ -1,6 +1,6 @@ {{#if options.isGM}}

Notes du MJ :

- {{editor notesmj target="system.notesmj" button=true owner=owner editable=true engine="prosemirror"}} + {{editor notesmj target="system.notesmj" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
{{/if}} diff --git a/templates/actor/inventaire-item.html b/templates/actor/inventaire-item.html index a1f25f49..a89f0716 100644 --- a/templates/actor/inventaire-item.html +++ b/templates/actor/inventaire-item.html @@ -1,4 +1,4 @@ -{{#if (or @root.options.isObserver (ne item.type 'monnaie'))}} +{{#if (or options.isObserver (ne item.type 'monnaie'))}}
  • {{#if (eq item.type 'conteneur')}} @@ -21,24 +21,24 @@ {{numberFormat item.system.encTotal decimals=2}} - {{#if @root.options.isOwner}} - {{#unless item.estContenu}} - {{#if (or (eq item.type 'arme') (eq item.type 'armure') )}} - {{#if item.system.equipe}}{{else}}{{/if}} - {{/if}} - {{/unless}} - - -   - {{#if (ne item.system.quantite 0)}} - - {{/if}} + {{#if options.isOwner}} + {{#unless item.estContenu}} + {{#if (or (eq item.type 'arme') (eq item.type 'armure') )}} + {{#if item.system.equipe}}{{else}}{{/if}} + {{/if}} + {{/unless}} + + +   + {{#if (ne item.system.quantite 0)}} + + {{/if}} {{/if}} - {{#if @root.options.isOwner}} - {{#if item.system.actionPrincipale}} - {{item.system.actionPrincipale}} - {{/if}} + {{#if options.isOwner}} + {{#if item.system.actionPrincipale}} + {{item.system.actionPrincipale}} + {{/if}} {{/if}}
  • diff --git a/templates/actor/inventaire.html b/templates/actor/inventaire.html index c080c069..61e13c29 100644 --- a/templates/actor/inventaire.html +++ b/templates/actor/inventaire.html @@ -1,6 +1,8 @@

    Equipement

    + {{#if options.isOwned}} Nouvel objet + {{/if}} {{#if options.isGM}} Tout vider {{/if}} @@ -20,11 +22,11 @@ {{#each objets as |item id|}} {{#unless item.estContenu}} {{#if (ne item.type 'conteneur')}} - {{> "systems/foundryvtt-reve-de-dragon/templates/actor/inventaire-item.html" item=item vide=true ouvert=true options=@root.options}} + {{buildLigneInventaire item @root.options}} {{/if}} {{/unless}} {{/each}} {{#each conteneurs as |conteneur id|}} - {{buildConteneur this 'actor/inventaire-item.html' @root.options}} + {{buildLigneInventaire conteneur @root.options}} {{/each}} diff --git a/templates/dialog-item-vente.html b/templates/dialog-item-vente.html index 1307b33a..0a2b4313 100644 --- a/templates/dialog-item-vente.html +++ b/templates/dialog-item-vente.html @@ -13,7 +13,7 @@
    - {{#unless isOwned}} + {{#unless options.isOwned}} diff --git a/templates/item-competence-sheet.html b/templates/item-competence-sheet.html index 78a7a780..d0287462 100644 --- a/templates/item-competence-sheet.html +++ b/templates/item-competence-sheet.html @@ -3,7 +3,7 @@

    - {{#if isGM}} + {{#if options.isGM}} {{else}} {{item.name}} @@ -32,7 +32,7 @@

    - {{#if isGM}} + {{#if options.isGM}}
    {{>"systems/foundryvtt-reve-de-dragon/templates/item/partial-inventaire.html"}} - - {{#if isOwned}} + {{#if options.isOwned}}
    -
    • Nom @@ -24,7 +22,7 @@ Enc. Actions
    • - {{buildContenu this}} + {{buildInventaireConteneur actorId id options}}
    {{/if}} diff --git a/templates/item-extraitpoetique-sheet.html b/templates/item-extraitpoetique-sheet.html index a02127c0..5c0414b5 100644 --- a/templates/item-extraitpoetique-sheet.html +++ b/templates/item-extraitpoetique-sheet.html @@ -12,13 +12,13 @@
    - {{editor extrait target="system.extrait" button=true owner=owner editable=true engine="prosemirror"}} + {{editor extrait target="system.extrait" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
    - {{editor texte target="system.texte" button=true owner=owner editable=true engine="prosemirror"}} + {{editor texte target="system.texte" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
    diff --git a/templates/item-faune-sheet.html b/templates/item-faune-sheet.html index cde0c58c..2970fc02 100644 --- a/templates/item-faune-sheet.html +++ b/templates/item-faune-sheet.html @@ -29,7 +29,7 @@
    {{#if system.actor.id}} - {{#if isGM}} + {{#if options.isGM}}