81 lines
3.0 KiB
JavaScript
81 lines
3.0 KiB
JavaScript
import { SYSTEM } from "../config/system.mjs"
|
|
import { abilitySchema, booleanField, conditionSchema, htmlField, numberField, stringField, trackSchema } from "./shared.mjs"
|
|
|
|
export default class MGNECharacter extends foundry.abstract.TypeDataModel {
|
|
static defineSchema() {
|
|
const fields = foundry.data.fields
|
|
|
|
return {
|
|
abilities: abilitySchema(),
|
|
hp: trackSchema(1, 1),
|
|
omens: new fields.SchemaField({
|
|
current: numberField(0, 0),
|
|
die: new fields.StringField({ required: true, nullable: false, initial: "d2", choices: SYSTEM.omenDieChoices }),
|
|
}),
|
|
resonance: new fields.SchemaField({
|
|
max: numberField(1, 0),
|
|
used: numberField(0, 0),
|
|
blocked: booleanField(false),
|
|
}),
|
|
artifactSync: new fields.SchemaField({
|
|
used: numberField(0, 0),
|
|
}),
|
|
survival: new fields.SchemaField({
|
|
salvationUsed: booleanField(false),
|
|
}),
|
|
conditions: conditionSchema(),
|
|
carryCapacity: numberField(8, 0),
|
|
carryCapacityModifier: numberField(0, 0),
|
|
rations: numberField(0, 0),
|
|
kiffol: numberField(0, 0),
|
|
background: stringField(""),
|
|
origin: stringField(""),
|
|
scars: stringField(""),
|
|
motivation: stringField(""),
|
|
vice: stringField(""),
|
|
description: htmlField(""),
|
|
notes: htmlField(""),
|
|
}
|
|
}
|
|
|
|
prepareDerivedData() {
|
|
super.prepareDerivedData()
|
|
|
|
this.resonance.remaining = Math.max(0, (this.resonance.max ?? 0) - (this.resonance.used ?? 0))
|
|
this.syncLimit = Math.max(0, this.abilities.toughness?.value ?? 0)
|
|
this.syncRemaining = Math.max(0, this.syncLimit - (this.artifactSync.used ?? 0))
|
|
this.armorFormula = this.parent?.getArmorRollFormula?.() ?? "0"
|
|
|
|
// Compute carry capacity: base STR + 8 + feature capacities + direct modifier
|
|
const featureCapacity = (this.parent?.items ?? [])
|
|
.filter(i => i.type === "feature")
|
|
.reduce((sum, f) => sum + (f.system?.capacity ?? 0), 0)
|
|
this.carryCapacity = (this.abilities.strength?.value ?? 0) + 8 + featureCapacity + (this.carryCapacityModifier ?? 0)
|
|
|
|
// Compute current load per RAW:
|
|
// Only items with a weight field count — features and creature-traits are excluded
|
|
// trivial = 0, light = 10 per slot, normal = 1, heavy = 2
|
|
let normalLoad = 0
|
|
let lightCount = 0
|
|
let heavyCount = 0
|
|
for (const item of (this.parent?.items ?? [])) {
|
|
if (!("weight" in (item.system ?? {}))) continue // no weight field (features, traits)
|
|
if (item.system?.carried === false) continue // not being carried
|
|
const w = item.system?.weight ?? "normal"
|
|
if (w === "trivial") continue
|
|
else if (w === "light") lightCount++
|
|
else if (w === "normal") normalLoad++
|
|
else if (w === "heavy") heavyCount++
|
|
}
|
|
normalLoad += Math.floor(lightCount / 10)
|
|
this.lightItemCount = lightCount
|
|
this.heavyItemCount = heavyCount
|
|
|
|
this.currentLoad = normalLoad + heavyCount * 2
|
|
this.overloaded = this.currentLoad > this.carryCapacity
|
|
}
|
|
|
|
/** @override */
|
|
static LOCALIZATION_PREFIXES = ["MGNE.Character"]
|
|
}
|