diff --git a/src/module/api.js b/src/module/api.js index f185e74..9f5244d 100644 --- a/src/module/api.js +++ b/src/module/api.js @@ -1,6 +1,7 @@ import { log, moduleHelpers } from './globals.js'; import { requestFearRollFromTokens, requestRollFromTokens } from './helpers.js'; import { powers } from './powers/powers.js'; +import { setSummonCosts } from './powers/summonSupport.js'; export class api { static registerFunctions() { @@ -11,11 +12,12 @@ export class api { static globals() { const moduleName = 'swade-mb-helpers'; game.modules.get(moduleName).api = { - rulesVersion: moduleHelpers.rulesVersion, fearTable: moduleHelpers.fearTableHelper, powerEffects: powers, - requestRollFromTokens, requestFearRollFromTokens, + requestRollFromTokens, + rulesVersion: moduleHelpers.rulesVersion, + setSummonCosts, }; } } diff --git a/src/module/powers/summon.js b/src/module/powers/summon.js index a665e3c..b9bb3ad 100644 --- a/src/module/powers/summon.js +++ b/src/module/powers/summon.js @@ -1,8 +1,8 @@ import { BaseSummonEffect } from './summonSupport.js'; class BaseAllyEffect extends BaseSummonEffect { - get values() { - return {}; + get actorFolder() { + return `${this.actorFolderBase}/Creatures`; } get basePowerPoints() { @@ -229,13 +229,17 @@ export class SummonAllyEffect extends BaseAllyEffect { return 'icons/magic/control/silhouette-hold-beam-blue.webp'; } - get values() { - return { + actorValue(actor) { + const values = { attendant: 1, bodyguard: 3, sentinel: 5, 'mirror self': 7, }; + if (actor.name.toLowerCase() in values) { + return values[actor.name.toLowerCase()]; + } + return 0; } get _edges() { diff --git a/src/module/powers/summonSupport.js b/src/module/powers/summonSupport.js index bba16e3..a254095 100644 --- a/src/module/powers/summonSupport.js +++ b/src/module/powers/summonSupport.js @@ -1,5 +1,6 @@ /* globals Portal */ -import { moduleName } from '../globals.js'; +import { log, moduleHelpers, moduleName } from '../globals.js'; +import { templates } from '../preloadTemplates.js'; import { ActorFolderEffect } from './basePowers.js'; export class BaseSummonEffect extends ActorFolderEffect { @@ -11,10 +12,6 @@ export class BaseSummonEffect extends ActorFolderEffect { return 'Summonables'; } - get actorFolder() { - return `${this.actorFolderBase}/Creatures`; - } - get summonCount() { return 0; } @@ -49,3 +46,101 @@ export class BaseSummonEffect extends ActorFolderEffect { } } } + +export class SummonCostApplication extends FormApplication { + constructor(actors, powers) { + super(); + this.actors = actors; + this.powers = powers; + } + + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ['sheet', 'mbSwadeForm', 'mbSwadeSummonCostForm'], + popOut: true, + template: templates['summonCosts.html'], + id: ['mbSwadeSummonCostFormApplication'], + title: 'Summoning Costs', + width: 750, + }); + } + + getData() { + const actorNames = Object.keys(this.actors).map((k) => { + let splitName = k.split(' | '); + splitName.pop(); + let folder = splitName.length ? splitName.join(' | ') : ''; + return { name: this.actors[k].name, folder, fullName: k }; + }); + actorNames.sort((a, b) => { + if (a.name < b.name) { + return -1; + } else if (a.name > b.name) { + return 1; + } + return 0; + }); + const data = { + powers: this.powers, + actors: [], + }; + for (const actor of actorNames) { + const summon = this.actors[actor.fullName].getFlag(moduleName, 'summonData') ?? { + cost: 0, + powers: {}, + }; + const hbSummon = { + cost: summon.cost, + powers: [], + }; + for (const power of this.powers) { + hbSummon.powers.push({ power, value: summon.powers?.[power] ?? false }); + } + data.actors.push({ actor, summon: hbSummon }); + } + log('summon data'); + log(data); + return data; + } + + async _updateObject(ev, formData) { + const submit = ev?.submitter?.value ?? 'cancel'; + if (submit === 'cancel') { + return; + } + log('FORMDATA |', formData); + const updates = {}; + for (const key of Object.keys(formData)) { + const value = formData[key]; + const [name, subKey] = key.split(':;:'); + if (!(name in updates)) { + updates[name] = { powers: {} }; + } + if (subKey === 'cost') { + updates[name].cost = value; + } else { + updates[name].powers[subKey] = value; + } + } + log('FORMUPDATES |', updates); + for (const key of Object.keys(updates)) { + const update = updates[key]; + const flagValue = this.actors[key].getFlag(moduleName, 'summonData') ?? {}; + mergeObject(flagValue, update); + const result = this.actors[key].setFlag(moduleName, 'summonData', flagValue); + console.log('update', key, result); + } + } +} + +export function setSummonCosts(powers = [], folderName = null) { + if (!folderName) { + folderName = 'Summonables/Creatures'; + } + const folder = moduleHelpers.getActorFolderByPath(folderName); + if (!folder) { + log(`ERROR: Could not find folder ${folderName}`); + } + const actors = moduleHelpers.getActorsInFolder(folder); + new SummonCostApplication(actors, powers).render(true); +} diff --git a/src/module/preloadTemplates.js b/src/module/preloadTemplates.js index dcb5296..928de81 100644 --- a/src/module/preloadTemplates.js +++ b/src/module/preloadTemplates.js @@ -1,4 +1,4 @@ -const _templatePaths = ['powerDialog.html']; +const _templatePaths = ['powerDialog.html', 'summonCosts.html']; export async function preloadTemplates() { return loadTemplates(_templatePaths.map((f) => `modules/swade-mb-helpers/templates/${f}`)); diff --git a/src/styles/swade-mb-helpers.scss b/src/styles/swade-mb-helpers.scss index 1f95bd3..650bf57 100644 --- a/src/styles/swade-mb-helpers.scss +++ b/src/styles/swade-mb-helpers.scss @@ -3,3 +3,10 @@ font-size: var(--font-size-14); } } + +table.mbForm { + th { + padding-left: 0.25em; + padding-right: 0.25em; + } +} diff --git a/src/templates/powerDialog.html b/src/templates/powerDialog.html index aea6d96..c27bf47 100644 --- a/src/templates/powerDialog.html +++ b/src/templates/powerDialog.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/templates/summonCosts.html b/src/templates/summonCosts.html new file mode 100644 index 0000000..1bbcc71 --- /dev/null +++ b/src/templates/summonCosts.html @@ -0,0 +1,44 @@ + + +
+

Set Summon Parameters

+
+ + + + + + + + + + {{#each powers}} + + {{/each}} + + + + {{#each actors}} + + + + + {{#each summon.powers}} + + {{/each}} + + {{/each}} + +
FolderActorCostAvailable Powers
{{this}}?
{{actor.folder}}{{actor.name}}
+ +