/** * Schémas partagés pour les DataModels Vermine 2047. * Fonctions factory retournant des objets SchemaField réutilisables. */ /** * Retourne un schema pour une blessure (minor/major/deadly) * @param {number} defaultThreshold * @param {number} defaultMax * @returns {Object} */ export function woundSchema(defaultThreshold = 1, defaultMax = 5) { const fields = foundry.data.fields const reqInt = { required: true, nullable: false, integer: true } return { threshold: new fields.NumberField({ ...reqInt, initial: defaultThreshold, min: 0 }), value: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), min: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), max: new fields.NumberField({ ...reqInt, initial: defaultMax, min: 0 }) } } /** * Schema des 3 types de blessures présents sur tous les acteurs. */ export function woundsSchema() { const fields = foundry.data.fields return new fields.SchemaField({ minorWound: new fields.SchemaField(woundSchema(1, 5)), majorWound: new fields.SchemaField(woundSchema(4, 4)), deadlyWound: new fields.SchemaField(woundSchema(8, 2)) }) } /** * Statut de combat (offensif/actif/passif). */ export function combatStatusSchema(defaultDifficulty = "7") { const fields = foundry.data.fields return new fields.SchemaField({ label: new fields.StringField({ required: true, nullable: false, initial: "" }), difficulty: new fields.StringField({ required: true, nullable: false, initial: defaultDifficulty }) }) } /** * Description d'équipement. */ export function equipmentSchema() { const fields = foundry.data.fields return new fields.SchemaField({ description: new fields.HTMLField({ required: true, initial: "", textSearch: true }) }) } /** * Attribut avec value/min/max. * @param {number} defaultVal * @param {number} defaultMin * @param {number} defaultMax */ export function attributeSchema(defaultVal = 0, defaultMin = 0, defaultMax = 10) { const fields = foundry.data.fields const reqInt = { required: true, nullable: false, integer: true } return new fields.SchemaField({ value: new fields.NumberField({ ...reqInt, initial: defaultVal, min: defaultMin }), min: new fields.NumberField({ ...reqInt, initial: defaultMin, min: 0 }), max: new fields.NumberField({ ...reqInt, initial: defaultMax, min: 0 }) }) } /** * Caractéristique (capacité) avec catégorie. * @param {string} category - physical, manual, mental, social */ export function abilityField(category) { const fields = foundry.data.fields const reqInt = { required: true, nullable: false, integer: true } return new fields.SchemaField({ value: new fields.NumberField({ ...reqInt, initial: 1, min: 0, max: 5 }), min: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), max: new fields.NumberField({ ...reqInt, initial: 5, min: 0 }), category: new fields.StringField({ required: true, nullable: false, initial: category }) }) } /** * Les 8 caractéristiques communes à character et npc. */ export function abilitiesSchema() { const fields = foundry.data.fields return new fields.SchemaField({ vigor: abilityField("physical"), health: abilityField("physical"), precision: abilityField("manual"), reflexes: abilityField("manual"), knowledge: abilityField("mental"), perception: abilityField("mental"), will: abilityField("social"), empathy: abilityField("social") }) } /** * Une compétence individuelle. * @param {string} category * @param {number} rarity - 0, 1, ou 2 */ export function skillField(category, rarity = 0) { const fields = foundry.data.fields const reqInt = { required: true, nullable: false, integer: true } return new fields.SchemaField({ value: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 5 }), min: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), max: new fields.NumberField({ ...reqInt, initial: 5, min: 0 }), category: new fields.StringField({ required: true, nullable: false, initial: category }), rarity: new fields.NumberField({ ...reqInt, initial: rarity, min: 0, max: 2 }) }) } /** * Les 30 compétences (character et npc). */ export function skillsSchema() { const fields = foundry.data.fields return new fields.SchemaField({ // man arts: skillField("man", 1), civilization: skillField("man", 2), psychology: skillField("man", 1), rumors: skillField("man", 0), healing: skillField("man", 1), // animal animalism: skillField("animal", 1), dissection: skillField("animal", 2), wildlife: skillField("animal", 1), repulsion: skillField("animal", 0), tracks: skillField("animal", 0), // tool crafting: skillField("tool", 2), diy: skillField("tool", 0), mecanical: skillField("tool", 2), piloting: skillField("tool", 1), technology: skillField("tool", 2), // weapon firearms: skillField("weapon", 2), archery: skillField("weapon", 0), armory: skillField("weapon", 2), throwing: skillField("weapon", 0), melee: skillField("weapon", 0), // survival alertness: skillField("survival", 0), atletics: skillField("survival", 0), food: skillField("survival", 0), stealth: skillField("survival", 0), close: skillField("survival", 0), // world environment: skillField("world", 1), flora: skillField("world", 1), road: skillField("world", 0), toxics: skillField("world", 2), ruins: skillField("world", 1) }) } /** * Catégories de compétences avec domaine de prédilection. */ export function skillCategoriesSchema() { const fields = foundry.data.fields return new fields.SchemaField({ preferred: new fields.StringField({ required: true, nullable: false, initial: "" }), man: new fields.SchemaField({ label: new fields.StringField({ required: true, initial: "VERMINE.skill_category.man" }), preferred: new fields.BooleanField({ required: true, initial: false }) }), animal: new fields.SchemaField({ label: new fields.StringField({ required: true, initial: "VERMINE.skill_category.animal" }), preferred: new fields.BooleanField({ required: true, initial: false }) }), tool: new fields.SchemaField({ label: new fields.StringField({ required: true, initial: "VERMINE.skill_category.tool" }), preferred: new fields.BooleanField({ required: true, initial: false }) }), weapon: new fields.SchemaField({ label: new fields.StringField({ required: true, initial: "VERMINE.skill_category.weapon" }), preferred: new fields.BooleanField({ required: true, initial: false }) }), survival: new fields.SchemaField({ label: new fields.StringField({ required: true, initial: "VERMINE.skill_category.survival" }), preferred: new fields.BooleanField({ required: true, initial: false }) }), world: new fields.SchemaField({ label: new fields.StringField({ required: true, initial: "VERMINE.skill_category.world" }), preferred: new fields.BooleanField({ required: true, initial: false }) }) }) } // ── Item shared schemas ────────────────────────────────────────────────── const reqInt = { required: true, nullable: false, integer: true } /** * Rareté avec handicap. */ export function raritySchema() { const fields = foundry.data.fields return new fields.SchemaField({ value: new fields.NumberField({ ...reqInt, initial: 3, min: 1, max: 5 }), handicap: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }) }) } /** * Dégâts des items (hors arme). */ export function itemDamagesSchema() { const fields = foundry.data.fields return new fields.SchemaField({ value: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 5 }), min: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), max: new fields.NumberField({ ...reqInt, initial: 5, min: 0 }), pannes: new fields.ArrayField(new fields.StringField({ required: true, initial: "" }), { initial: ["mineure", "mineure", "grave", "grave", "critique"] }), state: new fields.ArrayField(new fields.StringField({ required: true, initial: "" }), { initial: ["endommagé", "endommagé", "défectueux", "défectueux", "hors d'usage"] }), effect: new fields.ArrayField(new fields.StringField({ required: true, initial: "" }), { initial: ["bonus annulé", "bonus annulé", "malus 1D", "malus 1D", "inutilisable"] }) }) } /** * Base commune à tous les items (template "base" dans l'ancien template.json). */ export function baseItemSchema() { const fields = foundry.data.fields return { description: new fields.HTMLField({ required: true, initial: "", textSearch: true }), rarity: raritySchema(), reliability: new fields.NumberField({ ...reqInt, initial: 3, min: 1, max: 5 }), handicap: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), quantity: new fields.NumberField({ ...reqInt, initial: 1, min: 1 }), weight: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), traits: new fields.ObjectField({ required: true, initial: {} }), damages: itemDamagesSchema() } } /** * Template "list" pour les items abstraits (ability, background, trauma, evolution, rumor, target). * Version légère avec seulement description. */ export function listItemSchema() { const fields = foundry.data.fields return { description: new fields.HTMLField({ required: true, initial: "", textSearch: true }) } } /** * Schéma d'apprentissage pour les abilities. */ export function learnSchema() { const fields = foundry.data.fields return new fields.SchemaField({ threshold: new fields.NumberField({ ...reqInt, initial: 5, min: 0 }), hindrance: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }) }) } /** * Niveau générique (value/min/max). */ export function levelSchema(defaultVal = 1, defaultMin = 1, defaultMax = 5) { const fields = foundry.data.fields return new fields.SchemaField({ value: new fields.NumberField({ ...reqInt, initial: defaultVal, min: defaultMin }), min: new fields.NumberField({ ...reqInt, initial: defaultMin, min: 0 }), max: new fields.NumberField({ ...reqInt, initial: defaultMax, min: 0 }) }) }