import { AcksActor } from "./entity.js";
import { AcksActorSheet } from "./actor-sheet.js";
import { AcksCharacterModifiers } from "../dialog/character-modifiers.js";
import { AcksCharacterCreator } from "../dialog/character-creation.js";
/**
* Extend the basic ActorSheet with some very simple modifications
*/
export class AcksActorSheetCharacter extends AcksActorSheet {
constructor(...args) {
super(...args);
}
/* -------------------------------------------- */
/**
* Extend and override the default options used by the 5e Actor Sheet
* @returns {Object}
*/
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
classes: ["acks", "sheet", "actor", "character"],
template: "systems/acks/templates/actors/character-sheet.html",
width: 450,
height: 530,
resizable: true,
tabs: [
{
navSelector: ".sheet-tabs",
contentSelector: ".sheet-body",
initial: "attributes",
},
],
});
}
generateScores() {
new AcksCharacterCreator(this.actor, {
top: this.position.top + 40,
left: this.position.left + (this.position.width - 400) / 2,
}).render(true);
}
/**
* Prepare data for rendering the Actor sheet
* The prepared data object contains both the actor data as well as additional sheet options
*/
getData() {
const data = super.getData();
data.config.ascendingAC = game.settings.get("acks", "ascendingAC");
data.config.initiative = game.settings.get("acks", "initiative") != "group";
data.config.encumbrance = game.settings.get("acks", "encumbranceOption");
data.config.BHR = game.settings.get("acks", "bhr");
data.isNew = this.actor.isNew();
return data;
}
async _chooseLang() {
let choices = CONFIG.ACKS.languages;
let templateData = { choices: choices },
dlg = await renderTemplate(
"/systems/acks/templates/actors/dialogs/lang-create.html",
templateData
);
//Create Dialog window
return new Promise((resolve) => {
new Dialog({
title: "",
content: dlg,
buttons: {
ok: {
label: game.i18n.localize("ACKS.Ok"),
icon: '',
callback: (html) => {
resolve({
choice: html.find('select[name="choice"]').val(),
});
},
},
cancel: {
icon: '',
label: game.i18n.localize("ACKS.Cancel"),
},
},
default: "ok",
}).render(true);
});
}
_pushLang(table) {
const data = this.actor.data.data;
let update = duplicate(data[table]);
this._chooseLang().then((dialogInput) => {
const name = CONFIG.ACKS.languages[dialogInput.choice];
if (update.value) {
update.value.push(name);
} else {
update = { value: [name] };
}
let newData = {};
newData[table] = update;
return this.actor.update({ data: newData });
});
}
_popLang(table, lang) {
const data = this.actor.data.data;
let update = data[table].value.filter((el) => el != lang);
let newData = {};
newData[table] = { value: update };
return this.actor.update({ data: newData });
}
/* -------------------------------------------- */
async _onQtChange(event) {
event.preventDefault();
const itemId = event.currentTarget.closest(".item").dataset.itemId;
const item = this.actor.getOwnedItem(itemId);
return item.update({ "data.quantity.value": parseInt(event.target.value) });
}
_onShowModifiers(event) {
event.preventDefault();
new AcksCharacterModifiers(this.actor, {
top: this.position.top + 40,
left: this.position.left + (this.position.width - 400) / 2,
}).render(true);
}
/**
* Activate event listeners using the prepared sheet HTML
* @param html {HTML} The prepared HTML object ready to be rendered into the DOM
*/
activateListeners(html) {
super.activateListeners(html);
html.find(".ability-score .attribute-name a").click((ev) => {
let actorObject = this.actor;
let element = event.currentTarget;
let score = element.parentElement.parentElement.dataset.score;
let stat = element.parentElement.parentElement.dataset.stat;
if (!score) {
if (stat == "lr") {
actorObject.rollLoyalty(score, { event: event });
}
} else {
actorObject.rollCheck(score, { event: event });
}
});
html.find(".exploration .attribute-name a").click((ev) => {
let actorObject = this.actor;
let element = event.currentTarget;
let expl = element.parentElement.parentElement.dataset.exploration;
actorObject.rollExploration(expl, { event: event });
});
html.find(".inventory .item-titles .item-caret").click((ev) => {
let items = $(event.currentTarget.parentElement.parentElement).children(
".item-list"
);
if (items.css("display") == "none") {
let el = $(event.currentTarget).find(".fas.fa-caret-right");
el.removeClass("fa-caret-right");
el.addClass("fa-caret-down");
items.slideDown(200);
} else {
let el = $(event.currentTarget).find(".fas.fa-caret-down");
el.removeClass("fa-caret-down");
el.addClass("fa-caret-right");
items.slideUp(200);
}
});
html.find("a[data-action='modifiers']").click((ev) => {
this._onShowModifiers(ev);
});
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return;
// Update Inventory Item
html.find(".item-edit").click((ev) => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.getOwnedItem(li.data("itemId"));
item.sheet.render(true);
});
// Delete Inventory Item
html.find(".item-delete").click((ev) => {
const li = $(ev.currentTarget).parents(".item");
this.actor.deleteOwnedItem(li.data("itemId"));
li.slideUp(200, () => this.render(false));
});
html.find(".item-push").click((ev) => {
event.preventDefault();
const header = event.currentTarget;
const table = header.dataset.array;
this._pushLang(table);
});
html.find(".item-pop").click((ev) => {
event.preventDefault();
const header = event.currentTarget;
const table = header.dataset.array;
this._popLang(
table,
$(event.currentTarget).closest(".item").data("lang")
);
});
html.find(".item-create").click((event) => {
event.preventDefault();
const header = event.currentTarget;
const type = header.dataset.type;
const itemData = {
name: `New ${type.capitalize()}`,
type: type,
data: duplicate(header.dataset),
};
delete itemData.data["type"];
return this.actor.createOwnedItem(itemData);
});
//Toggle Equipment
html.find(".item-toggle").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: {
equipped: !item.data.data.equipped,
},
});
});
html
.find(".quantity input")
.click((ev) => ev.target.select())
.change(this._onQtChange.bind(this));
html.find("a[data-action='generate-scores']").click((ev) => {
this.generateScores(ev);
});
}
}