import {ActionManager} from "../sheets/actions/action-manager.mjs";
import {Talent} from "../data/talent.mjs";
const {ApplicationV2, HandlebarsApplicationMixin} = foundry.applications.api
/**
* @typedef TokenDistance
* @property {Number} x
* @property {Number} y
* @property {Number} d
* @property {Token} token
*/
export class BattleDialog extends HandlebarsApplicationMixin(ApplicationV2) {
static DEFAULT_OPTIONS = {
classes: ['dsa41', 'dialog', 'battle'],
tag: "form",
position: {
width: 640,
height: 518
},
window: {
resizable: false,
},
form: {
submitOnChange: true,
closeOnSubmit: false,
handler: BattleDialog.#onSubmitForm
},
actions: {
selectOffenseActor: BattleDialog.#setOffenseActor,
selectDefenseActor: BattleDialog.#setDefenseActor,
doBattle: BattleDialog.#doBattle,
}
}
static PARTS = {
form: {
template: 'systems/DSA_4-1/templates/dialog/battle-dialog.hbs',
}
}
/**
* @type {Actor}
* @private
*/
_offenseActor = null
_defenseActor = null
constructor() {
super()
}
static async #onSubmitForm(event, form, formData) {
event.preventDefault()
this._offenseTalent = formData.object['offense.talent']
this._defenseTalent = formData.object['defense.talent']
}
static #setOffenseActor(event, target) {
const {id} = target.dataset
this._offenseActor = game.actors.get(id)
this.render({parts: ["form"]})
}
static #setDefenseActor(event, target) {
const {id} = target.dataset
this._defenseActor = game.actors.get(id)
this.render({parts: ["form"]})
}
static async #doBattle(event, target) {
// TODO perform Dice Rolls but in secret mode so its up to the GM if they want to display the result or not
let offenseTalent = {}
if (this._offenseActor && this._offenseActor.items.get(this._offenseTalent)) {
const skill = this._offenseActor.items.get(this._offenseTalent)
offenseTalent.name = skill.name
offenseTalent.taw = skill.system.taw
offenseTalent.probe = skill.system.probe
} else {
offenseTalent.name = this.element.querySelector('input[name="offense.talent.name"]').value
offenseTalent.taw = this.element.querySelector('input[name="offense.talent.taw"]').value
offenseTalent.probe = [
this.element.querySelector('input[name="offense.talent.probe.0.name"]').value,
this.element.querySelector('input[name="offense.talent.probe.1.name"]').value,
this.element.querySelector('input[name="offense.talent.probe.2.name"]').value
]
}
offenseTalent.eigenschaften = {}
if (this._offenseActor && this._offenseActor.system.attribute) {
offenseTalent.eigenschaften = this._offenseActor.system.attribute
} else {
offenseTalent.eigenschaften = {
mu: this.element.querySelector('input[name="offenseAttributes.mu"]').value,
kl: this.element.querySelector('input[name="offenseAttributes.in"]').value,
in: this.element.querySelector('input[name="offenseAttributes.kl"]').value,
ch: this.element.querySelector('input[name="offenseAttributes.ch"]').value,
ff: this.element.querySelector('input[name="offenseAttributes.ff"]').value,
ge: this.element.querySelector('input[name="offenseAttributes.ge"]').value,
ko: this.element.querySelector('input[name="offenseAttributes.ko"]').value,
kk: this.element.querySelector('input[name="offenseAttributes.kk"]').value,
}
}
let defenseTalent = {}
if (this._defenseActor && this._defenseActor.items.get(this._defenseTalent)) {
const skill = this._defenseActor.items.get(this._defenseTalent)
defenseTalent.name = skill.name
defenseTalent.taw = skill.system.taw
defenseTalent.probe = skill.system.probe
} else {
defenseTalent.name = this.element.querySelector('input[name="defense.talent.name"]').value
defenseTalent.taw = this.element.querySelector('input[name="defense.talent.taw"]').value
defenseTalent.probe = [
this.element.querySelector('input[name="defense.talent.probe.0.name"]').value,
this.element.querySelector('input[name="defense.talent.probe.1.name"]').value,
this.element.querySelector('input[name="defense.talent.probe.2.name"]').value
]
}
defenseTalent.eigenschaften = {}
if (this._defenseActor && this._defenseActor.system.attribute) {
defenseTalent.eigenschaften = this._defenseActor.system.attribute
} else {
defenseTalent.eigenschaften = {
mu: this.element.querySelector('input[name="defenseAttributes.mu"]').value,
kl: this.element.querySelector('input[name="defenseAttributes.in"]').value,
in: this.element.querySelector('input[name="defenseAttributes.kl"]').value,
ch: this.element.querySelector('input[name="defenseAttributes.ch"]').value,
ff: this.element.querySelector('input[name="defenseAttributes.ff"]').value,
ge: this.element.querySelector('input[name="defenseAttributes.ge"]').value,
ko: this.element.querySelector('input[name="defenseAttributes.ko"]').value,
kk: this.element.querySelector('input[name="defenseAttributes.kk"]').value,
}
}
const offense = await (new Talent(offenseTalent)).evaluate("gmroll")
const defense = await (new Talent(defenseTalent)).evaluate("gmroll")
offense.evaluatedRoll.toMessage({
speaker: ChatMessage.getSpeaker({actor: this._offenseActor}),
flavor: `Talent: ${offenseTalent.name}
TaP: ${offense.tap}
${offense.meisterlich ? "Meisterlich" : ""}${offense.patzer ? "Petzer" : ""}`,
})
defense.evaluatedRoll.toMessage({
speaker: ChatMessage.getSpeaker({actor: this._defenseActor}),
flavor: `Talent: ${defenseTalent.name}
TaP: ${defense.tap}
${defense.meisterlich ? "Meisterlich" : ""}${defense.patzer ? "Petzer" : ""}`,
})
this.close()
}
_configureRenderOptions(options) {
super._configureRenderOptions(options)
if (options.window) {
options.window.title = "Vergleichende Proben"
}
return options
}
async _prepareContext(options) {
const context = await super._prepareContext(options)
context.actors = game.actors.filter(actor => actor.type === "character" || actor.type === "creature")
context.offenseTalent = this._offenseTalent ?? ''
context.offenseTalents = {}
if (this._offenseActor) {
context.offenseActor = this._offenseActor._id
if (this._offenseActor.system.attribute) {
context.offenseAttributes = {}
Object.entries(this._offenseActor.system.attribute)?.forEach(([key, eigenschaft]) => {
context.offenseAttributes[key] = eigenschaft?.aktuell ?? 0
})
} else {
context.offenseAttributes = false
}
if (this._offenseActor.itemTypes["Skill"]?.length > 0) {
this._offenseActor.itemTypes["Skill"]?.forEach((skill) => {
if (skill.system.probe.length === 3) {
context.offenseTalents[`${skill.name}: ${skill.system.taw} (${skill.system.probe[0]}/${skill.system.probe[1]}/${skill.system.probe[2]})`] = skill.id
}
})
} else {
context.offenseTalents = false
}
}
context.defenseTalent = this._defenseTalent ?? ''
context.defenseTalents = {}
if (this._defenseActor) {
context.defenseActor = this._defenseActor._id
if (this._defenseActor.system.attribute) {
context.defenseAttributes = {}
Object.entries(this._defenseActor.system.attribute)?.forEach(([key, eigenschaft]) => {
context.defenseAttributes[key] = eigenschaft?.aktuell ?? 0
})
} else {
context.defenseAttributes = false
}
if (this._defenseActor.itemTypes["Skill"]?.length > 0) {
this._defenseActor.itemTypes["Skill"]?.forEach((skill) => {
if (skill.system.probe.length === 3) {
context.defenseTalents[`${skill.name}: ${skill.system.taw} (${skill.system.probe[0]}/${skill.system.probe[1]}/${skill.system.probe[2]})`] = skill.id
}
})
} else {
context.defenseTalents = false
}
}
return context
}
_onRender(context, options) {
}
}