This also allows to assign a spell to multiple spell groups, which is the case for many spells in the SRD. Additionally, this makes many small improvements and fixes to the provided spell compendium.
65 lines
2.5 KiB
TypeScript
65 lines
2.5 KiB
TypeScript
// SPDX-FileCopyrightText: 2022 Johannes Loher
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import { getGame } from "../../helpers";
|
|
import { createCheckRoll } from "../../rolls/check-factory";
|
|
import notifications from "../../ui/notifications";
|
|
import { DS4Item } from "../item";
|
|
import { calculateSpellPrice } from "./calculate-spell-price";
|
|
|
|
export class DS4Spell extends DS4Item {
|
|
override prepareDerivedData(): void {
|
|
this.data.data.rollable = this.data.data.equipped;
|
|
this.data.data.price = calculateSpellPrice(this.data.data);
|
|
}
|
|
|
|
override async roll(options: { speaker?: { token?: TokenDocument; alias?: string } } = {}): Promise<void> {
|
|
const game = getGame();
|
|
|
|
if (!this.data.data.equipped) {
|
|
return notifications.warn(
|
|
game.i18n.format("DS4.WarningItemMustBeEquippedToBeRolled", {
|
|
name: this.name,
|
|
id: this.id,
|
|
type: this.data.type,
|
|
}),
|
|
);
|
|
}
|
|
|
|
if (!this.actor) {
|
|
throw new Error(game.i18n.format("DS4.ErrorCannotRollUnownedItem", { name: this.name, id: this.id }));
|
|
}
|
|
|
|
const ownerDataData = this.actor.data.data;
|
|
const hasComplexModifier = this.data.data.spellModifier.complex !== "";
|
|
if (hasComplexModifier === undefined) {
|
|
notifications.info(
|
|
game.i18n.format("DS4.InfoManuallyEnterSpellModifier", {
|
|
name: this.name,
|
|
spellModifier: this.data.data.spellModifier.complex,
|
|
}),
|
|
);
|
|
}
|
|
const spellType = this.data.data.spellType;
|
|
const checkTargetNumber =
|
|
ownerDataData.combatValues[spellType].total +
|
|
(hasComplexModifier ? 0 : this.data.data.spellModifier.numerical);
|
|
|
|
const speaker = ChatMessage.getSpeaker({ actor: this.actor, ...options.speaker });
|
|
await createCheckRoll(checkTargetNumber, {
|
|
rollMode: game.settings.get("core", "rollMode"),
|
|
maximumCoupResult: ownerDataData.rolling.maximumCoupResult,
|
|
minimumFumbleResult: ownerDataData.rolling.minimumFumbleResult,
|
|
flavor: "DS4.ItemSpellCheckFlavor",
|
|
flavorData: { actor: speaker.alias ?? this.actor.name, spell: this.name },
|
|
speaker,
|
|
});
|
|
|
|
Hooks.callAll("ds4.rollItem", this);
|
|
}
|
|
}
|
|
|
|
export interface DS4Spell {
|
|
data: foundry.data.ItemData & { type: "spell"; _source: { type: "spell" } };
|
|
}
|