foundryacks/src/module/actor/actor-sheet.js

155 lines
4.3 KiB
JavaScript

import { OseActor } from "./entity.js";
import { OseEntityTweaks } from "../dialog/entity-tweaks.js";
export class OseActorSheet extends ActorSheet {
constructor(...args) {
super(...args);
}
/* -------------------------------------------- */
getData() {
const data = super.getData();
data.config = CONFIG.OSE;
// Settings
data.config.ascendingAC = game.settings.get("ose", "ascendingAC");
// Prepare owned items
this._prepareItems(data);
return data;
}
/**
* Organize and classify Owned Items for Character sheets
* @private
*/
_prepareItems(data) {
// Partition items by category
let [inventory, weapons, armors, abilities, spells] = data.items.reduce(
(arr, item) => {
// Classify items into types
if (item.type === "item") arr[0].push(item);
else if (item.type === "weapon") arr[1].push(item);
else if (item.type === "armor") arr[2].push(item);
else if (item.type === "ability") arr[3].push(item);
else if (item.type === "spell") arr[4].push(item);
return arr;
},
[[], [], [], [], []]
);
// Sort spells by level
var sortedSpells = {};
for (var i = 0; i < spells.length; i++) {
let lvl = spells[i].data.lvl
if (!sortedSpells[lvl]) sortedSpells[lvl] = [];
sortedSpells[lvl].push(spells[i]);
}
// Assign and return
data.inventory = inventory;
data.weapons = weapons;
data.armors = armors;
data.spells = sortedSpells;
data.abilities = abilities;
}
activateListeners(html) {
html.find(".saving-throw .attribute-name a").click((ev) => {
let actorObject = this.actor;
let element = event.currentTarget;
let save = element.parentElement.parentElement.dataset.save;
actorObject.rollSave(save, { event: event });
});
//Toggle Spells
html.find(".item-cast").click(async (ev) => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.getOwnedItem(li.data("itemId"));
await this.actor.updateOwnedItem({
_id: li.data("itemId"),
data: {
cast: !item.data.data.cast,
},
});
});
//Toggle Equipment
html.find(".item-memorize").click(async (ev) => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.getOwnedItem(li.data("itemId"));
await this.actor.updateOwnedItem({
_id: li.data("itemId"),
data: {
memorized: !item.data.data.memorized,
},
});
});
html.find(".item-image").click(async (ev) => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.getOwnedItem(li.data("itemId"));
item.roll();
});
super.activateListeners(html);
}
// Override to set resizable initial size
async _renderInner(...args) {
const html = await super._renderInner(...args);
this.form = html[0];
// Resize resizable classes
let resizable = html.find(".resizable");
if (resizable.length == 0) {
return;
}
resizable.each((_, el) => {
let heightDelta = this.position.height - this.options.height;
el.style.height = `${heightDelta + parseInt(el.dataset.baseSize)}px`;
});
return html;
}
async _onResize(event) {
super._onResize(event);
let html = $(event.path);
let resizable = html.find(".resizable");
resizable.each((_, el) => {
let heightDelta = this.position.height - this.options.height;
el.style.height = `${heightDelta + parseInt(el.dataset.baseSize)}px`;
});
}
_onConfigureActor(event) {
event.preventDefault();
new OseEntityTweaks(this.actor, {
top: this.position.top + 40,
left: this.position.left + (this.position.width - 400) / 2,
}).render(true);
}
/**
* Extend and override the sheet header buttons
* @override
*/
_getHeaderButtons() {
let buttons = super._getHeaderButtons();
// Token Configuration
const canConfigure = game.user.isGM || this.actor.owner;
if (this.options.editable && canConfigure) {
buttons = [
{
label: "Tweaks",
class: "configure-actor",
icon: "fas fa-dice",
onclick: (ev) => this._onConfigureActor(ev),
},
].concat(buttons);
}
return buttons;
}
}