Files
fvtt-celestopol/module/models/items.mjs
LeRatierBretonnier d5488516c4 feat: ajoute le champ 'valeur' sur l'item Aspect
- DataModel : champ NumberField 'valeur' (entier, min 0, défaut 0)
- Fiche item aspect.hbs : champ valeur dans le header
- Fiche personnage : affiche item.system.valeur dans la liste des aspects
- CSS : .item-value dans cel-item-row (vert, gras) ; .item-header-valeur dans items.less
- i18n : CELESTOPOL.Aspect.valeur

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-29 19:10:42 +02:00

91 lines
3.5 KiB
JavaScript

import { SYSTEM } from "../config/system.mjs"
/** Schéma partagé pour les bonus/malus par domaine (utilisé dans anomaly/aspect). */
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) }),
level: new fields.NumberField({ ...reqInt, initial: 2, min: 1, max: 4 }),
usesRemaining: new fields.NumberField({ ...reqInt, initial: 2, min: 0, max: 4 }),
technique: new fields.HTMLField({ required: true, textSearch: true }),
narratif: new fields.HTMLField({ required: true, textSearch: true }),
exemples: new fields.HTMLField({ required: true, textSearch: true }),
}
}
}
export class CelestopolAspect extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
return {
valeur: new fields.NumberField({ required: true, integer: true, initial: 0, min: 0 }),
description: new fields.HTMLField({ required: true, textSearch: true }),
}
}
}
export class CelestopolEquipment extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
return {
description: new fields.HTMLField({ required: true, textSearch: true }),
}
}
}
export class CelestopolWeapon extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const reqInt = { required: true, nullable: false, integer: true }
return {
type: new fields.StringField({ required: true, nullable: false, initial: "melee",
choices: Object.keys(SYSTEM.WEAPON_COMBAT_TYPES) }),
degats: new fields.StringField({ required: true, nullable: false, initial: "0",
choices: Object.keys(SYSTEM.WEAPON_DAMAGE_TYPES) }),
portee: new fields.StringField({ required: true, nullable: false, initial: "contact",
choices: Object.keys(SYSTEM.WEAPON_RANGE_TYPES) }),
description: new fields.HTMLField({ required: true, textSearch: true }),
}
}
}
export class CelestopolArmure extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const reqInt = { required: true, nullable: false, integer: true }
return {
protection: new fields.NumberField({ ...reqInt, initial: 1, min: 1, max: 2 }),
malus: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 2 }),
description: new fields.HTMLField({ required: true, textSearch: true }),
}
}
}