Fix fiche creature
This commit is contained in:
@@ -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
@@ -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" })
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user