import { SYSTEM } from "../config/system.mjs" export default class AwECharacter extends foundry.abstract.TypeDataModel { static defineSchema() { const fields = foundry.data.fields const requiredInteger = { required: true, nullable: false, integer: true } const schema = {} schema.description = new fields.HTMLField({ required: true, textSearch: true }) schema.notes = new fields.HTMLField({ required: true, textSearch: true }) // Identity schema.pronouns = new fields.StringField({ initial: "", required: false, nullable: true }) schema.fieldName = new fields.StringField({ initial: "", required: false, nullable: true }) schema.specialization = new fields.StringField({ initial: "", required: false, nullable: true }) schema.archetypeName = new fields.StringField({ initial: "", required: false, nullable: true }) schema.backgroundName = new fields.StringField({ initial: "", required: false, nullable: true }) // Core stats schema.level = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1, max: 10 }) schema.stride = new fields.NumberField({ ...requiredInteger, initial: 5, min: 0 }) // Hit Points schema.hp = new fields.SchemaField({ value: new fields.NumberField({ ...requiredInteger, initial: 10, min: 0 }), max: new fields.NumberField({ ...requiredInteger, initial: 10, min: 0 }), temp: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) }) // Flow Points schema.flowPoints = new fields.SchemaField({ value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), temp: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) }) // Attributes: agility, fitness, awareness, influence // boostLevel: how many boosts applied (0-4) // mod = level + boostLevel (computed in prepareDerivedData) // dc = 10 + mod (computed) // bonus: manual +/- bonus const attributeField = () => new fields.SchemaField({ boostLevel: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0, max: 4 }), bonus: new fields.NumberField({ required: true, nullable: false, integer: true, initial: 0 }) }) schema.attributes = new fields.SchemaField( Object.values(SYSTEM.ATTRIBUTES).reduce((obj, attr) => { obj[attr.id] = attributeField() return obj }, {}) ) return schema } /** @override */ prepareDerivedData() { super.prepareDerivedData() const level = this.level for (const attrId of Object.keys(SYSTEM.ATTRIBUTES)) { const attr = this.attributes[attrId] attr.mod = level + attr.boostLevel + attr.bonus attr.dc = 10 + attr.mod } } }