Files

93 lines
2.7 KiB
JavaScript

export let RollHandler = null
Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
RollHandler = class RollHandler extends coreModule.api.RollHandler {
/** @override */
async handleActionClick(event, encodedValue) {
const [actionTypeId, actionId] = encodedValue.split(this.delimiter ?? '|')
if (this.actor) {
await this.#handleAction(event, this.actor, this.token, actionTypeId, actionId)
return
}
const knownTypes = ['character', 'creature']
for (const token of canvas.tokens.controlled.filter(t => knownTypes.includes(t.actor?.type))) {
await this.#handleAction(event, token.actor, token, actionTypeId, actionId)
}
}
/** @override */
async handleActionHover(event, encodedValue) {}
/** @override */
async handleGroupClick(event, group) {}
async #handleAction(event, actor, token, actionTypeId, actionId) {
switch (actionTypeId) {
case 'attribute':
await actor.rollAttribute(actionId)
break
case 'hp':
await this.#handleHP(actor, actionId)
break
case 'flow':
await this.#handleFlow(actor, actionId)
break
case 'weapon':
await this.#handleWeapon(actor, actionId)
break
case 'condition':
await actor.toggleStatusEffect(actionId)
break
case 'ability':
await actor.useAbility(actionId)
break
case 'kit':
await actor.useKit(actionId)
break
case 'utility':
await this.#handleUtility(actor, token, actionId)
break
}
}
async #handleHP(actor, actionId) {
if (actionId === 'display') return
const hp = actor.system.hp
if (!hp) return
const newValue = actionId === 'add' ? hp.value + 1 : hp.value - 1
if (newValue < 0 || newValue > hp.max) return
await actor.update({ 'system.hp.value': newValue })
}
async #handleFlow(actor, actionId) {
if (actionId === 'display') return
const fp = actor.system.flowPoints
if (fp === undefined) return
const newValue = actionId === 'add' ? fp.value + 1 : Math.max(0, fp.value - 1)
await actor.update({ 'system.flowPoints.value': newValue })
}
async #handleWeapon(actor, actionId) {
const weapon = actor.items.get(actionId)
if (!weapon) return
await actor.rollWeapon(weapon)
}
async #handleUtility(actor, token, actionId) {
switch (actionId) {
case 'longRest':
await actor.longRest()
break
case 'endTurn':
if (game.combat?.current?.tokenId === token?.id) {
await game.combat.nextTurn()
}
break
}
}
}
})