182 lines
5.0 KiB
JavaScript
182 lines
5.0 KiB
JavaScript
import { CONST, shim } from './shim.js'
|
|
|
|
function baseMenu (title, targets) {
|
|
const targetList = targets.map(t => t.name).join(', ')
|
|
return {
|
|
menuOptions: {
|
|
title,
|
|
defaultButton: 'Cancel',
|
|
options: {}
|
|
},
|
|
menuData: {
|
|
inputs: [
|
|
{ type: 'header', label: title },
|
|
{ type: 'info', label: `Apply ${title} to ${targetList}` },
|
|
{ type: 'header', label: 'Global Modifiers' },
|
|
{ type: 'checkbox', label: 'Glow (+1)' },
|
|
{ type: 'checkbox', label: 'Shroud (+1)' },
|
|
{ type: 'checkbox', label: 'Hinder (+1)' },
|
|
{ type: 'checkbox', label: 'Hurry (+1)' },
|
|
{ type: 'header', label: 'Power Modifiers' }
|
|
],
|
|
buttons: [
|
|
{ label: 'Apply', value: 'apply' },
|
|
{ label: 'Apply with Raise', value: 'raise' },
|
|
{ label: 'Cancel', value: 'cancel' }
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
class ModifierEffects {
|
|
static glow (basename, durationRounds) {
|
|
const effectDoc = shim.createEffectDocument(
|
|
'icons/magic/light/orb-shadow-blue.webp',
|
|
'Glow',
|
|
durationRounds
|
|
)
|
|
effectDoc.changes = [
|
|
{
|
|
key: '@Skill{Stealth}[system.die.modifier]',
|
|
mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD,
|
|
value: -2,
|
|
priority: 0
|
|
}
|
|
]
|
|
return effectDoc
|
|
}
|
|
|
|
static shroud (basename, durationRounds) {
|
|
const effectDoc = shim.createEffectDocument(
|
|
'icons/magic/perception/shadow-stealth-eyes-purple.webp',
|
|
'Shroud',
|
|
durationRounds
|
|
)
|
|
effectDoc.changes = [
|
|
{
|
|
key: '@Skill{Stealth}[system.die.modifier]',
|
|
mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD,
|
|
value: 1,
|
|
priority: 0
|
|
}
|
|
]
|
|
return effectDoc
|
|
}
|
|
|
|
static hinder (basename, durationRounds) {
|
|
const effectDoc = shim.createEffectDocument(
|
|
'icons/magic/control/debuff-chains-shackle-movement-red.webp',
|
|
'Hinder',
|
|
durationRounds
|
|
)
|
|
effectDoc.changes = [
|
|
{
|
|
key: 'system.stats.speed.value',
|
|
mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD,
|
|
value: -2,
|
|
priority: 0
|
|
}
|
|
]
|
|
return effectDoc
|
|
}
|
|
|
|
static hurry (basename, durationRounds) {
|
|
const effectDoc = shim.createEffectDocument(
|
|
'icons/skills/movement/feet-winged-sandals-tan.webp',
|
|
'Hurry',
|
|
durationRounds
|
|
)
|
|
effectDoc.changes = [
|
|
{
|
|
key: 'system.stats.speed.value',
|
|
mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD,
|
|
value: 2,
|
|
priority: 0
|
|
}
|
|
]
|
|
return effectDoc
|
|
}
|
|
}
|
|
|
|
function globalModifierEffects (inputs, basename, durationRounds) {
|
|
const effectDocs = []
|
|
const inputIndex = 8
|
|
if (inputs[3]) { // glow
|
|
effectDocs.push(ModifierEffects.glow(basename, durationRounds))
|
|
}
|
|
if (inputs[4]) { // shroud
|
|
effectDocs.push(ModifierEffects.shroud(basename, durationRounds))
|
|
}
|
|
if (inputs[5]) { // hinder
|
|
effectDocs.push(ModifierEffects.hinder(basename, durationRounds))
|
|
}
|
|
if (inputs[6]) { // hurry
|
|
effectDocs.push(ModifierEffects.hurry(basename, durationRounds))
|
|
}
|
|
return { effectDocs, inputIndex }
|
|
}
|
|
|
|
class PowerMenus {
|
|
static blind (token, targets) {
|
|
const { menuOptions, menuData } = baseMenu('Blind', targets)
|
|
menuData.inputs.push({
|
|
type: 'checkbox',
|
|
label: 'Strong (+1 point)',
|
|
options: false
|
|
})
|
|
return { menuOptions, menuData }
|
|
}
|
|
}
|
|
|
|
class PowerHandlers {
|
|
static async blind (token, targets, buttons, inputs) {
|
|
const raise = (buttons === 'raise')
|
|
const { effectDocs, inputIndex } = globalModifierEffects(inputs, 'Blind', 1)
|
|
const strong = !!inputs[inputIndex]
|
|
const icon = 'icons/skills/wounds/injury-eyes-blood-red.webp'
|
|
const changes = [
|
|
{
|
|
key: 'system.stats.globalMods.trait',
|
|
mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD,
|
|
value: -2,
|
|
priority: 0
|
|
}
|
|
]
|
|
effectDocs.push(
|
|
shim.createEffectDocument(
|
|
icon, `minor Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1)
|
|
)
|
|
effectDocs[effectDocs.length - 1].changes = changes
|
|
if (raise) {
|
|
effectDocs.push(
|
|
shim.createEffectDocument(
|
|
icon, `major Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1)
|
|
)
|
|
effectDocs[effectDocs.length - 1].changes = changes
|
|
}
|
|
for (const target of targets) {
|
|
shim.applyActiveEffects(target, effectDocs)
|
|
}
|
|
}
|
|
}
|
|
|
|
export async function powerEffects (options = {}) {
|
|
// options available
|
|
const token = 'token' in options ? options.token : []
|
|
const targets = 'targets' in options ? Array.from(options.targets) : []
|
|
const item = 'item' in options ? options.item : null
|
|
const name = 'name' in options
|
|
? options.name
|
|
: (
|
|
item !== null ? item.name : null)
|
|
|
|
const lcName = name.toLowerCase()
|
|
if (lcName in PowerMenus && lcName in PowerHandlers) {
|
|
const { menuOptions, menuData } = PowerMenus[lcName](token, targets)
|
|
const { buttons, inputs } = await shim.warpgateMenu(menuData, menuOptions)
|
|
if (buttons && buttons !== 'cancel') {
|
|
await PowerHandlers[lcName](token, targets, buttons, inputs)
|
|
}
|
|
}
|
|
}
|