Files
hbm-foundry-system/src/data/item-spell.ts
T

117 lines
4.1 KiB
TypeScript

import {
makeIntField,
makeStringField,
makeBoolField,
makeHtmlField,
makeArrayField,
fields,
} from './fields';
import {
CASTING_MODES,
SPELL_SCHOOLS,
SACRED_DEITIES,
SOURCE_BOOKS,
AOE_SHAPES,
SPELL_DAMAGE_TYPES,
TRIGGER_EVENTS,
TS_DEFAULT_THRESHOLD,
TS_DEFAULT_REQUIRED,
} from '../constants';
export class SpellData extends foundry.abstract.TypeDataModel {
static defineSchema() {
const f = fields();
return {
// Identification
school: makeStringField('', { blank: true, choices: SPELL_SCHOOLS as unknown as readonly string[] }),
discipline: makeStringField(''),
deity: makeStringField('', { blank: true, choices: SACRED_DEITIES as unknown as readonly string[] }),
sourceBook: makeStringField('', { blank: true, choices: SOURCE_BOOKS as unknown as readonly string[] }),
// Casting mode + resources
castingMode: makeStringField('standard', { blank: false, choices: CASTING_MODES as unknown as readonly string[] }),
manaCost: makeIntField(1, { min: 0 }),
bloodCost: makeIntField(0, { min: 0 }),
// Difficulty
difficulty: new f.SchemaField({
threshold: makeIntField(TS_DEFAULT_THRESHOLD, { min: 2, max: 6 }),
successes: makeIntField(TS_DEFAULT_REQUIRED, { min: 1, max: 30 }),
}),
// Components
components: new f.SchemaField({
verbal: makeBoolField(false),
somatic: makeBoolField(false),
material: makeStringField(''),
symbols: makeArrayField(new f.StringField({ blank: false })),
}),
// Timing & geometry
castingTime: makeStringField('1 akcja'),
castingTimeRounds: makeIntField(0, { min: 0 }),
castingTimeMinutes: makeIntField(0, { min: 0 }),
range: makeStringField(''),
targets: makeStringField(''),
duration: makeStringField(''),
areaOfEffect: new f.SchemaField({
shape: makeStringField('point', { blank: false, choices: AOE_SHAPES as unknown as readonly string[] }),
x: makeIntField(0, { min: 0 }),
y: makeIntField(0, { min: 0 }),
unit: makeStringField('m'),
}),
// Damage
damageBase: makeStringField(''),
// Category Obrażenia: +1 damage (Rodzaje Obrażeń). Vault frontmatter has no category yet.
damageCategory: makeBoolField(false),
damageType: makeStringField('magical', { blank: false, choices: SPELL_DAMAGE_TYPES as unknown as readonly string[] }),
ignoresArmor: makeBoolField(false),
// Status effects on hit
statusEffects: makeArrayField(new f.StringField({ blank: false })),
saveAttribute: makeStringField(''),
saveSkill: makeStringField(''),
// Requirements
requirements: new f.SchemaField({
race: makeArrayField(new f.StringField({ blank: false })),
talent: makeArrayField(new f.StringField({ blank: false })),
discipline: makeArrayField(new f.StringField({ blank: false })),
}),
// Flags
isSuperspell: makeBoolField(false),
requiresGroupCast: makeBoolField(false),
minCasters: makeIntField(1, { min: 1 }),
nonCombatOnly: makeBoolField(false),
// Overcast - structured
overcastOptions: makeArrayField(new f.SchemaField({
description: makeStringField(''),
manaPerStep: makeIntField(1, { min: 0 }),
})),
// Reactive triggers
triggers: makeArrayField(new f.SchemaField({
event: makeStringField('killWithWeapon', { blank: false, choices: TRIGGER_EVENTS as unknown as readonly string[] }),
effect: makeStringField(''),
})),
// Variable success summons (Przywołanie Istoty z Otchłani)
variableSuccesses: makeArrayField(new f.SchemaField({
label: makeStringField(''),
successes: makeIntField(1, { min: 1, max: 30 }),
})),
// Description
description: makeHtmlField(''),
higherCircles: makeHtmlField(''), // legacy - superseded by overcastOptions
// Legacy fields (kept for migration; will be removed in a later release)
overcasting: makeStringField(''),
// `complexityLevel` was removed 2026-10-26: Poziom Skomplikowania = number of Symbols.
};
}
}