add lock/unlock, magic jar, shield other

This commit is contained in:
Mike Bloy 2024-06-08 23:36:15 -05:00
parent fe0e889c02
commit c68c55bfc7
4 changed files with 137 additions and 0 deletions

View File

@ -0,0 +1,71 @@
import { PowerEffect } from './basePowers.js';
export class LockUnlockEffect extends PowerEffect {
get name() {
return 'Lock/Unlock';
}
get duration() {
return 0;
}
get icon() {
return 'icons/sundries/misc/lock-open-yellow.webp';
}
get isTargeted() {
return false;
}
get basePowerPoints() {
return 1;
}
get usePrimaryEffect() {
return false;
}
get modifiers() {
return [
...super.modifiers,
{
sortOrder: -2,
name: 'Lock or Unlock?',
id: 'direction',
type: 'radio',
default: 'Lock',
epic: false,
choices: { Lock: 'Lock', Unlock: 'Unlock' },
effects: { Lock: null, Unlock: null },
values: { Lock: 0, Unlock: 0 },
},
];
}
get effectName() {
return this.data.direction;
}
get description() {
let text = super.description;
if (this.data.direction === 'Lock') {
text += `<p>Magically seal a door, window, container, envelope, etc. Any
attempt to open it suffers a -4 penalty, with a failure meaning that
character can't try again until they update their skill level.</p>`;
if (this.data.raise) {
text += `<p>With the raise, the item can only be opwned with the <em>unlock</em>
version of this power (with the above -4 penalty.</p>`;
}
text += `<p>The caster may set a passphrase. The portal opens for anyone
who speaks the passphrase, until the passphrase is spoken again.</p>`;
} else {
text += `<p>Unlock in place of Repair or Thievery, ignoring up to 4
points of penalties. `;
if (this.data.raise) {
text += `With a raise, it disarms any traps or alarms as well.`;
}
text += '</p>';
}
return text;
}
}

View File

@ -0,0 +1,38 @@
import { PowerEffect } from './basePowers.js';
export class MagicJarEffect extends PowerEffect {
get name() {
return 'MagicJar';
}
get duration() {
return 3000;
}
get icon() {
return 'icons/consumables/drinks/clay-jar-glowing-orange-blue.webp';
}
get isTargeted() {
return false;
}
get isDamaging() {
return false;
}
get basePowerPoints() {
return 5;
}
get usePrimaryEffect() {
return false;
}
get description() {
let text = super.description;
text += `<p>Transfer the caster's soul into an enchanted vessel. They may
move back and forth from the body to the jar if the body is within range.</p>`;
return text;
}
}

View File

@ -38,6 +38,8 @@ import { IntangibilityEffect } from './intangibility.js';
import { InvisibliltyEffect } from './invisibility.js';
import { LightDarknessEffect } from './lightdarkness.js';
import { LocateEffect } from './locate.js';
import { LockUnlockEffect } from './lockUnlock.js';
import { MagicJarEffect } from './magicJar.js';
import { MindLinkEffect } from './mindLink.js';
import { MindReadingEffect } from './mindReading.js';
import { MindWipeEffect } from './mindWipe.js';
@ -115,7 +117,11 @@ const PowerClasses = {
lightdarkness: LightDarknessEffect,
light: LightDarknessEffect,
locate: LocateEffect,
lock: LockUnlockEffect,
lockunlock: LockUnlockEffect,
'lock-unlock': LockUnlockEffect,
'lower-trait': BoostLowerTraitEffect,
'magic-jar': MagicJarEffect,
'mind-link': MindLinkEffect,
'mind-reading': MindReadingEffect,
'mind-wipe': MindWipeEffect,
@ -146,6 +152,7 @@ const PowerClasses = {
telekinesis: TelekinesisEffect,
teleport: TeleportEffect,
'time-stop': TimeStopEffect,
unlock: LockUnlockEffect,
'wall-walker': WallWalkerEffect,
'warriors-gift': WarriorsGiftEffect,
wish: WishEffect,

View File

@ -37,6 +37,22 @@ export class ProtectionEffect extends PowerEffect {
this.data.effect = doc;
}
get modifiers() {
return [
...super.modifiers,
{
type: 'checkbox',
name: 'Shield Other',
id: 'other',
value: 1,
effect: true,
epic: false,
icon: 'icons/magic/defensive/shield-barrier-flaming-diamond-blue-yellow.webp',
changes: '',
},
];
}
get basePrimaryEffect() {
this.data.effect.changes = this.getPrimaryEffectChanges();
return this.data.effect;
@ -55,6 +71,11 @@ export class ProtectionEffect extends PowerEffect {
<p>Grant the recipients 2 points of ${this.data.raise ? 'toughness' : 'armor'}
</p>
`;
if (this.data.other) {
text += `<p>If the protected creature is not the caster, and the protected
creature suffers wounds, the caster can take those wounds instead. If the
caster does this, they get a free reroll on the Soak roll, if one is attempted.</p>`;
}
return text;
}
}