From 805f50c6319d56ab0f2b64ef0c770b4bf7ba868b Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sun, 2 Jun 2024 17:05:45 -0500 Subject: [PATCH] add smite and fix VAE usage --- src/module/powers/basePowers.js | 26 +++++++-- src/module/powers/entangle.js | 1 + src/module/powers/fly.js | 2 +- src/module/powers/invisibility.js | 1 - src/module/powers/powers.js | 2 + src/module/powers/protection.js | 1 - src/module/powers/smite.js | 88 +++++++++++++++++++++++++++++++ 7 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 src/module/powers/smite.js diff --git a/src/module/powers/basePowers.js b/src/module/powers/basePowers.js index a174f42..373d6eb 100644 --- a/src/module/powers/basePowers.js +++ b/src/module/powers/basePowers.js @@ -154,7 +154,7 @@ export class PowerEffect { name, changes, description: `

From ${this.source.name} casting ${this.name}

`, - duration: { rounds: 99 }, + duration: {}, flags: { [moduleName]: { powerEffect: true, @@ -456,14 +456,24 @@ export class PowerEffect { const name = 'effects' in mod ? mod.effects[modValue].name : mod.name; const changes = 'effects' in mod ? mod.effects[modValue].changes : mod.changes; const doc = this.createEffectDocument(icon, name, changes); + doc.statuses = doc.statuses ?? []; + doc.statuses.push('powerEffect'); if (this.duration === 0 && !this.usePrimaryEffect) { // set secondary effects of instant spells to expire on victim's next // turn doc.duration.rounds = 1; doc.flags.swade.expiration = CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.EndOfTurnAuto; } else { - doc.duration.seconds = 594; doc.flags[moduleName].maintId = maintId; + if (moduleHelpers.useVAE) { + doc.flags['visual-active-effects'] = { + data: { + inclusion: 1, + }, + }; + } else { + doc.duration.seconds = 594; + } } docs.push(doc); } @@ -532,12 +542,18 @@ export class PowerEffect { async createPrimaryEffect(maintId) { const doc = this.basePrimaryEffect; if (moduleHelpers.useVAE) { - doc.flags['visual-active-effects'] = { data: { content: this.description } }; + doc.flags['visual-active-effects'] = { + data: { + content: this.description, + inclusion: 1, + }, + }; } else { doc.description += this.description; } + doc.statuses = doc.statuses ?? []; + doc.statuses.push('powerEffect'); doc.flags[moduleName].maintId = maintId; - doc.duration.seconds = 594; const effectButtons = this.primaryEffectButtons; if (effectButtons.length > 0) { doc.flags[moduleName].buttons = effectButtons; @@ -561,6 +577,8 @@ export class PowerEffect { doc.flags.swade.loseTurnOnHold = true; doc.flags[moduleName].maintainingId = maintId; doc.flags[moduleName].targetIds = this.targets.map((t) => t.id); + doc.statuses = doc.statuses ?? []; + doc.statuses.push('powerMaintainEffect'); const effectButtons = this.maintEffectButtons; if (effectButtons.length > 0) { doc.flags[moduleName].buttons = effectButtons; diff --git a/src/module/powers/entangle.js b/src/module/powers/entangle.js index 0ae69c4..33a2d4e 100644 --- a/src/module/powers/entangle.js +++ b/src/module/powers/entangle.js @@ -51,6 +51,7 @@ export class EntangleEffect extends PowerEffect { type: 'checkbox', default: false, name: 'Tough', + id: 'tough', value: 1, epic: false, effect: false, diff --git a/src/module/powers/fly.js b/src/module/powers/fly.js index dd7827c..3a25e49 100644 --- a/src/module/powers/fly.js +++ b/src/module/powers/fly.js @@ -51,7 +51,7 @@ export class FlyEffect extends PowerEffect { const doc = await PowerEffect.getStatus(docLabel, docName, false); doc.description = `

From ${this.source.name} casting ${this.name}

`; doc.flags = mergeObject(doc.flags ?? {}, { [moduleName]: { powerEffect: true } }); - (doc.duration = { rounds: 99 }), (this.baseEffectDoc = doc); + this.baseEffectDoc = doc; } get basePrimaryEffect() { diff --git a/src/module/powers/invisibility.js b/src/module/powers/invisibility.js index 5bccea5..95a99f0 100644 --- a/src/module/powers/invisibility.js +++ b/src/module/powers/invisibility.js @@ -70,7 +70,6 @@ export class InvisibliltyEffect extends PowerEffect { const doc = await PowerEffect.getStatus('EFFECT.StatusInvisible', 'Invisible'); doc.description = `

From ${this.source.name} casting ${this.name}

`; doc.flags = mergeObject(doc.flags ?? {}, { [moduleName]: { powerEffect: true } }); - (doc.duration = { rounds: 99 }), (this.baseEffectDoc = doc); this.basePrimaryEffectDoc = doc; } diff --git a/src/module/powers/powers.js b/src/module/powers/powers.js index c0ede4d..0bb8ec5 100644 --- a/src/module/powers/powers.js +++ b/src/module/powers/powers.js @@ -52,6 +52,7 @@ import { ScryingEffect } from './scrying.js'; import { ShapeChangeEffect } from './shapeChange.js'; import { SlothSpeedEffect } from './slothSpeed.js'; import { SlumberEffect } from './slumber.js'; +import { SmiteEffect } from './smite.js'; const PowerClasses = { 'arcane-protection': ArcaneProtectionEffect, @@ -121,6 +122,7 @@ const PowerClasses = { sloth: SlothSpeedEffect, speed: SlothSpeedEffect, slumber: SlumberEffect, + smite: SmiteEffect, }; /* ---------------------------------------------------------------- */ diff --git a/src/module/powers/protection.js b/src/module/powers/protection.js index 9cd14e6..625e8ba 100644 --- a/src/module/powers/protection.js +++ b/src/module/powers/protection.js @@ -34,7 +34,6 @@ export class ProtectionEffect extends PowerEffect { await super.parseValues(); const doc = await PowerEffect.getStatus('SWADE.Protection', 'Protection', false); doc.flags = mergeObject(doc.flags ?? {}, { [moduleName]: { powerEffect: true } }); - (doc.duration = { rounds: 99 }), (this.baseEffectDoc = doc); this.data.effect = doc; } diff --git a/src/module/powers/smite.js b/src/module/powers/smite.js new file mode 100644 index 0000000..4c3e8bc --- /dev/null +++ b/src/module/powers/smite.js @@ -0,0 +1,88 @@ +import { moduleName } from '../globals.js'; +import { PowerEffect } from './basePowers.js'; + +export class SmiteEffect extends PowerEffect { + get name() { + return 'Smite'; + } + + get duration() { + return 5; + } + + get icon() { + return 'systems/swade/assets/icons/status/status_smite.svg'; + } + + get isDamaging() { + return true; + } + + get basePowerPoints() { + return 2; + } + + get isTargeted() { + return true; + } + + get hasAdditionalRecipients() { + return true; + } + + get additionalRecipientCost() { + return 1; + } + + get modifiers() { + return [ + ...super.modifiers, + { + type: 'checkbox', + default: false, + name: 'Greater Smite', + id: 'greater', + value: 2, + epic: true, + effect: false, + }, + ]; + } + + async parseValues() { + await super.parseValues(); + this.baseDoc = await PowerEffect.getStatus('SWADE.Smite', 'Smite', false); + this.baseDoc.flags = mergeObject(this.baseDoc.flags ?? {}, { + [moduleName]: { powerEffect: true }, + }); + this.data.bonus = (this.data.raise ? 4 : 2) + (this.data.greater ? 2 : 0); + this.baseDoc.changes = [...this.getPrimaryEffectChanges()]; + } + + get basePrimaryEffect() { + return this.baseDoc; + } + + getPrimaryEffectChanges() { + return [ + ...super.getPrimaryEffectChanges(), + { + key: 'system.stats.globalMods.damage', + value: this.data.bonus, + priority: 0, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD, + }, + ]; + } + + get description() { + let text = ` +

Increase damage by ${this.data.bonus} on one weapon or load of ammunition. + `; + if (this.data.greater) { + text += 'The weapon is considered a Heavy Weapon.'; + } + text += '

'; + return super.description + text; + } +}