add puppet
This commit is contained in:
parent
864acdd722
commit
e0cd1c640c
@ -43,6 +43,7 @@ import { ObjectReadingEffect } from './objectReading.js';
|
|||||||
import { PlanarBindingEffect } from './planarBinding.js';
|
import { PlanarBindingEffect } from './planarBinding.js';
|
||||||
import { PlaneShiftEffect } from './planeShift.js';
|
import { PlaneShiftEffect } from './planeShift.js';
|
||||||
import { ProtectionEffect } from './protection.js';
|
import { ProtectionEffect } from './protection.js';
|
||||||
|
import { PuppetEffect } from './puppet.js';
|
||||||
|
|
||||||
const PowerClasses = {
|
const PowerClasses = {
|
||||||
'arcane-protection': ArcaneProtectionEffect,
|
'arcane-protection': ArcaneProtectionEffect,
|
||||||
@ -99,6 +100,7 @@ const PowerClasses = {
|
|||||||
'planar-binding': PlanarBindingEffect,
|
'planar-binding': PlanarBindingEffect,
|
||||||
'plane-shift': PlaneShiftEffect,
|
'plane-shift': PlaneShiftEffect,
|
||||||
protection: ProtectionEffect,
|
protection: ProtectionEffect,
|
||||||
|
puppet: PuppetEffect,
|
||||||
shrink: GrowthShrinkEffect,
|
shrink: GrowthShrinkEffect,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
87
src/module/powers/puppet.js
Normal file
87
src/module/powers/puppet.js
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
import { PowerEffect } from './basePowers.js';
|
||||||
|
|
||||||
|
export class PuppetEffect extends PowerEffect {
|
||||||
|
get name() {
|
||||||
|
return 'Puppet';
|
||||||
|
}
|
||||||
|
|
||||||
|
get duration() {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
get icon() {
|
||||||
|
return 'icons/magic/control/control-influence-puppet.webp';
|
||||||
|
}
|
||||||
|
|
||||||
|
get hasAdditionalRecipients() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
get additionalRecipientCost() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
get basePowerPoints() {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
get isTargeted() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
get modifiers() {
|
||||||
|
const mods = super.modifiers;
|
||||||
|
mods.push({
|
||||||
|
name: 'Strong',
|
||||||
|
type: 'checkbox',
|
||||||
|
id: 'strong',
|
||||||
|
value: 2,
|
||||||
|
epic: false,
|
||||||
|
effect: false,
|
||||||
|
});
|
||||||
|
return mods;
|
||||||
|
}
|
||||||
|
|
||||||
|
get isRaisable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
get primaryEffectButtons() {
|
||||||
|
const mods = [];
|
||||||
|
if (this.data.strong) {
|
||||||
|
mods.push({ label: 'Strong', value: -2 });
|
||||||
|
}
|
||||||
|
return [
|
||||||
|
...super.primaryEffectButtons,
|
||||||
|
{
|
||||||
|
label: `Resist (Spirit${this.data.strong ? ' -2' : ''})`,
|
||||||
|
type: 'trait',
|
||||||
|
rollType: 'attribute',
|
||||||
|
rollDesc: 'Spirit',
|
||||||
|
flavor: 'Resist Puppet after unreasonable command',
|
||||||
|
mods,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
get description() {
|
||||||
|
let text =
|
||||||
|
super.description +
|
||||||
|
`
|
||||||
|
<p>
|
||||||
|
Opposed roll vs the caster's Spirit. Success means the victim obeys
|
||||||
|
commands, but won't harm himself or those he cares about, including by
|
||||||
|
inaction. With a raise, the target will do so, but gets a free action
|
||||||
|
Spirit roll ${this.data.strong ? '(at -2)' : ''} to resist that
|
||||||
|
particular command, with a raise meaning he breaks the controller's hold
|
||||||
|
and the power ends.
|
||||||
|
</p>
|
||||||
|
`;
|
||||||
|
if (this.data.strong) {
|
||||||
|
text += `<p>Spirit rolls to resist are at -2. The caster may also use
|
||||||
|
<em>mind link</em> on the target to extend controll to any distance,
|
||||||
|
even out of sight.</p>`;
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user