177 lines
6.3 KiB
JavaScript
177 lines
6.3 KiB
JavaScript
import { ITEM_TYPES } from "../constants.js"
|
|
import { RdDItemSort } from "../item-sort.js"
|
|
import { Misc } from "../misc.js"
|
|
|
|
export const ACTION_ITEM_ENCHANTER = {
|
|
code: 'item-enchanter', label: 'Enchanter', icon: it => 'fa-solid fa-sparkles',
|
|
filter: it => game.user.isGM || DialogEnchanter.isEnchantable(it),
|
|
optionsFilter: options => options.editable,
|
|
action: (item, actor) => DialogEnchanter.enchanter(item)
|
|
}
|
|
|
|
export class DialogEnchanter extends Dialog {
|
|
|
|
static isEnchantable(item) {
|
|
if (!item.isEnchantementPossible) {
|
|
return false
|
|
}
|
|
if (game.user.isGM) {
|
|
return true
|
|
}
|
|
if (item.system.prpermanent) {
|
|
return false
|
|
}
|
|
if (!item.parent?.isHautRevant()) {
|
|
return false
|
|
}
|
|
return RdDItemSort.lancements(RdDItemSort.findEnchantement(item.parent)) > 0
|
|
|| RdDItemSort.lancements(RdDItemSort.findPurification(item.parent)) > 0
|
|
|| RdDItemSort.lancements(RdDItemSort.findPermanence(item.parent)) > 0
|
|
}
|
|
|
|
static dateEnchantement() {
|
|
return game.system.rdd.calendrier.getTimestamp().debutJournee().indexDate
|
|
}
|
|
|
|
static async enchanter(item) {
|
|
const actor = item.parent
|
|
const sorts = {
|
|
enchantement: RdDItemSort.findEnchantement(actor),
|
|
purification: RdDItemSort.findPurification(actor),
|
|
permanence: RdDItemSort.findPermanence(actor)
|
|
}
|
|
const nouveauxpr = (sorts.enchantement?.system.lancements ?? []).map(it => it.reve)
|
|
const purification = (sorts.purification?.system.lancements ?? []).find(it => true)
|
|
const permanence = (sorts.permanence?.system.lancements ?? []).find(it => true)
|
|
|
|
const enchanter = {
|
|
type: item.type == ITEM_TYPES.potion ? 'potion' : Misc.typeName('Item', item.type),
|
|
actor: actor,
|
|
item: item,
|
|
reve: item.system.pr,
|
|
sorts: sorts,
|
|
nouveauxpr: nouveauxpr,
|
|
purification: purification != undefined,
|
|
permanence: permanence != undefined,
|
|
options: { isGM: game.user.isGM }
|
|
}
|
|
if (!item.isEnchantementPossible) {
|
|
ui.notifications.info("Seuls les liquides et les gemmes sont enchantables")
|
|
return
|
|
}
|
|
if (item.system.prpermanent) {
|
|
ui.notifications.info(`La ${enchanter.type} est permanente`)
|
|
return
|
|
}
|
|
if (!game.user.isGM) {
|
|
if (!(actor?.isPersonnage() || actor?.isHautRevant())) {
|
|
ui.notifications.info(`Seul un haut rêvant peut enchanter une ${enchanter.type}`)
|
|
return
|
|
}
|
|
if (item.system.quantite != 1) {
|
|
ui.notifications.info(`Impossible d'enchanter ${item.system.quantite} ${enchanter.type}s ${item.system.quantite > 1 ? 'en une seule fois' : ''}`)
|
|
return
|
|
}
|
|
if (!(nouveauxpr.length > 0 || purification || permanence)) {
|
|
ui.notifications.info("Le haut-rêvant n'a lancé de rituel d'enchantement")
|
|
return
|
|
}
|
|
if (item.system.magique && item.system.purifie && !purification && !permanence) {
|
|
ui.notifications.info(`La ${enchanter.type} est déjà enchantée et doit être purifiée`)
|
|
return
|
|
}
|
|
}
|
|
|
|
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/enchantement/dialog-enchanter.hbs`, enchanter)
|
|
const dialog = new DialogEnchanter(enchanter, html)
|
|
dialog.render(true)
|
|
}
|
|
|
|
constructor(enchanter, html) {
|
|
let options = { classes: ["dialog-enchanter"], width: 400, height: 'fit-content', 'z-index': 99999 }
|
|
let conf = {
|
|
title: `Enchanter une ${enchanter.type}`,
|
|
content: html,
|
|
default: "enchanter",
|
|
buttons: {
|
|
"enchanter": { label: "Enchanter", callback: it => this.onEnchanter() }
|
|
}
|
|
};
|
|
super(conf, options)
|
|
this.html = html
|
|
this.enchanter = enchanter
|
|
this.item = enchanter.item
|
|
}
|
|
|
|
activateListeners(html) {
|
|
super.activateListeners(html)
|
|
this.html = html
|
|
this.html.find("input.enchantement").change(event => this.$onSelectEnchantement(event))
|
|
this.html.find("input.reve").change(event => this.$onForceReve(event))
|
|
}
|
|
|
|
$onSelectEnchantement(event) {
|
|
const addReve = $(event.currentTarget).data('reve')
|
|
this.enchanter.idx = $(event.currentTarget).data('idx')
|
|
this.enchanter.reve = this.item.system.pr + Number(addReve)
|
|
this.html.find("input.reve").val(this.enchanter.reve)
|
|
for (let idx = 0; idx < this.enchanter.nouveauxpr.length; idx++) {
|
|
if (idx != this.enchanter.idx) {
|
|
this.html.find(`.enchantement[data-idx='${idx}']`).prop("checked", false)
|
|
}
|
|
}
|
|
}
|
|
|
|
$onForceReve(event) {
|
|
const newReve = Number(event.currentTarget.value)
|
|
if (this.enchanter.reve != newReve) {
|
|
this.enchanter.idx = undefined
|
|
}
|
|
this.enchanter.reve = newReve
|
|
}
|
|
|
|
async onEnchanter() {
|
|
foundry.utils.mergeObject(this.enchanter,
|
|
{
|
|
rendrepurifie: this.html.find("input.rendrepurifie").prop("checked"),
|
|
rendrepermanent: this.html.find("input.rendrepermanent").prop("checked"),
|
|
addreve: this.enchanter.reve != this.item.system.pr
|
|
},
|
|
{ inplace: true })
|
|
const item = this.enchanter.item
|
|
const actor = this.enchanter.actor
|
|
|
|
if (this.enchanter.reve == 0) {
|
|
await item.update({
|
|
'system.pr': 0,
|
|
'system.magique': false,
|
|
'system.purifie': false,
|
|
'system.prpermanent': false,
|
|
'system.prdate': 0
|
|
})
|
|
}
|
|
else {
|
|
const isPurifiee = this.enchanter.addreve
|
|
? (this.enchanter.rendrepurifie && (item.item.system.pr == 0 ? true : item.system.purifie))
|
|
: (this.enchanter.rendrepurifie || item.system.purifie)
|
|
await item.update({
|
|
'system.pr': this.enchanter.reve,
|
|
'system.magique': true,
|
|
'system.purifie': isPurifiee,
|
|
'system.prpermanent': item.system.prpermanent || this.enchanter.rendrepermanent,
|
|
'system.prdate': DialogEnchanter.dateEnchantement()
|
|
})
|
|
if (actor) {
|
|
if (this.enchanter.rendrepurifie) {
|
|
await RdDItemSort.changeLancementsSort(this.enchanter.sorts.purification, it => it.slice(1));
|
|
}
|
|
if (this.enchanter.rendrepermanent) {
|
|
await RdDItemSort.changeLancementsSort(this.enchanter.sorts.permanence, it => it.slice(1));
|
|
}
|
|
if (this.enchanter.addreve && this.enchanter.idx != undefined) {
|
|
await RdDItemSort.changeLancementsSort(RdDItemSort.findEnchantement(actor), it => it.toSpliced(this.enchanter.idx, 1))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |