Daggerheart-fvtt/module/documents/actor.mjs

120 lines
3.9 KiB
JavaScript
Raw Normal View History

import { CANDELAFVTT } from '../helpers/config.mjs';
/**
* Extend the base Actor document by defining a custom roll data structure.
* @extends {Actor}
*/
export class CandelafvttActor extends Actor {
/** @override */
prepareData() {
// Prepare data for the actor. Calling the super version of this executes
// the following, in order: data reset (to clear active effects),
// prepareBaseData(), prepareEmbeddedDocuments() (including active effects),
// prepareDerivedData().
super.prepareData();
}
/** @override */
prepareBaseData() {
// Data modifications in this step occur before processing embedded
// documents or derived data.
}
/**
* @override
* Augment the basic actor data with additional dynamic data. Typically,
* you'll want to handle most of your calculated/derived data in this step.
* Data calculated in this step should generally not exist in template.json
* (such as ability modifiers rather than ability scores) and should be
* available both inside and outside of character sheets (such as if an actor
* is queried and has a roll executed directly from it).
*/
async prepareDerivedData() {
const actorData = this;
const systemData = actorData.system;
const flags = actorData.flags.candelafvtt || {};
// Make separate methods for each Actor type (character, npc, etc.) to keep
// things organized.
this._prepareCharacterData(actorData);
this._prepareCircleData(actorData);
}
/**
* Prepare Character type specific data
*/
async _prepareCharacterData(actorData) {
if (actorData.type !== CANDELAFVTT.types.character) return;
// Get role and spec from items
for (let i of actorData.items) {
// set role.
if (i.type === CANDELAFVTT.types.role) {
actorData.system.role = i;
}
// set specialty.
else if (i.type === CANDELAFVTT.types.specialty) {
actorData.system.specialty = i;
}
}
// calculate resistances
for (let [k, v] of Object.entries(actorData.system.actionCategories)) {
v.resistance.max = Math.floor(v.drives.max / 3);
}
}
/**
* Prepare Circle type specific data.
*/
_prepareCircleData(actorData) {
if (actorData.type !== CANDELAFVTT.types.circle) return;
// set resources based on circle members
let memberCount = actorData.system.members ? actorData.system.members.length : 0;
for (let [k, v] of Object.entries(actorData.system.resources)) {
v.max = memberCount + 1;
}
// populate illumination array with illuminationCount values and start to count with 1
actorData.system.illuminationArray = [...Array(actorData.system.illumination.max).keys()];
for (let [e, i] of actorData.system.illuminationArray.entries()) {
actorData.system.illuminationArray[i] = e + 1;
}
// find and add members
for (let [i, m] of actorData.system.members.entries()) {
const actors = foundry.utils.parseUuid(m.uuid);
const member = actors.collection.get(actors.documentId);
actorData.system.members[i].name = member.name;
}
}
/**
* Override getRollData() that's supplied to rolls.
*/
getRollData() {
const data = super.getRollData();
// Prepare character roll data.
this._getCharacterRollData(data);
this._getCircleRollData(data);
return data;
}
/**
* Prepare character roll data.
*/
_getCharacterRollData(data) {
if (this.type !== CANDELAFVTT.types.character) return;
}
/**
* Prepare Circle roll data.
*/
_getCircleRollData(data) {
if (this.type !== CANDELAFVTT.types.circle) return;
}
}