add stun and summons part 1
This commit is contained in:
parent
ac70a99b99
commit
4bdd6176e8
@ -55,6 +55,7 @@ import { SlumberEffect } from './slumber.js';
|
||||
import { SmiteEffect } from './smite.js';
|
||||
import { SoundSilenceEffect } from './soundSilence.js';
|
||||
import { SpeakLanguageEffect } from './speakLanguage.js';
|
||||
import { StunEffect } from './stun.js';
|
||||
|
||||
const PowerClasses = {
|
||||
'arcane-protection': ArcaneProtectionEffect,
|
||||
@ -130,6 +131,7 @@ const PowerClasses = {
|
||||
'sound-silence': SoundSilenceEffect,
|
||||
sound: SoundSilenceEffect,
|
||||
'speak-language': SpeakLanguageEffect,
|
||||
stun: StunEffect,
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
65
src/module/powers/stun.js
Normal file
65
src/module/powers/stun.js
Normal file
@ -0,0 +1,65 @@
|
||||
import { PowerEffect } from './basePowers.js';
|
||||
|
||||
export class StunEffect extends PowerEffect {
|
||||
get name() {
|
||||
return 'Confusion';
|
||||
}
|
||||
|
||||
get icon() {
|
||||
return 'icons/magic/control/hypnosis-mesmerism-swirl.webp';
|
||||
}
|
||||
|
||||
get duration() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
get isTargeted() {
|
||||
return true;
|
||||
}
|
||||
|
||||
get usePrimaryEffect() {
|
||||
return false;
|
||||
}
|
||||
|
||||
get basePowerPoints() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
get hasAoe() {
|
||||
return true;
|
||||
}
|
||||
|
||||
get modifiers() {
|
||||
const mods = super.modifiers;
|
||||
mods.push({
|
||||
type: 'select',
|
||||
default: 'none',
|
||||
name: 'Area of Effect',
|
||||
id: 'aoe',
|
||||
epic: false,
|
||||
choices: {
|
||||
none: 'None',
|
||||
mbt: 'Medium Blast Template',
|
||||
lbt: 'Large Blast Template',
|
||||
},
|
||||
effects: { none: null, mbt: null, lbt: null },
|
||||
values: { none: 0, mbt: 2, lbt: 3 },
|
||||
});
|
||||
return mods;
|
||||
}
|
||||
|
||||
get description() {
|
||||
return (
|
||||
super.description +
|
||||
`
|
||||
<p>The target(s) must make a Vigor roll${this.data.raise ? ' at -2' : ''}
|
||||
or be Stunned.</p>`
|
||||
);
|
||||
}
|
||||
|
||||
async createSecondaryEffects(maintId) {
|
||||
const docs = await super.createSecondaryEffects(maintId);
|
||||
docs.push(await PowerEffect.getStatus('SWADE.Stunned', 'Stunned', false));
|
||||
return docs;
|
||||
}
|
||||
}
|
||||
186
src/module/powers/summon.js
Normal file
186
src/module/powers/summon.js
Normal file
@ -0,0 +1,186 @@
|
||||
/* globals Portal */
|
||||
import { ActorFolderEffect } from './basePowers.js';
|
||||
|
||||
class BaseSummonEffect extends ActorFolderEffect {
|
||||
get name() {
|
||||
return 'Base Summon';
|
||||
}
|
||||
|
||||
get actorFolderBase() {
|
||||
return 'Summonables';
|
||||
}
|
||||
|
||||
get values() {
|
||||
return {};
|
||||
}
|
||||
|
||||
get hasIncreasedTrait() {
|
||||
return true;
|
||||
}
|
||||
|
||||
get summonCount() {
|
||||
return 1 + (this?.data?.additional ?? 0);
|
||||
}
|
||||
|
||||
get additionalName() {
|
||||
return 'Additional Allies';
|
||||
}
|
||||
|
||||
get additionalDesc() {
|
||||
return '(half base cost (round up))';
|
||||
}
|
||||
|
||||
get additionalEpic() {
|
||||
return true;
|
||||
}
|
||||
|
||||
get modifiers() {
|
||||
const mods = super.modifiers;
|
||||
if (this.hasIncreasedTrait) {
|
||||
mods.push({
|
||||
type: 'checkbox',
|
||||
name: 'Increased Trait (+1 per trait)',
|
||||
id: 'increasedTrait',
|
||||
value: 0,
|
||||
effect: false,
|
||||
epic: false,
|
||||
default: false,
|
||||
});
|
||||
}
|
||||
mods.push({
|
||||
type: 'number',
|
||||
name: `${this.additionalName} ${this.additionalDesc}`,
|
||||
value: 0,
|
||||
id: 'additionalAllies',
|
||||
default: 0,
|
||||
epic: this.additionalEpic,
|
||||
effect: false,
|
||||
});
|
||||
mods.push({
|
||||
type: 'checkbox',
|
||||
name: 'Mind Rider',
|
||||
id: 'mindRider',
|
||||
value: 1,
|
||||
effect: false,
|
||||
epic: false,
|
||||
default: false,
|
||||
});
|
||||
return mods;
|
||||
}
|
||||
|
||||
actorValue(actor) {
|
||||
const values = this.values;
|
||||
if (actor.name.toLowerCase() in values) {
|
||||
return values[actor.name.toLowerCase()];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
async prepIncreasedTrait() {
|
||||
if (!(this.hasIncreasedTrait && this?.data?.increasedTrait)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
async parseValues() {
|
||||
await super.parseValues();
|
||||
this.data.actorUpdates = {
|
||||
name: `${this.source.actor.name}'s summoned ${this.targetActor.name}`,
|
||||
system: {
|
||||
wildcard: this.source.actor.system.wildcard,
|
||||
attributes: {},
|
||||
},
|
||||
};
|
||||
this.data.tokenUpdates = {
|
||||
actorLink: false,
|
||||
name: `${this.source.name}'s ${this.targetActor.prototypeToken.name}`,
|
||||
disposition: this.source.document.disposition,
|
||||
sight: {
|
||||
enabled: true,
|
||||
},
|
||||
};
|
||||
this.data.embeddedUpdates = {
|
||||
ActiveEffect: {},
|
||||
Item: {},
|
||||
};
|
||||
await this.prepIncreasedTrait();
|
||||
}
|
||||
|
||||
get spawnUpdates() {
|
||||
const updates = super.spawnUpdates;
|
||||
mergeObject(updates.actor, this.data.actorUpdates);
|
||||
mergeObject(updates.token, this.data.tokenUpdates);
|
||||
mergeObject(updates.embedded, this.data.embeddedUpdates);
|
||||
return updates;
|
||||
}
|
||||
|
||||
async spawn() {
|
||||
const spawned = await new Portal()
|
||||
.addCreature(this.targetTokenDoc)
|
||||
.texture(this.targetTokenDoc.texture.src)
|
||||
.spawn();
|
||||
return spawned;
|
||||
}
|
||||
}
|
||||
|
||||
export class SummonAllyEffect extends BaseSummonEffect() {
|
||||
get name() {
|
||||
return 'Summon Ally';
|
||||
}
|
||||
|
||||
get basePowerPoints() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
get values() {
|
||||
return {
|
||||
attendant: 1,
|
||||
bodyguard: 3,
|
||||
sentinel: 5,
|
||||
'mirror self': 7,
|
||||
};
|
||||
}
|
||||
|
||||
get _edges() {
|
||||
const template = this.data.actors['combat-edge_template'];
|
||||
if (!template) {
|
||||
return [];
|
||||
}
|
||||
this.data.combatEdges = template.items.filter((i) => i.type === 'edge');
|
||||
const edges = this.data.CombatEdges.map((i) => i.name);
|
||||
edges.sort();
|
||||
edges.unshift('None');
|
||||
const choices = {};
|
||||
const effects = {};
|
||||
const values = {};
|
||||
edges.forEach((edge) => {
|
||||
choices[edge] = edge;
|
||||
effects[edge] = null;
|
||||
values[edge] = edge === 'None' ? 0 : 1;
|
||||
});
|
||||
return { choices, effects, values };
|
||||
}
|
||||
|
||||
get modifiers() {
|
||||
const mods = super.modifiers;
|
||||
mods.push({
|
||||
type: 'checkbox',
|
||||
default: false,
|
||||
name: 'Combat Edge (+1 per edge, up to 3)',
|
||||
id: 'combatEdge',
|
||||
value: 0,
|
||||
epic: false,
|
||||
effect: false,
|
||||
});
|
||||
mods.push({
|
||||
type: 'checkbox',
|
||||
default: false,
|
||||
name: 'Flight',
|
||||
id: 'flight',
|
||||
value: 2,
|
||||
epic: false,
|
||||
effect: false,
|
||||
});
|
||||
return mods;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user