daggerheart/module/documents/tokenManager.mjs
2026-07-13 16:57:43 -04:00

73 lines
2.4 KiB
JavaScript

/**
* A singleton class that handles creating tokens.
*/
export default class DhTokenManager {
/**
* Create a token previer
* @param {Actor} actor
* @param {object} tokenData
*/
async createPreview(actor, tokenData) {
const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes;
if (actor?.system.metadata.usesSize) {
const tokenSize = tokenSizes[actor.system.size];
if (tokenSize && actor.system.size !== CONFIG.DH.ACTOR.tokenSize.custom.id) {
tokenData.width = tokenSize;
tokenData.height = tokenSize;
tokenData.depth = tokenSize;
}
}
const placedData = await canvas.tokens.placeTokens(
[
{
...(await actor.getTokenDocument()).toObject(),
actorId: actor.id,
displayName: 50,
...tokenData
}
],
{ create: false }
);
return placedData[0] ?? null;
}
/**
* Creates new tokens on the canvas by placing previews.
* @param {object} tokenData
* @param {object} options
*/
async createTokensWithPreview(tokensData, { elevation } = {}) {
const scene = game.scenes.get(game.user.viewedScene);
if (!scene) return;
const level = scene.levels.get(game.user.viewedLevel);
if (!level) return;
const createElevation = elevation ?? level.elevation.bottom;
for (const tokenData of tokensData) {
const previewToken = await this.createPreview(tokenData.actor, {
name: tokenData.tokenPreviewName,
level: game.user.viewedLevel,
elevation: createElevation,
flags: { daggerheart: { createPlacement: true } }
});
if (!previewToken) return null;
const finalTokenData = {
...previewToken.toObject(),
name: tokenData.actor.prototypeToken.name,
displayName: tokenData.actor.prototypeToken.displayName,
flags: tokenData.actor.prototypeToken.flags
};
await canvas.scene.createEmbeddedDocuments(
'Token',
[finalTokenData],
{ controlObject: true, parent: canvas.scene }
);
}
}
}