Fix fiche creature

This commit is contained in:
2026-06-07 23:51:31 +02:00
parent 6dea5ba479
commit 939247e731
80 changed files with 233 additions and 261 deletions
@@ -81,6 +81,47 @@ export default class MournbladeCYD2ActorSheetV2 extends HandlebarsApplicationMix
tabGroups = { primary: "stats" };
/**
* Intercept form data before ActorSheetV2 validates it, to sanitize
* empty numeric fields that would otherwise fail DataModel validation.
* Mirrors the same logic in MournbladeCYD2Actor._preUpdate.
* @override
*/
_prepareSubmitData(event, form, formData) {
const fd = formData ?? new foundry.applications.ux.FormDataExtended(form);
const data = {};
for (const [k, v] of fd) {
foundry.utils.setProperty(data, k, v);
}
this._sanitizeNumericData(data);
this.document.validate(data, { partial: true });
return data;
}
/**
* Walk submitted data and convert empty/invalid values in NumberField
* paths to 0 so schema validation passes.
* @param {object} data
*/
_sanitizeNumericData(data) {
if (!data?.system || typeof data.system !== "object") return;
const fields = this.document.system.schema.fields;
for (const [schemaPath, schemaField] of Object.entries(fields)) {
if (!(schemaField instanceof foundry.data.fields.SchemaField)) continue;
const branch = data.system[schemaPath];
if (!branch || typeof branch !== "object") continue;
for (const [key, value] of Object.entries(branch)) {
if (schemaField.fields[key] instanceof foundry.data.fields.NumberField) {
if (value === "" || value === null || value === undefined || isNaN(value)) {
data.system[schemaPath][key] = 0;
} else {
data.system[schemaPath][key] = Number(value);
}
}
}
}
}
/** @override */
async _prepareContext() {
const actor = this.document;
+23 -23
View File
@@ -56,47 +56,47 @@ export default class CreatureDataModel extends foundry.abstract.TypeDataModel {
})
}),
bonneaventure: new fields.SchemaField({
base: new fields.NumberField({ initial: 0, integer: true }),
actuelle: new fields.NumberField({ initial: 0, integer: true })
base: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
actuelle: new fields.NumberField({ initial: 0, integer: true, nullable: true })
}),
experience: new fields.SchemaField({
value: new fields.NumberField({ initial: 0, integer: true })
value: new fields.NumberField({ initial: 0, integer: true, nullable: true })
}),
eclat: new fields.SchemaField({
value: new fields.NumberField({ initial: 0, integer: true })
value: new fields.NumberField({ initial: 0, integer: true, nullable: true })
}),
sante: new fields.SchemaField({
vigueur: new fields.NumberField({ initial: 0, integer: true, min: 0 }),
vigueur: new fields.NumberField({ initial: 0, integer: true, min: 0, nullable: true }),
etat: new fields.NumberField({ initial: 0, integer: true, min: 0, nullable: true }),
vigueurmodifier: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
nbcombativite: new fields.NumberField({ initial: 5, integer: true, min: 0, nullable: true })
}),
ame: new fields.SchemaField({
seuilpouvoir: new fields.NumberField({ initial: 0, integer: true }),
etat: new fields.NumberField({ initial: 0, integer: true }),
seuilpouvoirmodifier: new fields.NumberField({ initial: 0, integer: true }),
nbame: new fields.NumberField({ initial: 7, integer: true }),
max: new fields.NumberField({ initial: 0, integer: true })
seuilpouvoir: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
etat: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
seuilpouvoirmodifier: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
nbame: new fields.NumberField({ initial: 7, integer: true, nullable: true }),
max: new fields.NumberField({ initial: 0, integer: true, nullable: true })
}),
adversite: new fields.SchemaField({
bleue: new fields.NumberField({ initial: 0, integer: true }),
rouge: new fields.NumberField({ initial: 0, integer: true }),
noire: new fields.NumberField({ initial: 0, integer: true })
bleue: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
rouge: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
noire: new fields.NumberField({ initial: 0, integer: true, nullable: true })
}),
vitesse: new fields.SchemaField({
value: new fields.NumberField({ initial: 0, integer: true })
value: new fields.NumberField({ initial: 0, integer: true, nullable: true })
}),
combat: new fields.SchemaField({
initbonus: new fields.NumberField({ initial: 0, integer: true }),
inittotal: new fields.NumberField({ initial: 0, integer: true }),
vitessebonus: new fields.NumberField({ initial: 0, integer: true }),
bonusdegats: new fields.NumberField({ initial: 0, integer: true }),
attaquebonus: new fields.NumberField({ initial: 0, integer: true }),
defensebonus: new fields.NumberField({ initial: 0, integer: true }),
defensetotal: new fields.NumberField({ initial: 0, integer: true }),
initbonus: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
inittotal: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
vitessebonus: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
bonusdegats: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
attaquebonus: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
defensebonus: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
defensetotal: new fields.NumberField({ initial: 0, integer: true, nullable: true }),
defensetotale: new fields.BooleanField({ initial: false }),
monte: new fields.BooleanField({ initial: false }),
protectiontotal: new fields.NumberField({ initial: 0, integer: true })
protectiontotal: new fields.NumberField({ initial: 0, integer: true, nullable: true })
}),
balance: new fields.SchemaField({
loi: new fields.NumberField({ initial: 0, integer: true }),
@@ -108,7 +108,7 @@ export default class CreatureDataModel extends foundry.abstract.TypeDataModel {
}),
// Spécifique aux créatures
ressources: new fields.SchemaField({
value: new fields.NumberField({ initial: 0, integer: true })
value: new fields.NumberField({ initial: 0, integer: true, nullable: true })
}),
soustype: new fields.StringField({ initial: "creature" })
};