Initial skeleton
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
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
|
||||
}
|
||||
|
||||
// Compute max HP if not overridden
|
||||
// Base HP = 10 + (level * 2) + fitness modifier
|
||||
const fitnessMod = this.attributes.fitness.mod ?? 0
|
||||
if (this.hp.max === 10) {
|
||||
this.hp.max = 10 + (level * 2) + fitnessMod
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user