Actor Data Models: - VagabondActorBase: Shared base class with biography field - CharacterData: Full PC schema with stats, skills, saves, resources, custom crit thresholds, dynamic resources, item slots, wealth tracking - NPCData: Monster stat block with HD, HP, TL, zone, morale, actions, abilities, immunities/weaknesses Item Data Models: - VagabondItemBase: Shared base with description field - AncestryData: Being type, size, racial traits - ClassData: Progression tables, features, mana/casting, trained skills - SpellData: Dynamic mana cost calculation, delivery/duration types - PerkData: Prerequisites system, stat/skill/spell requirements - WeaponData: Damage, grip, properties, attack types, crit thresholds - ArmorData: Armor value, type, dodge penalty - EquipmentData: Quantity, slots, consumables - FeatureData: Class features with Active Effect changes Active Effects Integration: - Helper module for creating and managing Active Effects - Effect key mapping for stats, saves, skills, crit thresholds - Utilities for applying/removing item effects Derived Value Calculations (CharacterData): - Max HP = Might × Level - Speed by Dexterity lookup - Item Slots = 8 + Might - Fatigue - Save difficulties from stat pairs - Skill difficulties (trained doubles stat contribution) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
68 lines
1.6 KiB
JavaScript
68 lines
1.6 KiB
JavaScript
/**
|
|
* Base Item Data Model
|
|
*
|
|
* Provides shared data fields and methods for all item types in Vagabond RPG.
|
|
* This is an abstract base class - use specific item data models for actual items.
|
|
*
|
|
* @extends foundry.abstract.TypeDataModel
|
|
*/
|
|
export default class VagabondItemBase extends foundry.abstract.TypeDataModel {
|
|
/**
|
|
* Define the base schema shared by all items.
|
|
* Subclasses should call super.defineSchema() and extend the result.
|
|
*
|
|
* @returns {Object} The schema definition
|
|
*/
|
|
static defineSchema() {
|
|
const fields = foundry.data.fields;
|
|
return {
|
|
// Rich text description
|
|
description: new fields.HTMLField({ required: false, blank: true }),
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Prepare base data for the item.
|
|
* Called before derived data calculation.
|
|
*/
|
|
prepareBaseData() {
|
|
// Base preparation - subclasses can override
|
|
}
|
|
|
|
/**
|
|
* Prepare derived data for the item.
|
|
* Called after base data and before render.
|
|
*/
|
|
prepareDerivedData() {
|
|
// Derived data calculation - subclasses should override
|
|
}
|
|
|
|
/**
|
|
* Get the roll data for this item for use in Roll formulas.
|
|
*
|
|
* @returns {Object} Roll data object with item's values
|
|
*/
|
|
getRollData() {
|
|
const data = { ...this };
|
|
|
|
// Include parent actor's roll data if available
|
|
if (this.parent?.actor) {
|
|
data.actor = this.parent.actor.getRollData();
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
/**
|
|
* Get a chat card data object for this item.
|
|
* Override in subclasses for type-specific chat output.
|
|
*
|
|
* @returns {Object} Chat card data
|
|
*/
|
|
getChatData() {
|
|
return {
|
|
description: this.description,
|
|
};
|
|
}
|
|
}
|