162 lines
4.8 KiB
JavaScript
162 lines
4.8 KiB
JavaScript
import { SYSTEM } from "../../config/system.mjs"
|
|
import { buildSharedSelectOptions } from "./select-options.mjs"
|
|
import { enrichHTMLFields } from "./rich-text.mjs"
|
|
|
|
const { HandlebarsApplicationMixin } = foundry.applications.api
|
|
|
|
export default class MGNEActorSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) {
|
|
static DEFAULT_OPTIONS = {
|
|
classes: ["mgne", "actor-sheet"],
|
|
position: {
|
|
width: 900,
|
|
height: "auto",
|
|
},
|
|
window: {
|
|
resizable: true,
|
|
},
|
|
form: {
|
|
submitOnChange: true,
|
|
},
|
|
actions: {
|
|
editImage: MGNEActorSheet.onEditImage,
|
|
changeTab: MGNEActorSheet.onChangeTab,
|
|
createItem: MGNEActorSheet.onCreateItem,
|
|
editItem: MGNEActorSheet.onEditItem,
|
|
deleteItem: MGNEActorSheet.onDeleteItem,
|
|
toggleEquipped: MGNEActorSheet.onToggleEquipped,
|
|
syncArtifact: MGNEActorSheet.onSyncArtifact,
|
|
resetDaily: MGNEActorSheet.onResetDaily,
|
|
rollResonancePerDay: MGNEActorSheet.onRollResonancePerDay,
|
|
clearResonationBlock: MGNEActorSheet.onClearResonationBlock,
|
|
quickRest: MGNEActorSheet.onQuickRest,
|
|
fullRest: MGNEActorSheet.onFullRest,
|
|
},
|
|
}
|
|
|
|
async _prepareContext() {
|
|
const systemFields = this.document.system.schema.fields
|
|
|
|
return {
|
|
fields: this.document.schema.fields,
|
|
systemFields,
|
|
actor: this.document,
|
|
system: this.document.system,
|
|
source: this.document.toObject(),
|
|
config: SYSTEM,
|
|
enrichedFields: await enrichHTMLFields(this.document.system, systemFields),
|
|
isEditable: this.isEditable,
|
|
selectOptions: buildSharedSelectOptions(),
|
|
}
|
|
}
|
|
|
|
_onRender(context, options) {
|
|
super._onRender?.(context, options)
|
|
this.element.querySelectorAll(".rollable").forEach(element => {
|
|
element.addEventListener("click", this._onRoll.bind(this))
|
|
})
|
|
}
|
|
|
|
async _onRoll(event) {
|
|
const target = event.currentTarget
|
|
const itemId = target.closest("[data-item-id]")?.dataset.itemId
|
|
const rollType = target.dataset.rollType
|
|
|
|
switch (rollType) {
|
|
case "ability":
|
|
return this.document.rollAbility(target.dataset.abilityId)
|
|
case "defense":
|
|
return this.document.rollDefense()
|
|
case "weapon":
|
|
return this.document.rollWeapon(itemId)
|
|
case "profile-attack":
|
|
return this.document.rollProfileAttack()
|
|
case "profile-damage":
|
|
return this.document.rollProfileDamage()
|
|
case "damage":
|
|
return this.document.rollDamage(itemId)
|
|
case "resonation":
|
|
return this.document.rollResonation(itemId)
|
|
case "morale":
|
|
return this.document.rollMorale()
|
|
case "usage":
|
|
return this.document.rollUsage(itemId)
|
|
default:
|
|
return null
|
|
}
|
|
}
|
|
|
|
static async onEditImage(_event, target) {
|
|
const attr = target.dataset.edit
|
|
const current = foundry.utils.getProperty(this.document, attr)
|
|
const picker = new FilePicker({
|
|
current,
|
|
type: "image",
|
|
callback: path => this.document.update({ [attr]: path }),
|
|
top: this.position.top + 40,
|
|
left: this.position.left + 10,
|
|
})
|
|
return picker.browse()
|
|
}
|
|
|
|
static onChangeTab(_event, target) {
|
|
const group = target.dataset.group
|
|
const tab = target.dataset.tab
|
|
this.tabGroups[group] = tab
|
|
this.render()
|
|
}
|
|
|
|
static async onCreateItem(_event, target) {
|
|
const itemType = target.dataset.itemType
|
|
const typeLabel = SYSTEM.itemTypes[itemType]?.label ?? itemType
|
|
const [created] = await this.document.createEmbeddedDocuments("Item", [{
|
|
name: game.i18n.format("MGNE.Common.NewItem", { type: typeLabel }),
|
|
type: itemType,
|
|
img: SYSTEM.itemTypes[itemType]?.icon,
|
|
}])
|
|
created?.sheet?.render(true)
|
|
}
|
|
|
|
static async onEditItem(_event, target) {
|
|
const itemId = target.closest("[data-item-id]")?.dataset.itemId
|
|
const item = this.document.items.get(itemId)
|
|
return item?.sheet?.render(true)
|
|
}
|
|
|
|
static async onDeleteItem(_event, target) {
|
|
const itemId = target.closest("[data-item-id]")?.dataset.itemId
|
|
const item = this.document.items.get(itemId)
|
|
if (!item) return null
|
|
return item.delete()
|
|
}
|
|
|
|
static async onToggleEquipped(_event, target) {
|
|
const itemId = target.closest("[data-item-id]")?.dataset.itemId
|
|
return this.document.toggleItemEquipped(itemId)
|
|
}
|
|
|
|
static async onSyncArtifact(_event, target) {
|
|
const itemId = target.closest("[data-item-id]")?.dataset.itemId
|
|
return this.document.syncArtifact(itemId)
|
|
}
|
|
|
|
static async onResetDaily() {
|
|
return this.document.resetDaily()
|
|
}
|
|
|
|
static async onRollResonancePerDay() {
|
|
return this.document.rollResonancePerDay()
|
|
}
|
|
|
|
static async onClearResonationBlock() {
|
|
return this.document.update({ "system.resonance.blocked": false })
|
|
}
|
|
|
|
static async onQuickRest() {
|
|
return this.document.quickRest()
|
|
}
|
|
|
|
static async onFullRest() {
|
|
return this.document.fullRest()
|
|
}
|
|
}
|