import { PowerEffect } from './basePowers.js'; export class GrowthShrinkEffect extends PowerEffect { get name() { return 'Growth/Shrink'; } get icon() { return 'icons/magic/control/silhouette-grow-shrink-tan.webp'; } get basePowerPoints() { return 0; } get duration() { return this?.data?.duration ? 50 : 5; } get extraDescription() { const target = this.targets?.[0]; let text = super.extraDescription + '
Minimum Size is -2. '; if (target) { text += `${target.name} is of Size ${target.actor.system.stats.size}. `; } text += `Select the number of Size steps to change the target. 2 points per step. Negative is shrink, positive is growth.
`; return text; } get isTargeted() { return true; } get oneTarget() { return true; } get isRaisable() { return false; } get modifiers() { const curSize = this.targets?.[0]?.actor?.system?.stats?.size ?? 0; const minSteps = -2 - curSize; return [ ...super.modifiers, { name: 'Size Steps', default: 1, type: 'number', min: minSteps, value: 0, id: 'steps', epic: false, effect: false, }, { name: 'Duration', id: 'duration', value: 2, type: 'checkbox', default: false, epic: true, effect: false, }, { name: 'Power', id: 'power', value: 2, type: 'checkbox', default: false, epic: true, effect: false, }, ]; } async parseValues() { await super.parseValues(); const steps = this.data.steps; const curSize = this.targets?.[0]?.actor?.system?.stats?.size ?? 0; const minSteps = -2 - curSize; this.data.steps = Math.max(steps, minSteps); } get powerPoints() { return super.powerPoints + Math.abs(this.data.steps) * 2; } getPrimaryEffectChanges() { const steps = this.data.steps; const changes = super.getPrimaryEffectChanges(); if (steps === 0) { return changes; } changes.push({ key: 'system.stats.size', value: steps, priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD, }); if (steps < 0 && this.data.power) { changes.push({ key: 'system.stats.toughness.value', value: steps * -1, priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD, }); } else { changes.push({ key: 'system.attributes.strength.die.sides', value: steps * 2, priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD, }); } return changes; } get effectName() { if (this.data.steps >= 0) { return 'Growth'; } return 'Shrink'; } get description() { let text = super.description; if (this.data.steps >= 0) { text += `Grow the target by ${this.data.steps} steps.
`; } else { text += `Shrink the target by ${this.data.steps} steps`; if (this.data.power) { text += ' while retaining Strength and Toughness'; } text += '.
'; } return text; } }