Refactor: Eliminate code duplication for currency conversion and item pricing

- Add static calculateItemValueSC() and getItemValueSC() helpers to MournbladeCYD2Utility
  to centralize currency conversion logic (1 PO = 100 SC, 1 PA = 10 SC)
- Refactor computeRichesse() and computeValeurEquipement() in Actor to use shared helpers
- Add localizeAllegiance Handlebars helper to display allegiance values localized
  (tous->Tous, chaos->Chaos, loi->Loi, betes->Bêtes, elementaires->Élémentaires)
- Add joinPredilections helper to fix comma display after single Predilection
- Create BaseItemWithPriceDataModel base class for items with pricing fields
  (prixpo, prixca, prixsc, rarete, quantite, equipped)
- Update arme, equipement, protection, monnaie models to extend base class
- Update actor-sheet and creature-sheet templates to use new helpers
- Update partial-item-prix.hbs to display total item value in SC
- Add item-base-sheet.hbs template for future item sheet inheritance

Fixes:
- Allegiance values now display properly localized in Dons & Pactes tabs
- Predilections no longer show trailing comma with single entry
- Equipment value totals now update correctly when items are added/modified
- Currency conversion logic centralized and consistent across the system

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
2026-06-07 20:52:46 +02:00
parent 0d4bd37f30
commit 4c33607b2b
12 changed files with 105 additions and 53 deletions
+4 -8
View File
@@ -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 }),
+18
View File
@@ -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 })
};
}
}
+4 -8
View File
@@ -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()
};
}
}
+4 -8
View File
@@ -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()
};
}
}
+4 -8
View File
@@ -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 })
};