170 lines
3.8 KiB
JavaScript
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"]
|
|
}
|