diff --git a/modules/models/arme.mjs b/modules/models/arme.mjs index e8e6683..37a675e 100644 --- a/modules/models/arme.mjs +++ b/modules/models/arme.mjs @@ -1,17 +1,13 @@ /** * Data model pour les armes MournbladeCYD2 */ -export default class ArmeDataModel extends foundry.abstract.TypeDataModel { +import { BaseItemWithPriceDataModel } from "./base-item.mjs"; + +export default class ArmeDataModel extends BaseItemWithPriceDataModel { static defineSchema() { const fields = foundry.data.fields; return { - description: new fields.HTMLField({ initial: "" }), - prixpo: new fields.NumberField({ initial: 0, integer: true }), - prixca: new fields.NumberField({ initial: 0, integer: true }), - prixsc: new fields.NumberField({ initial: 0, integer: true }), - rarete: new fields.NumberField({ initial: 0, integer: true }), - quantite: new fields.NumberField({ initial: 1, integer: true }), - equipped: new fields.BooleanField({ initial: false }), + ...super.defineSchema(), typearme: new fields.StringField({ initial: "" }), armenaturelle: new fields.BooleanField({ initial: false }), armefortune: new fields.BooleanField({ initial: false }), diff --git a/modules/models/base-item.mjs b/modules/models/base-item.mjs index 31d83ef..6e60920 100644 --- a/modules/models/base-item.mjs +++ b/modules/models/base-item.mjs @@ -9,3 +9,21 @@ export default class BaseItemDataModel extends foundry.abstract.TypeDataModel { }; } } + +/** + * Data model de base pour les items avec prix MournbladeCYD2 + */ +export class BaseItemWithPriceDataModel extends BaseItemDataModel { + static defineSchema() { + const fields = foundry.data.fields; + return { + ...super.defineSchema(), + prixpo: new fields.NumberField({ initial: 0, integer: true }), + prixca: new fields.NumberField({ initial: 0, integer: true }), + prixsc: new fields.NumberField({ initial: 0, integer: true }), + rarete: new fields.NumberField({ initial: 0, integer: true }), + quantite: new fields.NumberField({ initial: 1, integer: true }), + equipped: new fields.BooleanField({ initial: false }) + }; + } +} diff --git a/modules/models/equipement.mjs b/modules/models/equipement.mjs index a517d66..9708c2d 100644 --- a/modules/models/equipement.mjs +++ b/modules/models/equipement.mjs @@ -1,17 +1,13 @@ /** * Data model pour les équipements MournbladeCYD2 */ -export default class EquipementDataModel extends foundry.abstract.TypeDataModel { +import { BaseItemWithPriceDataModel } from "./base-item.mjs"; + +export default class EquipementDataModel extends BaseItemWithPriceDataModel { static defineSchema() { const fields = foundry.data.fields; return { - description: new fields.HTMLField({ initial: "" }), - prixpo: new fields.NumberField({ initial: 0, integer: true }), - prixca: new fields.NumberField({ initial: 0, integer: true }), - prixsc: new fields.NumberField({ initial: 0, integer: true }), - rarete: new fields.NumberField({ initial: 0, integer: true }), - quantite: new fields.NumberField({ initial: 1, integer: true }), - equipped: new fields.BooleanField({ initial: false }) + ...super.defineSchema() }; } } diff --git a/modules/models/monnaie.mjs b/modules/models/monnaie.mjs index 1856d17..8c6024b 100644 --- a/modules/models/monnaie.mjs +++ b/modules/models/monnaie.mjs @@ -1,17 +1,13 @@ /** * Data model pour les monnaies MournbladeCYD2 */ -export default class MonnaieDataModel extends foundry.abstract.TypeDataModel { +import { BaseItemWithPriceDataModel } from "./base-item.mjs"; + +export default class MonnaieDataModel extends BaseItemWithPriceDataModel { static defineSchema() { const fields = foundry.data.fields; return { - description: new fields.HTMLField({ initial: "" }), - prixpo: new fields.NumberField({ initial: 0, integer: true }), - prixca: new fields.NumberField({ initial: 0, integer: true }), - prixsc: new fields.NumberField({ initial: 0, integer: true }), - rarete: new fields.NumberField({ initial: 0, integer: true }), - quantite: new fields.NumberField({ initial: 1, integer: true }), - equipped: new fields.BooleanField({ initial: false }) + ...super.defineSchema() }; } } diff --git a/modules/models/protection.mjs b/modules/models/protection.mjs index edf8cec..1c753b8 100644 --- a/modules/models/protection.mjs +++ b/modules/models/protection.mjs @@ -1,17 +1,13 @@ /** * Data model pour les protections MournbladeCYD2 */ -export default class ProtectionDataModel extends foundry.abstract.TypeDataModel { +import { BaseItemWithPriceDataModel } from "./base-item.mjs"; + +export default class ProtectionDataModel extends BaseItemWithPriceDataModel { static defineSchema() { const fields = foundry.data.fields; return { - description: new fields.HTMLField({ initial: "" }), - prixpo: new fields.NumberField({ initial: 0, integer: true }), - prixca: new fields.NumberField({ initial: 0, integer: true }), - prixsc: new fields.NumberField({ initial: 0, integer: true }), - rarete: new fields.NumberField({ initial: 0, integer: true }), - quantite: new fields.NumberField({ initial: 1, integer: true }), - equipped: new fields.BooleanField({ initial: false }), + ...super.defineSchema(), protection: new fields.NumberField({ initial: 0, integer: true }), adversitepoids: new fields.NumberField({ initial: 0, integer: true }) }; diff --git a/modules/mournblade-cyd2-actor.js b/modules/mournblade-cyd2-actor.js index c00743c..6c19dad 100644 --- a/modules/mournblade-cyd2-actor.js +++ b/modules/mournblade-cyd2-actor.js @@ -634,9 +634,7 @@ export class MournbladeCYD2Actor extends Actor { let valueSC = 0 for (let monnaie of this.items) { if (monnaie.type == "monnaie") { - valueSC += Number(monnaie.system.prixsc) * Number(monnaie.system.quantite) - valueSC += (Number(monnaie.system.prixca) * Number(monnaie.system.quantite)) * 10 - valueSC += (Number(monnaie.system.prixpo) * Number(monnaie.system.quantite)) * 100 + valueSC += MournbladeCYD2Utility.getItemValueSC(monnaie) } } return MournbladeCYD2Utility.computeMonnaieDetails(valueSC) @@ -647,9 +645,7 @@ export class MournbladeCYD2Actor extends Actor { let valueSC = 0 for (let equip of this.items) { if (equip.type == "equipement" || equip.type == "arme" || equip.type == "protection") { - valueSC += Number(equip.system.prixsc) * Number(equip.system.quantite ?? 1) - valueSC += (Number(equip.system.prixca) * Number(equip.system.quantite ?? 1)) * 10 - valueSC += (Number(equip.system.prixpo) * Number(equip.system.quantite ?? 1)) * 100 + valueSC += MournbladeCYD2Utility.getItemValueSC(equip) } } return MournbladeCYD2Utility.computeMonnaieDetails(valueSC) diff --git a/modules/mournblade-cyd2-utility.js b/modules/mournblade-cyd2-utility.js index 0ac5887..f8dc6b8 100644 --- a/modules/mournblade-cyd2-utility.js +++ b/modules/mournblade-cyd2-utility.js @@ -54,13 +54,49 @@ export class MournbladeCYD2Utility { // Conversion selon le lore Mournblade : // 1 SA (Sou d'Argent / Pièce d'Argent) = 10 PB (Pièces de Bronze / Sous de Cuivre) // 1 PO (Pièce d'Or) = 10 SA = 100 PB - // Donc : 1 CA = 10 SC, 1 PO = 100 SC - Handlebars.registerHelper('calculateItemValueSC', function (prixpo, prixca, prixsc) { + // Donc : 1 PA (Pièce d'Argent) = 10 SC, 1 PO (Pièce d'Or) = 100 SC + static calculateItemValueSC(prixpo, prixca, prixsc) { const po = parseInt(prixpo) || 0; const ca = parseInt(prixca) || 0; const sc = parseInt(prixsc) || 0; return po * 100 + ca * 10 + sc; + } + + // Helper Handlebars pour les templates + Handlebars.registerHelper('calculateItemValueSC', function (prixpo, prixca, prixsc) { + return MournbladeCYD2Utility.calculateItemValueSC(prixpo, prixca, prixsc); }); + + // Helper pour localiser les valeurs d'allégeance + Handlebars.registerHelper('localizeAllegiance', function (value) { + if (!value) return value; + const allegianceMap = { + 'tous': 'MNBL.all', + 'chaos': 'MNBL.chaos', + 'loi': 'MNBL.law', + 'betes': 'MNBL.betes', + 'elementaires': 'MNBL.elementaires', + 'balance': 'MNBL.balance' + }; + const key = allegianceMap[value?.toLowerCase?.()] || value; + return game.i18n?.localize?.(key) ?? value; + }); + + // Helper pour joindre les prédilections sans virgule superflue + Handlebars.registerHelper('joinPredilections', function (predilections) { + if (!predilections || !Array.isArray(predilections)) return ''; + return predilections + .filter(pred => pred && pred.acquise && !pred.used) + .map(pred => pred.name) + .join(', '); + }); + + // Helper pour calculer la valeur SC d'un item avec quantité + static getItemValueSC(item) { + const value = this.calculateItemValueSC(item.system?.prixpo, item.system?.prixca, item.system?.prixsc); + const quantity = item.system?.quantite || 1; + return value * quantity; + } Handlebars.registerHelper('select', function(value, options) { const html = options.fn(this); diff --git a/templates/actor-sheet.hbs b/templates/actor-sheet.hbs index cdff436..a606877 100644 --- a/templates/actor-sheet.hbs +++ b/templates/actor-sheet.hbs @@ -273,11 +273,7 @@ data-attr-key="tochoose">{{skill.name}} - {{#each skill.system.predilections as |pred key|}} - {{#if (and pred.acquise (not pred.used))}} - {{pred.name}}{{#unless (eq key (subtract skill.system.predilections.length 1))}}, {{/unless}} - {{/if}} - {{/each}} + {{joinPredilections skill.system.predilections}} @@ -336,7 +332,7 @@