import { EcrymeUtility } from "../common/ecryme-utility.js"; import { EcrymeRollDialog } from "./ecryme-roll-dialog.js"; export class EcrymeConfrontDialog extends Dialog { /* -------------------------------------------- */ static async create(actor, rollData) { let options = mergeObject(super.defaultOptions, { classes: ["fvtt-ecryme ecryme-confrontation-dialog"], dragDrop: [{ dragSelector: ".confront-dice-container", dropSelector: null }], width: 620, height: 'fit-content', 'z-index': 99999 }); let html = await renderTemplate('systems/fvtt-ecryme/templates/dialogs/confront-dialog.hbs', rollData); return new EcrymeConfrontDialog(actor, rollData, html, options); } /* -------------------------------------------- */ constructor(actor, rollData, html, options, close = undefined) { let conf = { title: game.i18n.localize("ECRY.ui.confront"), content: html, buttons: { launchConfront: { icon: '', label: game.i18n.localize("ECRY.ui.launchconfront"), callback: () => { this.launchConfront().catch("Error when launching Confrontation") } }, cancel: { icon: '', label: game.i18n.localize("ECRY.ui.cancel"), callback: () => { this.close() } } }, close: close } super(conf, options); this.actor = actor; this.rollData = rollData; // Ensure button is disabled setTimeout(function () { $(".launchConfront").attr("disabled", true) }, 180) } /* -------------------------------------------- */ async launchConfront() { let msg = await EcrymeUtility.createChatMessage(this.rollData.alias, "blindroll", { content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs`, this.rollData) }) EcrymeUtility.blindMessageToGM( { rollData: this.rollData, template: "systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs" }) console.log("MSG", this.rollData) msg.setFlag("world", "ecryme-rolldata", this.rollData) } /* -------------------------------------------- */ async refreshDice() { this.rollData.filter = "execution" let content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData ) content += await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData ) $("#confront-execution").html(content) this.rollData.filter = "preservation" content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData ) content += await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData ) $("#confront-preservation").html(content) this.rollData.filter = "mainpool" content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData ) $("#confront-dice-pool").html(content) content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData ) $("#confront-bonus-pool").html(content) } /* -------------------------------------------- */ async refreshDialog() { const content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/confront-dialog.hbs", this.rollData) this.data.content = content this.render(true) let button = this.buttonDisabled setTimeout(function () { $(".launchConfront").attr("disabled", button) }, 180) } /* ------------------ -------------------------- */ _canDragStart(selector) { console.log("CAN DRAG START", selector, super._canDragStart(selector) ) return true } _canDragDrop(selector) { console.log("CAN DRAG DROP", selector, super._canDragDrop(selector) ) return true } /* ------------------ -------------------------- */ _onDragStart(event) { console.log("DRAGSTART::::", event) super._onDragStart(event) let dragType = $(event.srcElement).data("drag-type") let diceData = {} console.log("DRAGTYPE", dragType) if (dragType == "dice") { diceData = { dragType: "dice", diceIndex: $(event.srcElement).data("dice-idx"), diceValue: $(event.srcElement).data("dice-value"), } } else { diceData = { dragType: "bonus", bonusIndex: $(event.srcElement).data("bonus-idx"), bonusValue: 1 } } event.dataTransfer.setData("text/plain", JSON.stringify(diceData)); } /* -------------------------------------------- */ _onDrop(event) { let dataJSON = event.dataTransfer.getData('text/plain') let data = JSON.parse(dataJSON) if ( data.dragType == "dice") { let idx = Number(data.diceIndex) console.log("DATA", data, event, event.srcElement.className) if (event.srcElement.className.includes("execution") && this.rollData.availableDices.filter(d => d.location == "execution").length < 2) { this.rollData.availableDices[idx].location = "execution" } if (event.srcElement.className.includes("preservation") && this.rollData.availableDices.filter(d => d.location == "preservation").length < 2) { this.rollData.availableDices[idx].location = "preservation" } if (event.srcElement.className.includes("dice-list")) { this.rollData.availableDices[idx].location = "mainpool" } if (this.rollData.availableDices.filter(d => d.location == "execution").length == 2 && this.rollData.availableDices.filter(d => d.location == "preservation").length == 2) { this.buttonDisabled = false } else { this.buttonDisabled = true } } else { let idx = Number(data.bonusIndex) if (event.srcElement.className.includes("execution")) { this.rollData.confrontBonus[idx].location = "execution" } if (event.srcElement.className.includes("preservation")) { this.rollData.confrontBonus[idx].location = "preservation" } if (event.srcElement.className.includes("bonus-list")) { this.rollData.confrontBonus[idx].location = "mainpool" } } // Manage total values this.computeTotals() } /* -------------------------------------------- */ processTranscendence() { // Apply Transcend if needed if (this.rollData.skillTranscendence > 0) { if (this.rollData.applyTranscendence == "execution") { this.rollData.executionTotal += this.rollData.skillTranscendence } else { this.rollData.preservationTotal += this.rollData.skillTranscendence } } } /* -------------------------------------------- */ computeTotals() { let rollData = this.rollData let actor = game.actors.get(rollData.actorId) rollData.executionTotal = rollData.availableDices.filter(d => d.location == "execution").reduce((previous, current) => { return previous + current.result }, rollData.skill.value) rollData.executionTotal = rollData.confrontBonus.filter(d => d.location == "execution").reduce((previous, current) => { return previous + 1 }, rollData.executionTotal) rollData.preservationTotal = rollData.availableDices.filter(d => d.location == "preservation").reduce((previous, current) => { return previous + current.result }, rollData.skill.value) rollData.preservationTotal = rollData.confrontBonus.filter(d => d.location == "preservation").reduce((previous, current) => { return previous + 1 }, rollData.preservationTotal) this.processTranscendence() if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) { rollData.spec = duplicate(actor.getSpecialization(rollData.selectedSpecs[0])) rollData.specApplied = true rollData.executionTotal += 2 rollData.preservationTotal += 2 } if ( rollData.specApplied && rollData.selectedSpecs.length == 0) { rollData.spec = undefined rollData.specApplied = false } rollData.bonusMalusTraits = 0 for (let t of rollData.traitsBonus) { t.activated = false } for (let t of rollData.traitsMalus) { t.activated = false } if (rollData.traitsBonusSelected && rollData.traitsBonusSelected.length > 0) { for (let id of rollData.traitsBonusSelected) { let trait = rollData.traitsBonus.find(t => t._id == id) trait.activated = true rollData.bonusMalusTraits += trait.system.level } } if (rollData.traitsMalusSelected && rollData.traitsMalusSelected.length > 0) { for (let id of rollData.traitsMalusSelected) { let trait = rollData.traitsMalus.find(t => t._id == id) trait.activated = true rollData.bonusMalusTraits -= trait.system.level } } rollData.executionTotal += rollData.bonusMalusTraits + rollData.bonusMalusPerso rollData.preservationTotal += rollData.bonusMalusTraits + rollData.bonusMalusPerso this.refreshDialog() } /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); html.find('#bonusMalusPerso').change((event) => { this.rollData.bonusMalusPerso = Number(event.currentTarget.value) this.computeTotals() }) html.find('#roll-specialization').change((event) => { this.rollData.selectedSpecs = $('#roll-specialization').val() this.computeTotals() }) html.find('#roll-trait-bonus').change((event) => { this.rollData.traitsBonusSelected = $('#roll-trait-bonus').val() this.computeTotals() }) html.find('#roll-trait-malus').change((event) => { this.rollData.traitsMalusSelected = $('#roll-trait-malus').val() this.computeTotals() }) html.find('#roll-select-transcendence').change((event) => { this.rollData.skillTranscendence = Number($('#roll-select-transcendence').val()) this.computeTotals() }) html.find('#roll-apply-transcendence').change((event) => { this.rollData.applyTranscendence = $('#roll-apply-transcendence').val() this.computeTotals() }) html.find('#annency-bonus').change((event) => { this.rollData.annencyBonus = Number(event.currentTarget.value) }) } }