parent
c1107f7c8d
commit
07727162d3
145
macros/warpgate_spells/warriors-gift-warpgate.js
Normal file
145
macros/warpgate_spells/warriors-gift-warpgate.js
Normal file
@ -0,0 +1,145 @@
|
||||
const ICON = 'icons/magic/control/modfiy-luck-fortune-gray.webp'
|
||||
|
||||
const PACKNAMES = [
|
||||
'swade-core-rules.swade-edges',
|
||||
'swpf-core-rules.swpf-edges',
|
||||
]
|
||||
|
||||
const EDGENAMES = [
|
||||
'Block',
|
||||
'Improved Block',
|
||||
'Brawler',
|
||||
'Bruiser',
|
||||
'Calculating',
|
||||
'Combat Reflexes',
|
||||
'Counterattack',
|
||||
'Improved Counterattack',
|
||||
'Dead Shot',
|
||||
'Dodge',
|
||||
'Extraction',
|
||||
'Improved Extraction',
|
||||
'Feint',
|
||||
'First Strike',
|
||||
'Improved First Strike',
|
||||
'Formation Fighter',
|
||||
'Free Runner',
|
||||
'Frenzy',
|
||||
'Improved Frenzy',
|
||||
'Giant Killer',
|
||||
'Hard to Kill',
|
||||
'Harder to Kill',
|
||||
'Improvisational Fighter',
|
||||
'Iron Jaw',
|
||||
'Killer Instinct',
|
||||
'Level Headed',
|
||||
'Improved Level Headed',
|
||||
'Marksman',
|
||||
'Mighty Blow',
|
||||
'Nerves of Steel',
|
||||
'Improved Nerves of Steel',
|
||||
'No Mercy',
|
||||
'Rapid Reload',
|
||||
'Rapid Shot',
|
||||
'Improved Rapid Shot',
|
||||
'Steady Hands',
|
||||
'Sweep',
|
||||
'Improved Sweep',
|
||||
'Trademark Weapon',
|
||||
'Improved Trademark Weapon',
|
||||
'Two-Weapon Fighting',
|
||||
]
|
||||
|
||||
let EDGES = new Map()
|
||||
for (let edgeName of EDGENAMES) {
|
||||
for (let packName of PACKNAMES) {
|
||||
let edge = game.packs.get(packName)?.index?.find(i => i.name == edgeName);
|
||||
if (edge) {
|
||||
EDGES.set(edgeName, {pack: packName, edge: edge._id});
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let tokens = [];
|
||||
let targets = Array.from(game.user.targets);
|
||||
if (targets.length > 0) {
|
||||
tokens = targets;
|
||||
} else if (canvas.tokens.controlled.length > 0) {
|
||||
tokens = canvas.tokens.controlled;
|
||||
}
|
||||
if (tokens.length > 0) {
|
||||
main(tokens);
|
||||
} else {
|
||||
ui.notifications.error("Please select or target a token");
|
||||
}
|
||||
|
||||
async function main(tokens) {
|
||||
let tokenList = tokens.map(t => t.name).join(", ");
|
||||
let menuOptions = {
|
||||
title: "Warrior's Gift",
|
||||
defaultButton: "cancel",
|
||||
options: {}
|
||||
}
|
||||
let edgeNames = Array.from(EDGES.keys()).sort();
|
||||
let menuData = {
|
||||
inputs: [
|
||||
{type: 'header', label: "Warrior's Gift"},
|
||||
{type: 'info', label: `Apply Warrior's Gift to ${tokenList}`},
|
||||
{type: 'select', label: "Edge", options: edgeNames},
|
||||
],
|
||||
buttons: [
|
||||
{label: "Apply", value: "apply"},
|
||||
{label: "Cancel", value: "cancel"}
|
||||
]
|
||||
}
|
||||
let {buttons, inputs} = await warpgate.menu(menuData, menuOptions);
|
||||
if (buttons && buttons != "cancel") {
|
||||
await createEffect(tokens, inputs[2]);
|
||||
}
|
||||
}
|
||||
|
||||
async function createEffect(tokens, edgeName) {
|
||||
const effectIcon = ICON;
|
||||
for (const token of tokens) {
|
||||
const effectName = `Warrior's Gift (${edgeName})`;
|
||||
const effectId = `warriorsgift${edgeName}`;
|
||||
const edgeId = EDGES.get(edgeName).edge;
|
||||
const pack = EDGES.get(edgeName).pack;
|
||||
const edge = await game.packs.get(pack).getDocument(edgeId);
|
||||
let effectData = {
|
||||
icon: effectIcon,
|
||||
id: effectId,
|
||||
label: effectName,
|
||||
duration: {rounds: 5},
|
||||
flags: {
|
||||
swade: {
|
||||
expiration: 3,
|
||||
loseTurnOnHold: true
|
||||
}
|
||||
},
|
||||
changes: [],
|
||||
};
|
||||
let edgeData = {...edge.data};
|
||||
let mutate = {
|
||||
embedded: {
|
||||
Item: {
|
||||
[edgeName]: edgeData,
|
||||
},
|
||||
ActiveEffect: {
|
||||
[effectName]: effectData,
|
||||
}
|
||||
}
|
||||
};
|
||||
edgeData.effects.forEach(edgeEffect => {
|
||||
mutate.embedded.ActiveEffect[edgeEffect.data.label] = edgeEffect.data
|
||||
})
|
||||
|
||||
let mutateOptions = {
|
||||
comparisonKeys: {'ActiveEffect': 'label'},
|
||||
name: effectName,
|
||||
permanent: false,
|
||||
description: effectName,
|
||||
}
|
||||
await warpgate.mutate(token.document, mutate, {}, mutateOptions);
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user