diff --git a/daggerheart.mjs b/daggerheart.mjs index e223865d..17707d68 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -54,11 +54,8 @@ Hooks.once('init', () => { Items.registerSheet(SYSTEM.id, applications.DhpArmor, { types: ['armor'], makeDefault: true }); CONFIG.Actor.documentClass = documents.DhpActor; - CONFIG.Actor.dataModels = { - character: models.DhCharacter, - adversary: models.DhpAdversary, - environment: models.DhpEnvironment - }; + CONFIG.Actor.dataModels = models.actors.config; + Actors.unregisterSheet('core', foundry.applications.sheets.ActorSheetV2); Actors.registerSheet(SYSTEM.id, applications.DhCharacterSheet, { types: ['character'], makeDefault: true }); Actors.registerSheet(SYSTEM.id, applications.DhpAdversarySheet, { types: ['adversary'], makeDefault: true }); diff --git a/lang/en.json b/lang/en.json index a843e2c6..363a4e63 100755 --- a/lang/en.json +++ b/lang/en.json @@ -14,7 +14,6 @@ }, "Actor": { "character": "Character", - "npc": "NPC", "adversary": "Adversary", "environment": "Environment" } diff --git a/module/data/_module.mjs b/module/data/_module.mjs index 85dae6dd..e7712547 100644 --- a/module/data/_module.mjs +++ b/module/data/_module.mjs @@ -1,10 +1,8 @@ -export { default as DhCharacter } from './character.mjs'; export { default as DhClass } from './item/class.mjs'; export { default as DhSubclass } from './item/subclass.mjs'; export { default as DhCombat } from './combat.mjs'; export { default as DhCombatant } from './combatant.mjs'; -export { default as DhpAdversary } from './adversary.mjs'; -export { default as DhpEnvironment } from './environment.mjs'; +export * as actors from './actor/_module.mjs'; export * as items from './item/_module.mjs'; export * as messages from './chat-message/_modules.mjs'; diff --git a/module/data/actor/_module.mjs b/module/data/actor/_module.mjs new file mode 100644 index 00000000..cdbf7178 --- /dev/null +++ b/module/data/actor/_module.mjs @@ -0,0 +1,11 @@ +import DhCharacter from './character.mjs'; +import DhAdversary from './adversary.mjs'; +import DhEnvironment from './environment.mjs'; + +export { DhCharacter, DhAdversary, DhEnvironment }; + +export const config = { + character: DhCharacter, + adversary: DhAdversary, + environment: DhEnvironment +}; diff --git a/module/data/adversary.mjs b/module/data/actor/adversary.mjs similarity index 90% rename from module/data/adversary.mjs rename to module/data/actor/adversary.mjs index 7e4c28f1..834c5f17 100644 --- a/module/data/adversary.mjs +++ b/module/data/actor/adversary.mjs @@ -1,12 +1,21 @@ +import BaseDataActor from './base.mjs'; + const resourceField = () => new foundry.data.fields.SchemaField({ value: new foundry.data.fields.NumberField({ initial: 0, integer: true }), max: new foundry.data.fields.NumberField({ initial: 0, integer: true }) }); -export default class DhpAdversary extends foundry.abstract.TypeDataModel { +export default class DhpAdversary extends BaseDataActor { static LOCALIZATION_PREFIXES = ['DAGGERHEART.Sheets.Adversary']; + static get metadata() { + return foundry.utils.mergeObject(super.metadata, { + label: 'TYPES.Actor.adversary', + type: 'adversary' + }); + } + static defineSchema() { const fields = foundry.data.fields; return { @@ -20,7 +29,6 @@ export default class DhpAdversary extends foundry.abstract.TypeDataModel { choices: SYSTEM.ACTOR.adversaryTypes, initial: SYSTEM.ACTOR.adversaryTypes.standard.id }), - description: new fields.HTMLField(), motivesAndTactics: new fields.HTMLField(), difficulty: new fields.NumberField({ required: true, initial: 1, integer: true }), damageThresholds: new fields.SchemaField({ diff --git a/module/data/actor/base.mjs b/module/data/actor/base.mjs new file mode 100644 index 00000000..442c6e93 --- /dev/null +++ b/module/data/actor/base.mjs @@ -0,0 +1,34 @@ +/** + * Describes metadata about the actor data model type + * @typedef {Object} ActorDataModelMetadata + * @property {string} label - A localizable label used on application. + * @property {string} type - The system type that this data model represents. + */ +export default class BaseDataActor extends foundry.abstract.TypeDataModel { + /** @returns {ActorDataModelMetadata}*/ + static get metadata() { + return { + label: 'Base Actor', + type: 'base' + }; + } + + /** @inheritDoc */ + static defineSchema() { + const fields = foundry.data.fields; + + return { + description: new fields.HTMLField({ required: true, nullable: true }) + }; + } + + /** + * Obtain a data object used to evaluate any dice rolls associated with this Item Type + * @param {object} [options] - Options which modify the getRollData method. + * @returns {object} + */ + getRollData() { + const data = { ...this }; + return data; + } +} diff --git a/module/data/character.mjs b/module/data/actor/character.mjs similarity index 95% rename from module/data/character.mjs rename to module/data/actor/character.mjs index a3494ecd..def502b5 100644 --- a/module/data/character.mjs +++ b/module/data/actor/character.mjs @@ -1,6 +1,7 @@ -import { burden } from '../config/generalConfig.mjs'; -import ForeignDocumentUUIDField from './fields/foreignDocumentUUIDField.mjs'; -import { LevelOptionType } from './levelTier.mjs'; +import { burden } from '../../config/generalConfig.mjs'; +import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; +import { LevelOptionType } from '../levelTier.mjs'; +import BaseDataActor from './base.mjs'; const attributeField = () => new foundry.data.fields.SchemaField({ @@ -14,7 +15,14 @@ const resourceField = max => max: new foundry.data.fields.NumberField({ initial: max, integer: true }) }); -export default class DhCharacter extends foundry.abstract.TypeDataModel { +export default class DhCharacter extends BaseDataActor { + static get metadata() { + return foundry.utils.mergeObject(super.metadata, { + label: 'TYPES.Actor.character', + type: 'character' + }); + } + static defineSchema() { const fields = foundry.data.fields; @@ -60,7 +68,6 @@ export default class DhCharacter extends foundry.abstract.TypeDataModel { }) ), story: new fields.HTMLField(), - description: new fields.HTMLField(), class: new fields.SchemaField({ value: new ForeignDocumentUUIDField({ type: 'Item', nullable: true }), subclass: new ForeignDocumentUUIDField({ type: 'Item', nullable: true }) diff --git a/module/data/environment.mjs b/module/data/actor/environment.mjs similarity index 68% rename from module/data/environment.mjs rename to module/data/actor/environment.mjs index a2cd7529..3209dfdc 100644 --- a/module/data/environment.mjs +++ b/module/data/actor/environment.mjs @@ -1,9 +1,17 @@ -import { environmentTypes } from '../config/actorConfig.mjs'; -import ForeignDocumentUUIDField from './fields/foreignDocumentUUIDField.mjs'; +import { environmentTypes } from '../../config/actorConfig.mjs'; +import BaseDataActor from './base.mjs'; +import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; -export default class DhEnvironment extends foundry.abstract.TypeDataModel { +export default class DhEnvironment extends BaseDataActor { static LOCALIZATION_PREFIXES = ['DAGGERHEART.Sheets.Environment']; + static get metadata() { + return foundry.utils.mergeObject(super.metadata, { + label: 'TYPES.Actor.environment', + type: 'environment' + }); + } + static defineSchema() { const fields = foundry.data.fields; return { @@ -13,7 +21,6 @@ export default class DhEnvironment extends foundry.abstract.TypeDataModel { initial: SYSTEM.GENERAL.tiers.tier1.id }), type: new fields.StringField({ choices: environmentTypes }), - description: new fields.HTMLField(), impulses: new fields.HTMLField(), difficulty: new fields.NumberField({ required: true, initial: 11, integer: true }), potentialAdversaries: new fields.TypedObjectField(