189 lines
5.4 KiB
JavaScript
189 lines
5.4 KiB
JavaScript
import {ATTRIBUTE, ATTRIBUTE_DESCRIPTIONS} from "../data/attribute.mjs";
|
|
|
|
const {
|
|
ApplicationV2,
|
|
HandlebarsApplicationMixin
|
|
} = foundry.applications.api
|
|
|
|
export class AttributeDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
|
|
|
static DEFAULT_OPTIONS = {
|
|
classes: ['dsa41', 'dialog', 'eigenschaft'],
|
|
tag: "form",
|
|
position: {
|
|
width: 480,
|
|
height: 800
|
|
},
|
|
window: {
|
|
resizable: false,
|
|
title: "Eigenschaft nutzen"
|
|
},
|
|
form: {
|
|
submitOnChange: true,
|
|
closeOnSubmit: false,
|
|
handler: AttributeDialog.#onSubmitForm
|
|
},
|
|
actions: {
|
|
use: AttributeDialog.#use,
|
|
}
|
|
}
|
|
|
|
|
|
static PARTS = {
|
|
form: {
|
|
template: 'systems/DSA_4-1/templates/dialog/attribute-dialog.hbs',
|
|
}
|
|
}
|
|
|
|
static data = {}
|
|
|
|
/**
|
|
*
|
|
* @type {Actor}
|
|
* @private
|
|
*/
|
|
_actor = null
|
|
|
|
constructor(actor, attributeOrAdvantageId) {
|
|
super()
|
|
this._actor = actor
|
|
const advantage = this._actor.itemTypes["Advantage"].find(p => p._id === attributeOrAdvantageId)
|
|
if (advantage) {
|
|
const badAttribute = advantage
|
|
this._name = badAttribute.name
|
|
this._value = badAttribute.system.value
|
|
this._flaw = true
|
|
this._symbol = "flaw"
|
|
this._text = badAttribute.system.description
|
|
} else {
|
|
this._name = attributeOrAdvantageId.name
|
|
this._value = this._actor.system.attribute[attributeOrAdvantageId.symbol.toLowerCase()].aktuell
|
|
this._flaw = false
|
|
this._symbol = attributeOrAdvantageId.symbol
|
|
this._text = ATTRIBUTE_DESCRIPTIONS[attributeOrAdvantageId.symbol.toLowerCase()]
|
|
}
|
|
|
|
this._circumstance = 0
|
|
this._mods = []
|
|
}
|
|
|
|
static async #onSubmitForm(event, form, formData) {
|
|
event.preventDefault()
|
|
|
|
this._circumstance = formData.object["circumstance"]
|
|
this._mods = []
|
|
Object.entries(formData.object).filter(([key, value]) => key.startsWith("mods.")).forEach(([key, value]) => {
|
|
const [_, suffix] = key.split("mods.")
|
|
if (value != null) {
|
|
this._mods.push({
|
|
name: suffix,
|
|
value: value
|
|
})
|
|
}
|
|
|
|
})
|
|
this.render({parts: ["form"]})
|
|
}
|
|
|
|
|
|
static async #use(event, target) {
|
|
|
|
|
|
let modValue = this._circumstance
|
|
this._mods.forEach(mod => {
|
|
modValue += Number(mod.value)
|
|
})
|
|
|
|
const targetValue = this._value + modValue
|
|
|
|
let roll = await new Roll(`1d20`).evaluate()
|
|
let diff = targetValue - roll.terms[0].results[0].result
|
|
roll.toMessage({
|
|
speaker: ChatMessage.getSpeaker({actor: this.actor}),
|
|
flavor: `${this._flaw ? "Schlechte " : ""}Eigenschaft: ${this._name}<br/>Ergebnis: ${Math.abs(diff)}${diff > 0 ? " übrig" : " daneben"}`,
|
|
rollMode: game.settings.get('core', 'rollMode'),
|
|
});
|
|
|
|
this.close()
|
|
}
|
|
|
|
_configureRenderOptions(options) {
|
|
super._configureRenderOptions(options)
|
|
|
|
if (options.window) {
|
|
if (this._flaw) {
|
|
options.window.title = `Schlechte Eigenschaft: ${this._name}`
|
|
} else {
|
|
options.window.title = `Eigenschaft: ${this._name}`
|
|
}
|
|
|
|
options.position.height = 640
|
|
}
|
|
|
|
|
|
return options
|
|
}
|
|
|
|
|
|
async _prepareContext(options) {
|
|
const context = await super._prepareContext(options)
|
|
context.actor = this._actor
|
|
context.colorfulDice = game.settings.get('DSA_4-1', 'optional_colorfuldice')
|
|
|
|
context.text = this._text
|
|
|
|
context.dice = []
|
|
|
|
if (this._flaw) {
|
|
context.dice.push({
|
|
wert: this._value,
|
|
name: "",
|
|
tooltip: "flaw",
|
|
})
|
|
} else {
|
|
context.dice.push({
|
|
wert: this._actor.system.attribute[this._symbol.toLowerCase()].aktuell,
|
|
name: this._symbol.toUpperCase(),
|
|
tooltip: ATTRIBUTE[this._symbol.toLowerCase()],
|
|
})
|
|
}
|
|
|
|
context.mods = [] // ADV, DDV, SF that may influence this talent atleast BE
|
|
|
|
const categories = ["Advantage", "SpecialAbility"]
|
|
categories.forEach(category => this._actor.itemTypes[category].forEach(adv => {
|
|
|
|
const mods = adv.system.getActiveMod()
|
|
|
|
mods?.forEach(mod => {
|
|
|
|
if (mod.name) {
|
|
|
|
if (mod.name === `attribute.${this._symbol.toLowerCase()}.mod`) {
|
|
context.mods.push({
|
|
name: adv.name,
|
|
value: mod.value,
|
|
mod: adv.name + "eigenschaft",
|
|
active: this._mods.find(mod => mod.name === adv.name + "eigenschaft")
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}))
|
|
|
|
context.value = this._value
|
|
context.circumstance = this._circumstance
|
|
context.penalty = 0
|
|
this._mods.forEach(mod => {
|
|
context.penalty += Number(mod.value)
|
|
})
|
|
|
|
context.modResult = context.circumstance + context.penalty
|
|
context.displayModResult = context.modResult > 0 ? `+${context.modResult}` : context.modResult
|
|
|
|
return context
|
|
}
|
|
} |