import { SYSTEM } from "../config/system.mjs" /** Schéma partagé pour les bonus/malus par domaine (utilisé dans anomaly/aspect/attribute). */ function skillScoresSchema() { const fields = foundry.data.fields const reqInt = { required: true, nullable: false, integer: true } const scoreField = () => new fields.SchemaField({ bonus: new fields.NumberField({ ...reqInt, initial: 0 }), malus: new fields.NumberField({ ...reqInt, initial: 0 }), }) const statGroup = (statId) => { const skills = SYSTEM.SKILLS[statId] const schema = {} for (const key of Object.keys(skills)) { schema[key] = scoreField() } return new fields.SchemaField(schema) } return new fields.SchemaField({ ame: statGroup("ame"), corps: statGroup("corps"), coeur: statGroup("coeur"), esprit: statGroup("esprit"), }) } export class CelestopolAnomaly extends foundry.abstract.TypeDataModel { static defineSchema() { const fields = foundry.data.fields const reqInt = { required: true, nullable: false, integer: true } return { subtype: new fields.StringField({ required: true, nullable: false, initial: "none", choices: Object.keys(SYSTEM.ANOMALY_TYPES) }), value: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 8 }), reference: new fields.StringField({ required: true, nullable: false, initial: "" }), scores: skillScoresSchema(), description: new fields.HTMLField({ required: true, textSearch: true }), technique: new fields.HTMLField({ required: true, textSearch: true }), narratif: new fields.HTMLField({ required: true, textSearch: true }), notes: new fields.HTMLField({ required: true, textSearch: true }), } } } export class CelestopolAspect extends foundry.abstract.TypeDataModel { static defineSchema() { const fields = foundry.data.fields const reqInt = { required: true, nullable: false, integer: true } return { value: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 8 }), reference: new fields.StringField({ required: true, nullable: false, initial: "" }), scores: skillScoresSchema(), description: new fields.HTMLField({ required: true, textSearch: true }), technique: new fields.HTMLField({ required: true, textSearch: true }), narratif: new fields.HTMLField({ required: true, textSearch: true }), notes: new fields.HTMLField({ required: true, textSearch: true }), } } } export class CelestopolAttribute extends foundry.abstract.TypeDataModel { static defineSchema() { const fields = foundry.data.fields const reqInt = { required: true, nullable: false, integer: true } return { value: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 8 }), reference: new fields.StringField({ required: true, nullable: false, initial: "" }), scores: skillScoresSchema(), description: new fields.HTMLField({ required: true, textSearch: true }), technique: new fields.HTMLField({ required: true, textSearch: true }), narratif: new fields.HTMLField({ required: true, textSearch: true }), notes: new fields.HTMLField({ required: true, textSearch: true }), } } } export class CelestopolEquipment extends foundry.abstract.TypeDataModel { static defineSchema() { const fields = foundry.data.fields const reqInt = { required: true, nullable: false, integer: true } return { subtype: new fields.StringField({ required: true, nullable: false, initial: "autre", choices: Object.keys(SYSTEM.EQUIPMENT_TYPES) }), reference: new fields.StringField({ required: true, nullable: false, initial: "" }), quantity: new fields.NumberField({ ...reqInt, initial: 1, min: 0 }), weight: new fields.NumberField({ required: true, nullable: false, initial: 0, min: 0 }), damage: new fields.StringField({ required: true, nullable: false, initial: "" }), range: new fields.StringField({ required: true, nullable: false, initial: "" }), speed: new fields.StringField({ required: true, nullable: false, initial: "" }), protection: new fields.StringField({ required: true, nullable: false, initial: "" }), crew: new fields.StringField({ required: true, nullable: false, initial: "" }), description:new fields.HTMLField({ required: true, textSearch: true }), notes: new fields.HTMLField({ required: true, textSearch: true }), } } }