diff --git a/src/module/powers/objectReading.js b/src/module/powers/objectReading.js new file mode 100644 index 0000000..4c7005d --- /dev/null +++ b/src/module/powers/objectReading.js @@ -0,0 +1,66 @@ +import { PowerEffect } from './basePowers.js'; + +export class ObjectReadingEffect extends PowerEffect { + get name() { + return 'Object Reading'; + } + + get icon() { + return 'icons/skills/trades/academics-investigation-study-blue.webp'; + } + + get duration() { + return 0; + } + + get isTargeted() { + return false; + } + + get basePowerPoints() { + return 2; + } + + get usePrimaryEffect() { + return false; + } + + get isRaisable() { + return true; + } + + get modifiers() { + return [ + ...super.modifiers, + { + type: 'checkbox', + default: false, + name: 'Projection', + value: 2, + epic: true, + effect: false, + id: 'projection', + }, + ]; + } + + get description() { + let text = super.description; + text += `

Get visions of the past from an object. + `; + if (this.data.raise) { + text += `With a raise, the object yields specific and more actionable + information related to the caster's investigation.`; + } else { + text += `On success, the caster gets a vague impression of whatever + information they're looking for.`; + } + text += '

'; + if (this.data.projection) { + text += `

The caster projects the vision out into a space the size of a + small room, allowing anyone present to see and hear the events and examine + the projection.

`; + } + return text; + } +} diff --git a/src/module/powers/planarBinding.js b/src/module/powers/planarBinding.js new file mode 100644 index 0000000..02da036 --- /dev/null +++ b/src/module/powers/planarBinding.js @@ -0,0 +1,41 @@ +import { PowerEffect } from './basePowers.js'; + +export class PlanarBindingEffect extends PowerEffect { + get name() { + return 'Planar Binding'; + } + + get icon() { + return 'icons/magic/control/debuff-chains-orb-movement-blue.webp'; + } + + get duration() { + return 0; + } + + get isTargeted() { + return false; + } + + get basePowerPoints() { + return 8; + } + + get usePrimaryEffect() { + return false; + } + + get isRaisable() { + return false; + } + + get description() { + let text = + super.description + + ` +

Opposed roll vs the entity's Spirit. The entity is bound until it breaks + free or agrees to complete a task.

+ `; + return text; + } +} diff --git a/src/module/powers/planeShift.js b/src/module/powers/planeShift.js new file mode 100644 index 0000000..da2b4c1 --- /dev/null +++ b/src/module/powers/planeShift.js @@ -0,0 +1,77 @@ +import { PowerEffect } from './basePowers.js'; + +export class PlaneShiftEffect extends PowerEffect { + get name() { + return 'Plane Shift'; + } + + get icon() { + return 'icons/magic/movement/trail-streak-zigzag-yellow.webp'; + } + + get duration() { + return this.data.foe ? (this.data.raise ? 5 : 3) : 0; + } + + get isTargeted() { + return true; + } + + get usePrimaryEffect() { + return this.data.foe; + } + + get isDamaging() { + return true; + } + + get basePowerPoints() { + return 4; + } + + get hasAdditionalRecipients() { + return true; + } + + get additionalRecipientCost() { + return 1; + } + + get modifiers() { + return [ + ...super.modifiers, + { + name: 'Extra-Dimensional Space', + value: 2, + id: 'extra', + epic: true, + type: 'checkbox', + effect: false, + }, + { + name: 'Transport Foe', + value: 2, + id: 'foe', + epic: true, + type: 'checkbox', + effect: false, + }, + ]; + } + + get description() { + let text = super.description; + if (this.data.foe) { + text += `

Opposed roll vs Spirit to transport the foe to another plane for + ${this.duration} rounds, before it returns.

`; + } else if (this.data.extra) { + text += `

Transport the recipient to the caster's semi-permanant + extra-dimensional space, with basic necessities for 5 people.

`; + } else { + text += `

Transport the recipient to another dimension. If the desired + location is known, the recipient arrives within + [[/r ${this.data.raise ? 5 : 10}d10]] of the location.

`; + } + return text; + } +} diff --git a/src/module/powers/powers.js b/src/module/powers/powers.js index c267276..e148810 100644 --- a/src/module/powers/powers.js +++ b/src/module/powers/powers.js @@ -39,6 +39,9 @@ import { LocateEffect } from './locate.js'; import { MindLinkEffect } from './mindLink.js'; import { MindReadingEffect } from './mindReading.js'; import { MindWipeEffect } from './mindWipe.js'; +import { ObjectReadingEffect } from './objectReading.js'; +import { PlanarBindingEffect } from './planarBinding.js'; +import { PlaneShiftEffect } from './planeShift.js'; const PowerClasses = { 'arcane-protection': ArcaneProtectionEffect, @@ -91,6 +94,9 @@ const PowerClasses = { 'mind-link': MindLinkEffect, 'mind-reading': MindReadingEffect, 'mind-wipe': MindWipeEffect, + 'object-reading': ObjectReadingEffect, + 'planar-binding': PlanarBindingEffect, + 'plane-shift': PlaneShiftEffect, shrink: GrowthShrinkEffect, };