From 04dee8455228e547c27273c5263e36061014615d Mon Sep 17 00:00:00 2001 From: freohr Date: Sun, 13 Mar 2022 12:35:18 +0100 Subject: [PATCH 1/3] Add a centralized getter for the current party --- src/module/dialog/party-sheet.js | 9 ++------- src/module/dialog/party-xp.js | 32 +++++++++++--------------------- src/module/dialog/party.js | 11 +++++++++++ 3 files changed, 24 insertions(+), 28 deletions(-) create mode 100644 src/module/dialog/party.js diff --git a/src/module/dialog/party-sheet.js b/src/module/dialog/party-sheet.js index cb7b763c..8b7b8679 100644 --- a/src/module/dialog/party-sheet.js +++ b/src/module/dialog/party-sheet.js @@ -1,4 +1,5 @@ import { OsePartyXP } from "./party-xp.js"; +import { OseParty } from "./party.js"; export class OsePartySheet extends FormApplication { static get defaultOptions() { @@ -30,18 +31,12 @@ export class OsePartySheet extends FormApplication { * @return {Object} */ getData() { - const actors = this.object.documents.filter( - (e) => - e.data.type === "character" && - e.data.flags.ose && - e.data.flags.ose.party === true - ); const settings = { ascending: game.settings.get("ose", "ascendingAC"), }; let data = { - partyActors: actors, + partyActors: OseParty.currentParty, data: this.object, config: CONFIG.OSE, user: game.user, diff --git a/src/module/dialog/party-xp.js b/src/module/dialog/party-xp.js index 0064f430..4cdfa47e 100644 --- a/src/module/dialog/party-xp.js +++ b/src/module/dialog/party-xp.js @@ -1,3 +1,5 @@ +import { OseParty } from "./party.js"; + export class OsePartyXP extends FormApplication { static get defaultOptions() { return foundry.utils.mergeObject(super.defaultOptions, { @@ -27,14 +29,8 @@ export class OsePartyXP extends FormApplication { * @return {Object} */ getData() { - const actors = this.object.documents.filter( - (e) => - e.data.type === "character" && - e.data.flags.ose && - e.data.flags.ose.party === true - ); let data = { - actors: actors, + actors: OseParty.currentParty, data: this.object, config: CONFIG.OSE, user: game.user, @@ -61,21 +57,15 @@ export class OsePartyXP extends FormApplication { } _calculateShare(ev) { - const actors = this.object.documents.filter( - (e) => - e.data.type === "character" && - e.data.flags.ose && - e.data.flags.ose.party === true - ); - const toDeal = $(ev.currentTarget.parentElement) - .find('input[name="total"]') - .val(); + const currentParty = OseParty.currentParty; + const html = $(this.form); - const value = parseFloat(toDeal) / actors.length; - actors.forEach((a) => { - html - .find(`li[data-actor-id='${a.id}'] input`) - .val(Math.floor((a.data.data.details.xp.share / 100) * value)); + const totalXP = html.find('input[name="total"]').val(); + const baseXpShare = parseFloat(totalXP) / currentParty.length; + + currentParty.forEach((a) => { + const xpShare = Math.floor((a.data.data.details.xp.share / 100) * baseXpShare) + html.find(`li[data-actor-id='${a.id}'] input`).val(xpShare); }); } diff --git a/src/module/dialog/party.js b/src/module/dialog/party.js new file mode 100644 index 00000000..d3e1c942 --- /dev/null +++ b/src/module/dialog/party.js @@ -0,0 +1,11 @@ +export class OseParty { + static get currentParty() { + const characters = game.actors.filter( + (act) => + act.data.type === "character" && + act.data.flags.ose && + act.data.flags.ose.party === true); + + return characters; + } +} \ No newline at end of file From c36511f3266561155f5426d0d772f8f3a849df76 Mon Sep 17 00:00:00 2001 From: freohr Date: Sun, 13 Mar 2022 12:39:04 +0100 Subject: [PATCH 2/3] Replace PartySheet form instantiation with a singleton handler and a callable hook to render it --- src/module/party.js | 23 ++++++--------------- src/module/{dialog => party}/party-sheet.js | 19 ++++++++++++++++- src/module/{dialog => party}/party-xp.js | 0 src/module/{dialog => party}/party.js | 0 src/ose.js | 6 ++++++ src/templates/apps/party-xp.html | 2 +- 6 files changed, 31 insertions(+), 19 deletions(-) rename src/module/{dialog => party}/party-sheet.js (92%) rename src/module/{dialog => party}/party-xp.js (100%) rename src/module/{dialog => party}/party.js (100%) diff --git a/src/module/party.js b/src/module/party.js index 25988a21..cff02745 100644 --- a/src/module/party.js +++ b/src/module/party.js @@ -1,19 +1,12 @@ -import { OsePartySheet } from "./dialog/party-sheet.js"; +import { OsePartySheet } from "./party/party-sheet.js"; export const addControl = (object, html) => { let control = ``; - html.find(".fas.fa-search").replaceWith($(control)) + html.find(".fas.fa-search").replaceWith($(control)); html.find('.ose-party-sheet').click(ev => { - showPartySheet(ev, object); - }) -} - -export const showPartySheet = (event, object) => { - event.preventDefault(); - new OsePartySheet(object, { - top: window.screen.height / 2 - 180, - left: window.screen.width / 2 - 140, - }).render(true); + ev.preventDefault(); + Hooks.call("OSE.Party.showSheet"); + }); } export const update = (actor, data) => { @@ -23,9 +16,5 @@ export const update = (actor, data) => { return; } - const partySheetUI = Object.values(ui.windows).find(win => { return win instanceof OsePartySheet }); - - if (partySheetUI) { - partySheetUI.render(); - } + OsePartySheet.partySheet.render(); } \ No newline at end of file diff --git a/src/module/dialog/party-sheet.js b/src/module/party/party-sheet.js similarity index 92% rename from src/module/dialog/party-sheet.js rename to src/module/party/party-sheet.js index 8b7b8679..b0b84930 100644 --- a/src/module/dialog/party-sheet.js +++ b/src/module/party/party-sheet.js @@ -1,7 +1,12 @@ import { OsePartyXP } from "./party-xp.js"; import { OseParty } from "./party.js"; +const Party = { + partySheet: void 0 +}; + export class OsePartySheet extends FormApplication { + static get defaultOptions() { return foundry.utils.mergeObject(super.defaultOptions, { classes: ["ose", "dialog", "party-sheet"], @@ -14,6 +19,18 @@ export class OsePartySheet extends FormApplication { }); } + static init() { + Party.partySheet = new OsePartySheet(); + } + + static showPartySheet(options = {}) { + OsePartySheet.partySheet.render(true, { focus: true, ...options }); + } + + static get partySheet() { + return Party.partySheet; + } + /* -------------------------------------------- */ /** @@ -37,7 +54,7 @@ export class OsePartySheet extends FormApplication { let data = { partyActors: OseParty.currentParty, - data: this.object, + // data: this.object, config: CONFIG.OSE, user: game.user, settings: settings, diff --git a/src/module/dialog/party-xp.js b/src/module/party/party-xp.js similarity index 100% rename from src/module/dialog/party-xp.js rename to src/module/party/party-xp.js diff --git a/src/module/dialog/party.js b/src/module/party/party.js similarity index 100% rename from src/module/dialog/party.js rename to src/module/party/party.js diff --git a/src/ose.js b/src/ose.js index 59294f8d..a6ec08cc 100644 --- a/src/ose.js +++ b/src/ose.js @@ -15,6 +15,7 @@ import * as macros from "./module/macros.js"; import * as party from "./module/party.js"; import { OseCombat } from "./module/combat.js"; import * as renderList from "./module/renderList.js"; +import { OsePartySheet } from "./module/party/party-sheet.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -37,6 +38,9 @@ Hooks.once("init", async function () { oseCombat: OseCombat, }; + // Init Party Sheet handler + OsePartySheet.init(); + // Custom Handlebars helpers registerHelpers(); @@ -162,3 +166,5 @@ Hooks.on("updateActor", party.update); Hooks.on("renderCompendium", renderList.RenderCompendium); Hooks.on("renderSidebarDirectory", renderList.RenderDirectory); + +Hooks.on("OSE.Party.showSheet", OsePartySheet.showPartySheet); diff --git a/src/templates/apps/party-xp.html b/src/templates/apps/party-xp.html index 4e34fbc9..16f0dded 100644 --- a/src/templates/apps/party-xp.html +++ b/src/templates/apps/party-xp.html @@ -1,7 +1,7 @@
- +

    From b98aa78f938bda3a8b3a59e83bb32baad8e31aed Mon Sep 17 00:00:00 2001 From: freohr Date: Thu, 17 Mar 2022 17:26:53 +0100 Subject: [PATCH 3/3] Fix remaining references to internal party list of the partySheet object --- src/module/party/party-sheet.js | 2 +- src/module/party/party-xp.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/module/party/party-sheet.js b/src/module/party/party-sheet.js index b0b84930..090f6da1 100644 --- a/src/module/party/party-sheet.js +++ b/src/module/party/party-sheet.js @@ -103,7 +103,7 @@ export class OsePartySheet extends FormApplication { return; } - const actors = this.object.documents; + const actors = game.actors; let droppedActor = actors.find(actor => actor.id === data.id); this._addActorToParty(droppedActor); diff --git a/src/module/party/party-xp.js b/src/module/party/party-xp.js index 4cdfa47e..5f21cb46 100644 --- a/src/module/party/party-xp.js +++ b/src/module/party/party-xp.js @@ -76,7 +76,7 @@ export class OsePartyXP extends FormApplication { const qRow = $(row); const value = qRow.find("input").val(); const id = qRow.data("actorId"); - const actor = this.object.documents.find((e) => e.id === id); + const actor = OseParty.currentParty.find((e) => e.id === id); if (value) { actor.getExperience(Math.floor(parseInt(value))); }