update summon cost application to use compendium

This commit is contained in:
Mike Bloy 2025-06-08 23:07:08 -05:00
parent 0153896eeb
commit 59f9022e43
3 changed files with 26 additions and 22 deletions

View File

@ -788,20 +788,18 @@ export class PowerEffect {
export class ActorFolderEffect extends PowerEffect { export class ActorFolderEffect extends PowerEffect {
async init() { async init() {
await super.init(); await super.init();
this.packActors = await this.actorFolderPack.getIndex({ fields: ['system.stats.size'] }); const extraFields = ['system.stats.size', 'flags.swade-mb-helpers.summonData'];
this.packActors = await ActorFolderEffect.actorFolderPack.getIndex({ fields: extraFields });
this.data.actors = this.prepActors(); this.data.actors = this.prepActors();
} }
get actorFolderPackId() {
return moduleHelpers.getSetting(settingKeys.powerActorsCompendium);
}
get actorFolderBase() { get actorFolderBase() {
return ''; return '';
} }
get actorFolderPack() { static get actorFolderPack() {
const pack = game.packs.get(this.actorFolderPackId); const packId = moduleHelpers.getSetting(settingKeys.powerActorsCompendium);
const pack = game.packs.get(packId);
if (!pack) { if (!pack) {
return undefined; return undefined;
} }
@ -814,16 +812,16 @@ export class ActorFolderEffect extends PowerEffect {
return `${this.actorFolderBase}/${this.name}`; return `${this.actorFolderBase}/${this.name}`;
} }
getPackFolderByPath(path) { static getPackFolderByPath(path) {
const names = path.split('/'); const names = path.split('/');
if (names[0] === '') { if (names[0] === '') {
names.shift(); names.shift();
} }
let name = names.shift(); let name = names.shift();
if (!this.actorFolderPack) { if (!ActorFolderEffect.actorFolderPack) {
return undefined; return undefined;
} }
let folder = this.actorFolderPack.folders let folder = ActorFolderEffect.actorFolderPack.folders
.filter((f) => f.type === 'Actor' && !f.folder) .filter((f) => f.type === 'Actor' && !f.folder)
.find((f) => f.name === name); .find((f) => f.name === name);
if (!folder) { if (!folder) {
@ -840,14 +838,14 @@ export class ActorFolderEffect extends PowerEffect {
return folder; return folder;
} }
getPackActorsInFolder(inFolder) { static getPackActorsInFolder(inFolder) {
const prefixStack = ['']; const prefixStack = [''];
const actors = {}; const actors = {};
const folderStack = [inFolder]; const folderStack = [inFolder];
while (folderStack.length > 0) { while (folderStack.length > 0) {
const prefix = prefixStack.shift(); const prefix = prefixStack.shift();
const folder = folderStack.shift(); const folder = folderStack.shift();
for (const actor of this.packActors.filter((pa) => pa.folder === folder.id)) { for (const actor of folder.contents) {
actors[`${prefix}${actor.name}`] = actor; actors[`${prefix}${actor.name}`] = actor;
} }
for (const child of folder.children) { for (const child of folder.children) {
@ -871,7 +869,7 @@ export class ActorFolderEffect extends PowerEffect {
`${this.actorFolder}/${this.source.actor.name}`, `${this.actorFolder}/${this.source.actor.name}`,
]; ];
for (const folderName of folderNames) { for (const folderName of folderNames) {
const folder = this.getPackFolderByPath(folderName); const folder = ActorFolderEffect.getPackFolderByPath(folderName);
if (folder) { if (folder) {
log(`Found actor folder ${folderName}`); log(`Found actor folder ${folderName}`);
folders.push(folder); folders.push(folder);
@ -887,7 +885,7 @@ export class ActorFolderEffect extends PowerEffect {
const folders = this.prepFolders(); const folders = this.prepFolders();
const actors = {}; const actors = {};
for (const folder of folders) { for (const folder of folders) {
const folderActors = this.getPackActorsInFolder(folder); const folderActors = ActorFolderEffect.getPackActorsInFolder(folder);
for (const key in folderActors) { for (const key in folderActors) {
actors[key] = folderActors[key]; actors[key] = folderActors[key];
} }

View File

@ -3,7 +3,7 @@ import { BaseSummonEffect } from './summonSupport.js';
class BaseAllyEffect extends BaseSummonEffect { class BaseAllyEffect extends BaseSummonEffect {
get actorFolder() { get actorFolder() {
return 'Creatures'; return `${this.actorFolderBase}/Creatures`;
} }
get basePowerPoints() { get basePowerPoints() {
@ -85,7 +85,7 @@ class BaseAllyEffect extends BaseSummonEffect {
const newActors = {}; const newActors = {};
for (const key of Object.keys(actors)) { for (const key of Object.keys(actors)) {
const actor = actors[key]; const actor = actors[key];
const summon = actor.getFlag(moduleName, 'summonData'); const summon = actor.flags?.['swade-mb-helpers']?.summonData;
if (summon?.powers?.[this.name]) { if (summon?.powers?.[this.name]) {
newActors[key] = actor; newActors[key] = actor;
} }
@ -94,7 +94,7 @@ class BaseAllyEffect extends BaseSummonEffect {
} }
actorValue(actor) { actorValue(actor) {
const summon = actor.getFlag(moduleName, 'summonData'); const summon = actor.flags?.['swade-mb-helpers']?.summonData;
return summon?.cost ?? 0; return summon?.cost ?? 0;
} }

View File

@ -1,5 +1,5 @@
/* globals Sequencer */ /* globals Sequencer */
import { log, moduleHelpers, moduleName } from '../globals.js'; import { log, moduleHelpers, moduleName, settingKeys } from '../globals.js';
import { templates } from '../preloadTemplates.js'; import { templates } from '../preloadTemplates.js';
import { ActorFolderEffect } from './basePowers.js'; import { ActorFolderEffect } from './basePowers.js';
@ -71,7 +71,7 @@ export class SummonCostApplication extends FormApplication {
static get defaultOptions() { static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: ['sheet', 'mbSwadeForm', 'mbSwadeSummonCostForm'], classes: ['sheet', 'mbSwade', 'mbSwadeForm', 'mbSwadeSummonCostForm'],
popOut: true, popOut: true,
template: templates['summonCosts.html'], template: templates['summonCosts.html'],
id: ['mbSwadeSummonCostFormApplication'], id: ['mbSwadeSummonCostFormApplication'],
@ -148,14 +148,20 @@ export class SummonCostApplication extends FormApplication {
} }
} }
export function setSummonCosts(powers = [], folderName = null) { export async function setSummonCosts(powers = [], folderName = null) {
if (!folderName) { if (!folderName) {
folderName = 'Summonables/Creatures'; folderName = 'Summonables/Creatures';
} }
const folder = moduleHelpers.getActorFolderByPath(folderName); const folder = ActorFolderEffect.getPackFolderByPath(folderName);
if (!folder) { if (!folder) {
log(`ERROR: Could not find folder ${folderName}`); log(`ERROR: Could not find folder ${folderName}`);
} }
const actors = moduleHelpers.getActorsInFolder(folder); const indexActors = ActorFolderEffect.getPackActorsInFolder(folder);
const actors = {};
const promises = [];
for (const actorName in indexActors) {
promises.push(foundry.utils.fromUuid(indexActors[actorName].uuid).then((result) => (actors[actorName] = result)));
}
await Promise.all(promises);
new SummonCostApplication(actors, powers).render(true); new SummonCostApplication(actors, powers).render(true);
} }