mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-12 11:41:08 +01:00
* start development * finish party members tab * start resources tab * finish resources tab * finish inventory tab and add inital template to projects tab * add resource buttons actions methods * add group roll dialog * Main implementation * Fixed costs * Minor fixes and tweaks for the party sheet (#1239) * Minor fixes and tweaks for the party sheet * Fix scroll restoration for party sheet tabs * Finished GroupRoll * Removed/commented-out not yet implemented things * Commented out Difficulty since it's not used yet * Re-render party when members update (#1242) * Fixed so style applies in preview chat message * Added the clown car * Fixed so items can be dropped into the Party sheet * Added delete icon to inventory * Fixed TokenHUD token property useage. Fixed skipping roll message * Added visible modifier to GroupRoll leader result * Leader roll displays the large result display right away after rolling * Corrected tokenHUD for non-player-tokens * Fixed clowncar tokenData * Fixed TagTeam roll message and sound * Removed final TagTeamRoll roll sound * [PR] [Party Sheets] Sidebar character sheet changes (#1249) * Something experimenting * I am silly (wearning Dunce hat) * Stressful task * Armor functional to be hit * CSS Changes to accomadate pip boy * last minute change to resource section for better visual feeling * restoring old css for toggle * Added setting to toggle pip/number display * toggle functionality added * Fixed light-mode in characterSheet * Fixed multi-row resource pips display for character * Fixed separators * Added pip-display to Adversary and Companion. Some fixing on armor display --------- Co-authored-by: WBHarry <williambjrklund@gmail.com> * Fixed party height and resource armor update * Fixed deletebutton padding * Only showing expand-me icon on InventoryItem if there is a description to show * . * Fixed menu icon to be beige instead of white in dark mode --------- Co-authored-by: moliloo <dev.murilobrito@gmail.com> Co-authored-by: Carlos Fernandez <CarlosFdez@users.noreply.github.com> Co-authored-by: Nikhil Nagarajan <potter.nikhil@gmail.com>
160 lines
6.4 KiB
JavaScript
160 lines
6.4 KiB
JavaScript
const { HandlebarsApplicationMixin } = foundry.applications.api;
|
|
const { AbstractSidebarTab } = foundry.applications.sidebar;
|
|
/**
|
|
* The daggerheart menu tab.
|
|
* @extends {AbstractSidebarTab}
|
|
* @mixes HandlebarsApplication
|
|
*/
|
|
export default class DaggerheartMenu extends HandlebarsApplicationMixin(AbstractSidebarTab) {
|
|
constructor(options) {
|
|
super(options);
|
|
|
|
this.refreshSelections = DaggerheartMenu.defaultRefreshSelections();
|
|
}
|
|
|
|
static defaultRefreshSelections() {
|
|
return {
|
|
session: { selected: false, label: game.i18n.localize('DAGGERHEART.GENERAL.RefreshType.session') },
|
|
scene: { selected: false, label: game.i18n.localize('DAGGERHEART.GENERAL.RefreshType.scene') },
|
|
longRest: { selected: false, label: game.i18n.localize('DAGGERHEART.GENERAL.RefreshType.longrest') },
|
|
shortRest: { selected: false, label: game.i18n.localize('DAGGERHEART.GENERAL.RefreshType.shortrest') }
|
|
};
|
|
}
|
|
|
|
/** @override */
|
|
static DEFAULT_OPTIONS = {
|
|
classes: ['dh-style'],
|
|
window: {
|
|
title: 'SIDEBAR.TabSettings'
|
|
},
|
|
actions: {
|
|
selectRefreshable: DaggerheartMenu.#selectRefreshable,
|
|
refreshActors: DaggerheartMenu.#refreshActors
|
|
}
|
|
};
|
|
|
|
/** @override */
|
|
static tabName = 'daggerheartMenu';
|
|
|
|
/** @override */
|
|
static PARTS = {
|
|
main: { template: 'systems/daggerheart/templates/sidebar/daggerheart-menu/main.hbs' }
|
|
};
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/** @inheritDoc */
|
|
async _prepareContext(options) {
|
|
const context = await super._prepareContext(options);
|
|
context.refreshables = this.refreshSelections;
|
|
context.disableRefresh = Object.values(this.refreshSelections).every(x => !x.selected);
|
|
|
|
return context;
|
|
}
|
|
|
|
async getRefreshables(types) {
|
|
const refreshedActors = {};
|
|
for (let actor of game.actors) {
|
|
if (['character', 'adversary'].includes(actor.type) && actor.prototypeToken.actorLink) {
|
|
const updates = {};
|
|
for (let item of actor.items) {
|
|
if (item.system.metadata.hasResource && types.includes(item.system.resource?.recovery)) {
|
|
if (!refreshedActors[actor.id])
|
|
refreshedActors[actor.id] = { name: actor.name, img: actor.img, refreshed: new Set() };
|
|
refreshedActors[actor.id].refreshed.add(
|
|
game.i18n.localize(CONFIG.DH.GENERAL.refreshTypes[item.system.resource.recovery].label)
|
|
);
|
|
|
|
if (!updates[item.id]?.system) updates[item.id] = { system: {} };
|
|
|
|
const increasing =
|
|
item.system.resource.progression === CONFIG.DH.ITEM.itemResourceProgression.increasing.id;
|
|
updates[item.id].system = {
|
|
...updates[item.id].system,
|
|
'resource.value': increasing
|
|
? 0
|
|
: Roll.replaceFormulaData(item.system.resource.max, actor.getRollData())
|
|
};
|
|
}
|
|
if (item.system.metadata.hasActions) {
|
|
const refreshTypes = new Set();
|
|
const actions = item.system.actions.filter(action => {
|
|
if (types.includes(action.uses.recovery)) {
|
|
refreshTypes.add(action.uses.recovery);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
});
|
|
if (actions.length === 0) continue;
|
|
|
|
if (!refreshedActors[actor.id])
|
|
refreshedActors[actor.id] = { name: actor.name, img: actor.img, refreshed: new Set() };
|
|
refreshedActors[actor.id].refreshed.add(
|
|
...refreshTypes.map(type => game.i18n.localize(CONFIG.DH.GENERAL.refreshTypes[type].label))
|
|
);
|
|
|
|
if (!updates[item.id]?.system) updates[item.id] = { system: {} };
|
|
|
|
updates[item.id].system = {
|
|
...updates[item.id].system,
|
|
...actions.reduce(
|
|
(acc, action) => {
|
|
acc.actions[action.id] = { 'uses.value': 0 };
|
|
return acc;
|
|
},
|
|
{ actions: updates[item.id].system.actions ?? {} }
|
|
)
|
|
};
|
|
}
|
|
}
|
|
|
|
for (let key in updates) {
|
|
const update = updates[key];
|
|
await actor.items.get(key).update(update);
|
|
}
|
|
}
|
|
}
|
|
|
|
return refreshedActors;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/* Application Clicks Actions */
|
|
/* -------------------------------------------- */
|
|
|
|
static async #selectRefreshable(_event, button) {
|
|
const { type } = button.dataset;
|
|
this.refreshSelections[type].selected = !this.refreshSelections[type].selected;
|
|
this.render();
|
|
}
|
|
|
|
static async #refreshActors() {
|
|
const refreshKeys = Object.keys(this.refreshSelections).filter(key => this.refreshSelections[key].selected);
|
|
await this.getRefreshables(refreshKeys);
|
|
const types = refreshKeys.map(x => this.refreshSelections[x].label).join(', ');
|
|
ui.notifications.info(
|
|
game.i18n.format('DAGGERHEART.UI.Notifications.gmMenuRefresh', {
|
|
types: `[${types}]`
|
|
})
|
|
);
|
|
this.refreshSelections = DaggerheartMenu.defaultRefreshSelections();
|
|
|
|
const cls = getDocumentClass('ChatMessage');
|
|
const msg = {
|
|
user: game.user.id,
|
|
content: await foundry.applications.handlebars.renderTemplate(
|
|
'systems/daggerheart/templates/ui/chat/refreshMessage.hbs',
|
|
{
|
|
types: types
|
|
}
|
|
),
|
|
title: game.i18n.localize('DAGGERHEART.UI.Chat.refreshMessage.title'),
|
|
speaker: cls.getSpeaker()
|
|
};
|
|
|
|
cls.create(msg);
|
|
|
|
this.render();
|
|
}
|
|
}
|