From 2870b6b587152eff24870fd822f9087df2214aa7 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sat, 18 May 2024 15:52:26 -0500 Subject: [PATCH] add drain power points --- src/module/powers/banish.js | 1 - src/module/powers/drainPowerPoints.js | 83 +++++++++++++++++++++++++++ src/module/powers/powers.js | 2 + src/module/rollHelpers.js | 7 ++- 4 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 src/module/powers/drainPowerPoints.js diff --git a/src/module/powers/banish.js b/src/module/powers/banish.js index 6b7688f..6962c51 100644 --- a/src/module/powers/banish.js +++ b/src/module/powers/banish.js @@ -65,7 +65,6 @@ export class BanishEffect extends PowerEffect { const rollOpts = { title: 'Spirit roll to resist banishment', flavor: 'Roll Spirit to resist banishment!', - modCallback: getPowerModifiers, targetNumber: this.data.tn, }; await requestRollFromTokens(this.targets, 'ability', 'spirit', rollOpts); diff --git a/src/module/powers/drainPowerPoints.js b/src/module/powers/drainPowerPoints.js new file mode 100644 index 0000000..3401f0f --- /dev/null +++ b/src/module/powers/drainPowerPoints.js @@ -0,0 +1,83 @@ +import { requestRollFromTokens } from '../helpers.js'; +import { PowerEffect } from './basePowers.js'; + +export class DrainPowerPointsEffect extends PowerEffect { + get name() { + return 'Drain Power Points'; + } + + get icon() { + return 'icons/magic/control/debuff-energy-hold-teal-blue.webp'; + } + + get duration() { + return 0; + } + + get basePowerPoints() { + return 2; + } + + get usePrimaryEffect() { + return false; + } + + get isTargeted() { + return true; + } + + get isRaisable() { + return false; + } + + get oneTarget() { + return true; + } + + get modifiers() { + return [ + ...super.modifiers, + { + type: 'checkbox', + name: 'Power', + id: 'power', + epic: false, + effect: false, + value: 2, + }, + { + type: 'number', + default: 4, + name: 'Opposed Target Number', + id: 'tn', + epic: false, + effect: false, + value: 0, + }, + ]; + } + + async sideEffects() { + await super.sideEffects(); + const rollOpts = { + title: 'Resist Drain Power Points', + flavor: 'Resist the energy drain!', + mods: [{ label: 'Different Arcane Background', value: 2, ignore: true }], + targetNumber: this.data.tn, + }; + await requestRollFromTokens(this.targets, 'ability', 'spirit', rollOpts); + } + + get description() { + return ( + super.description + + ` +

An opposed roll of the caster's arcane activation roll vs the target's + Spirit. Caster's success means the victim loses + [[/r ${this.data.power ? '2' : '1'}d6]] power points. If the caster gets + a raise over the opponent, the stolen power points augment the caster's + own total.

+ ` + ); + } +} diff --git a/src/module/powers/powers.js b/src/module/powers/powers.js index 35b4ae7..f589f20 100644 --- a/src/module/powers/powers.js +++ b/src/module/powers/powers.js @@ -19,6 +19,7 @@ import { DetectConcealArcanaEffect } from './detectConcealArcana.js'; import { DisguiseEffect } from './disguise.js'; import { DispelEffect } from './dispel.js'; import { DivinationEffect } from './divination.js'; +import { DrainPowerPointsEffect } from './drainPowerPoints.js'; const PowerClasses = { 'arcane-protection': ArcaneProtectionEffect, @@ -45,6 +46,7 @@ const PowerClasses = { disguise: DisguiseEffect, dispel: DispelEffect, divination: DivinationEffect, + 'drain-power-points': DrainPowerPointsEffect, 'lower-trait': BoostLowerTraitEffect, }; diff --git a/src/module/rollHelpers.js b/src/module/rollHelpers.js index f9c48a2..051239a 100644 --- a/src/module/rollHelpers.js +++ b/src/module/rollHelpers.js @@ -95,6 +95,9 @@ export async function preDamageRollModifiers(actor, item, roll, modifiers, optio export async function getPowerModifiers(token) { const modifiers = []; _addArcaneModifiers(token, modifiers); + for (const modifier of modifiers) { + modifier.value *= -1; + } return modifiers; } @@ -119,9 +122,9 @@ function _addRangeModifiers(token, target, options, modifiers) { function _addArcaneModifiers(target, modifiers) { if (_findItem(target.actor, 'edge', 'improved-arcane-resistance')) { - modifiers.push({ label: 'Arcane Resistance', value: '-4', ignore: true }); + modifiers.push({ label: 'Arcane Resistance', value: -4, ignore: true }); } else if (_findItem(target.actor, 'edge', 'arcane-resistance')) { - modifiers.push({ label: 'Arcane Resistance', value: '-2', ignore: true }); + modifiers.push({ label: 'Arcane Resistance', value: -2, ignore: true }); } const effect = target.actor.effects.find((e) => !e.disabled && e.name.toLowerCase().includes('arcane protection')); if (effect) {