Files
fvtt-prism-rpg/module/models/spell.mjs
T
2025-11-06 00:01:59 +01:00

170 lines
3.8 KiB
JavaScript

import { SYSTEM } from "../config/system.mjs"
export default class PrismRPGSpell 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: false,
blank: true,
initial: "",
textSearch: true,
})
// Spell level (1-7+)
schema.level = new fields.NumberField({
...requiredInteger,
initial: 1,
min: 1,
max: 25,
})
// Mana cost - base cost of the spell
schema.manaCost = new fields.NumberField({
...requiredInteger,
required: true,
initial: 1,
min: 0,
label: "Mana Cost"
})
// Mana upkeep cost (for sustained spells)
schema.manaUpkeep = new fields.NumberField({
...requiredInteger,
required: true,
initial: 0,
min: 0,
label: "Mana Upkeep"
})
// APC to cast
schema.apc = new fields.NumberField({
...requiredInteger,
required: true,
initial: 1,
min: 0,
label: "Action Point Cost"
})
// Color/Hue of the spell (from the Prism)
schema.color = new fields.StringField({
required: true,
initial: "violet",
choices: Object.keys(SYSTEM.SPELL_COLORS || {}),
label: "Spell Color"
})
// Color effect description
schema.colorEffect = new fields.HTMLField({
required: true,
initial: "",
label: "Color Effect"
})
// Spell Ascension - can be upcast
schema.canAscend = new fields.BooleanField({
required: true,
initial: true,
label: "Can Ascend"
})
schema.ascensionEffect = new fields.HTMLField({
required: true,
initial: "",
label: "Ascension Effect"
})
// Memorized (prepared)
schema.memorized = new fields.BooleanField({
required: true,
initial: false
})
// Components
schema.components = new fields.SchemaField({
verbal: new fields.BooleanField({ initial: false }),
somatic: new fields.BooleanField({ initial: false }),
catalyst: new fields.BooleanField({ initial: false }),
material: new fields.BooleanField({ initial: false }),
})
schema.materialComponent = new fields.StringField({
required: true,
initial: ""
})
schema.catalyst = new fields.StringField({
required: true,
initial: ""
})
// Casting parameters
schema.castingTime = new fields.StringField({
required: true,
initial: "1 action"
})
schema.spellRange = new fields.StringField({
required: true,
initial: "30ft"
})
schema.areaAffected = new fields.StringField({
required: true,
initial: "Single target"
})
schema.duration = new fields.StringField({
required: true,
initial: "Instantaneous"
})
schema.savingThrow = new fields.StringField({
required: true,
initial: ""
})
// Attack and damage
schema.attackRoll = new fields.StringField({
required: true,
initial: ""
})
schema.powerRoll = new fields.StringField({
required: true,
initial: ""
})
// Keywords
schema.keywords = new fields.ArrayField(
new fields.StringField()
)
// Legacy fields
schema.cost = new fields.NumberField({
...requiredInteger,
required: true,
initial: 0,
min: 0
})
schema.extraAetherPoints = new fields.StringField({
required: true,
initial: ""
})
schema.criticalType = new fields.StringField({
required: true,
initial: "electric",
choices: SYSTEM.SPELL_CRITICAL
})
return schema
}
/** @override */
static LOCALIZATION_PREFIXES = ["PRISMRPG.Spell"]
}