Files
fvtt-adventures-with-emmy/module/models/character.mjs
T
2026-03-05 22:50:53 +01:00

68 lines
2.7 KiB
JavaScript

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
}
}
}