foundry-dsa41-game/src/module/sheets/creatureSheet.mjs

132 lines
4.0 KiB
JavaScript

const {HandlebarsApplicationMixin} = foundry.applications.api
const {ActorSheetV2} = foundry.applications.sheets
export class CreatureSheet extends HandlebarsApplicationMixin(ActorSheetV2) {
/** @inheritDoc */
static DEFAULT_OPTIONS = {
position: {width: 520, height: 480},
classes: ['dsa41', 'sheet', 'actor', 'creature'],
tag: 'form',
form: {
submitOnChange: true,
closeOnSubmit: false,
handler: CreatureSheet.#onSubmitForm
},
actions: {
removeAttack: CreatureSheet.#removeAttack,
addAttack: CreatureSheet.#addAttack,
roll: CreatureSheet.#dieRoll,
editImage: ActorSheetV2.DEFAULT_OPTIONS.actions.editImage,
}
}
static TABS = {
sheet: {
tabs: [
{id: 'meta', group: 'sheet', label: 'Meta'},
{id: 'attacks', group: 'sheet', label: 'Attacken'},
{id: 'description', group: 'sheet', label: 'Beschreibung'},
],
initial: 'meta'
}
}
/** @inheritDoc */
static PARTS = {
form: {
template: `systems/DSA_4-1/templates/actor/creature/main-sheet.hbs`
},
meta: {
template: `systems/DSA_4-1/templates/actor/creature/tab-meta.hbs`
},
attacks: {
template: `systems/DSA_4-1/templates/actor/creature/tab-attacks.hbs`
},
description: {
template: `systems/DSA_4-1/templates/actor/creature/tab-description.hbs`
}
}
/**
* Handle form submission
* @this {AdvantageSheet}
* @param {SubmitEvent} event
* @param {HTMLFormElement} form
* @param {FormDataExtended} formData
*/
static async #onSubmitForm(event, form, formData) {
event.preventDefault()
await this.document.update(formData.object) // Note: formData.object
}
static async #removeAttack(evt) {
const {index} = evt.srcElement.dataset;
let sans = Array.from(this.document.system.attacks);
sans.splice(index, 1);
await this.document.update({'system.attacks': sans})
}
static async #dieRoll(evt) {
const {rollType, rollName, roll} = evt.srcElement.dataset;
let r = new Roll(roll, this.document.getRollData());
const label = `${rollType} (${rollName})`
await r.toMessage({
speaker: ChatMessage.getSpeaker({actor: this.document}),
flavor: label,
rollMode: game.settings.get('core', 'rollMode'),
});
}
static async #addAttack() {
const name = this.element.querySelector('#attack_name').value
const at = this.element.querySelector('#attack_at').value
const pa = this.element.querySelector('#attack_pa').value
const tp = this.element.querySelector('#attack_tp').value
const newAttack = {
name,
at,
pa,
tp
}
await this.document.update({'system.attacks': [...this.document.system.attacks, newAttack]})
this.element.querySelector('#attack_name').value = ""
this.element.querySelector('#attack_at').value = ""
this.element.querySelector('#attack_pa').value = ""
this.element.querySelector('#attack_tp').value = ""
}
/** @override */
async _prepareContext(options) {
const context = await super._prepareContext(options);
const actorData = context.document;
context.attacks = [];
context.actor = actorData;
actorData.system.attacks.forEach((attack, index) => {
context.attacks.push({
namepath: `system.attacks.${index}.name`,
name: attack.name,
atpath: `system.attacks.${index}.at`,
at: attack.at,
papath: `system.attacks.${index}.pa`,
pa: attack.pa,
tppath: `system.attacks.${index}.tp`,
tp: attack.tp,
index: index,
})
})
return context;
}
}