add spiritual weapon to smite
This commit is contained in:
parent
c68c55bfc7
commit
613552af4e
@ -33,6 +33,8 @@ function _hashCode(str) {
|
|||||||
export class PowerFormApplication extends FormApplication {
|
export class PowerFormApplication extends FormApplication {
|
||||||
constructor(powerEffect) {
|
constructor(powerEffect) {
|
||||||
super();
|
super();
|
||||||
|
const name = powerEffect.name.replaceAll(/[^a-zA-Z]/g, '');
|
||||||
|
this.options.id = `${this.options.id}${name}`;
|
||||||
this.powerEffect = powerEffect;
|
this.powerEffect = powerEffect;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -843,7 +845,9 @@ export class ActorFolderEffect extends PowerEffect {
|
|||||||
const collection = actor.getEmbeddedCollection(documentType);
|
const collection = actor.getEmbeddedCollection(documentType);
|
||||||
adds[documentType] = [];
|
adds[documentType] = [];
|
||||||
updates[documentType] = [];
|
updates[documentType] = [];
|
||||||
|
log('docType', documentType);
|
||||||
for (const newDocKey in newDocs[documentType]) {
|
for (const newDocKey in newDocs[documentType]) {
|
||||||
|
log('newDocKey', newDocKey);
|
||||||
const newDoc = newDocs[documentType][newDocKey].toObject();
|
const newDoc = newDocs[documentType][newDocKey].toObject();
|
||||||
const oldDoc = collection.find((doc) => this.#documentFinder(documentType, doc, newDoc));
|
const oldDoc = collection.find((doc) => this.#documentFinder(documentType, doc, newDoc));
|
||||||
if (newDoc.type === 'power' && newDoc?.system?.choiceSets?.length > 0) {
|
if (newDoc.type === 'power' && newDoc?.system?.choiceSets?.length > 0) {
|
||||||
|
|||||||
@ -1,5 +1,131 @@
|
|||||||
import { moduleName } from '../globals.js';
|
import { moduleName } from '../globals.js';
|
||||||
import { PowerEffect } from './basePowers.js';
|
import { PowerEffect } from './basePowers.js';
|
||||||
|
import { BaseSummonEffect } from './summonSupport.js';
|
||||||
|
|
||||||
|
class SpiritualWeaponEffect extends BaseSummonEffect {
|
||||||
|
get name() {
|
||||||
|
return 'Spiritual Weapon';
|
||||||
|
}
|
||||||
|
|
||||||
|
get icon() {
|
||||||
|
return 'icons/weapons/hammers/hammer-double-glowing-yellow.webp';
|
||||||
|
}
|
||||||
|
|
||||||
|
get duration() {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
get basePowerPoints() {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
get modifiers() {
|
||||||
|
const arcaneSkillSwids = ['faith', 'spellcasting', 'performance', 'alchemy'];
|
||||||
|
const choices = {};
|
||||||
|
const values = {};
|
||||||
|
const effects = {};
|
||||||
|
const skillList = this.source.actor.items.filter(
|
||||||
|
(i) => i.type === 'skill' && arcaneSkillSwids.includes(i.system.swid),
|
||||||
|
);
|
||||||
|
for (const skill of skillList.map((s) => s.name)) {
|
||||||
|
choices[skill] = skill;
|
||||||
|
values[skill] = 0;
|
||||||
|
effects[skill] = null;
|
||||||
|
}
|
||||||
|
return [
|
||||||
|
...super.modifiers,
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
name: 'Arcane Skill',
|
||||||
|
id: 'arcaneSkill',
|
||||||
|
choices,
|
||||||
|
values,
|
||||||
|
effects,
|
||||||
|
epic: false,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
actorValue(actor) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseValuesPre() {
|
||||||
|
await super.parseValuesPre();
|
||||||
|
this.data.primaryEffectChanges = [];
|
||||||
|
this.data.actorUpdates = {
|
||||||
|
name: `${this.source.actor.name}'s ${this.targetActor.name}`,
|
||||||
|
system: {
|
||||||
|
wildcard: this.source.actor.system.wildcard,
|
||||||
|
attributes: {
|
||||||
|
spirit: {
|
||||||
|
die: {
|
||||||
|
sides: this.source.actor.system.attributes.spirit.die.sides,
|
||||||
|
modifier: this.source.actor.system.attributes.spirit.die.modifier,
|
||||||
|
},
|
||||||
|
'wild-die': {
|
||||||
|
sides: this.source.actor.system.attributes.spirit['wild-die'].sides,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
this.data.tokenUpdates = {
|
||||||
|
disposition: this.source.document.disposition,
|
||||||
|
sight: { enabled: false },
|
||||||
|
actorLink: false,
|
||||||
|
name: `${this.source.name}'s ${this.targetActor.name}`,
|
||||||
|
};
|
||||||
|
const weaponId = this.targetActor.items.find((i) => i.type === 'weapon' && i.system.swid === 'spiritual-weapon').id;
|
||||||
|
const weaponDoc = await this.targetActor.getEmbeddedDocument('Item', weaponId).clone();
|
||||||
|
const arcaneSkillId = this.source.actor.items.find(
|
||||||
|
(i) => i.type === 'skill' && i.name === this.data.arcaneSkill,
|
||||||
|
).id;
|
||||||
|
const arcaneDoc = await this.source.actor.getEmbeddedDocument('Item', arcaneSkillId).clone();
|
||||||
|
weaponDoc.updateSource({
|
||||||
|
system: {
|
||||||
|
damage: this.data.raise ? '@spi+d6' : '@spi+d4',
|
||||||
|
actions: {
|
||||||
|
trait: arcaneDoc.name,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
this.data.embeddedUpdates = {
|
||||||
|
ActiveEffect: {},
|
||||||
|
Item: {
|
||||||
|
[weaponDoc.name]: weaponDoc,
|
||||||
|
[arcaneDoc.name]: arcaneDoc,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
get summonCount() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
getPrimaryEffectChanges() {
|
||||||
|
return [...super.getPrimaryEffectChanges(), ...this.data.primaryEffectChanges];
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
get description() {
|
||||||
|
let text = super.description;
|
||||||
|
text += `<p>This version of <em>smite</em> summons an enchanted weapon made
|
||||||
|
of energy within Smarts. The caster can move the spiritual weapon up to 5"
|
||||||
|
and attack with it as a free action, using their ${this.data.arcaneSkill}
|
||||||
|
in place of fighting. The weapon does ${this.data.raise ? 'Spr+d6' : 'Spr+d4'}
|
||||||
|
damage.</p>`;
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class SmiteEffect extends PowerEffect {
|
export class SmiteEffect extends PowerEffect {
|
||||||
get name() {
|
get name() {
|
||||||
@ -46,6 +172,15 @@ export class SmiteEffect extends PowerEffect {
|
|||||||
epic: true,
|
epic: true,
|
||||||
effect: false,
|
effect: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: 'checkbox',
|
||||||
|
default: false,
|
||||||
|
name: 'Spiritual Weapon',
|
||||||
|
id: 'spiritualWeapon',
|
||||||
|
value: 2,
|
||||||
|
epic: true,
|
||||||
|
effect: false,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,6 +210,33 @@ export class SmiteEffect extends PowerEffect {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async applySpiritualWeapon() {
|
||||||
|
const runner = new SpiritualWeaponEffect(this.source, []);
|
||||||
|
runner.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
async apply() {
|
||||||
|
if (this.data.spiritualWeapon) {
|
||||||
|
await this.applySpiritualWeapon();
|
||||||
|
} else {
|
||||||
|
super.apply();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async chatMessage() {
|
||||||
|
if (this.data.spiritualWeapon) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await super.chatMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
async sideEffects() {
|
||||||
|
if (this.data.spiritualWeapon) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await super.sideEffects();
|
||||||
|
}
|
||||||
|
|
||||||
get description() {
|
get description() {
|
||||||
let text = `
|
let text = `
|
||||||
<p>Increase damage by ${this.data.bonus} on one weapon or load of ammunition.
|
<p>Increase damage by ${this.data.bonus} on one weapon or load of ammunition.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user