253 lines
7.4 KiB
JavaScript
253 lines
7.4 KiB
JavaScript
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: '<i class="fas fa-check"></i>',
|
|
callback: (html) => {
|
|
resolve({
|
|
choice: html.find('select[name="choice"]').val(),
|
|
});
|
|
},
|
|
},
|
|
cancel: {
|
|
icon: '<i class="fas fa-times"></i>',
|
|
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);
|
|
});
|
|
}
|
|
}
|