Skip to content

Commit

Permalink
Implement custom damage types (foundryvtt#5223)
Browse files Browse the repository at this point in the history
  • Loading branch information
CarlosFdez committed Dec 29, 2022
1 parent bece42c commit 68d462f
Show file tree
Hide file tree
Showing 17 changed files with 519 additions and 255 deletions.
5 changes: 3 additions & 2 deletions src/global.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import { ModuleArt, registerModuleArt } from "@scripts/register-module-art";
import { remigrate } from "@scripts/system/remigrate";
import { CheckPF2e } from "@system/check";
import { EffectTracker } from "@system/effect-tracker";
import { HomebrewSettingsKey, HomebrewTag } from "@system/settings/homebrew";
import { CustomDamageData, HomebrewTag, HomebrewTraitSettingsKey } from "@system/settings/homebrew";
import { TextEditorPF2e } from "@system/text-editor";
import { sluggify } from "@util";
import { CombatantPF2e, EncounterPF2e } from "./module/encounter";
Expand Down Expand Up @@ -157,7 +157,8 @@ declare global {
get(module: "pf2e", setting: "campaignFeatSections"): FeatCategoryOptions[];

get(module: "pf2e", setting: "homebrew.weaponCategories"): HomebrewTag<"weaponCategories">[];
get(module: "pf2e", setting: HomebrewSettingsKey): HomebrewTag[];
get(module: "pf2e", setting: HomebrewTraitSettingsKey): HomebrewTag[];
get(module: "pf2e", setting: "homebrew.damageTypes"): CustomDamageData[];

get(module: "pf2e", setting: "compendiumBrowserPacks"): CompendiumBrowserSettings;
get(module: "pf2e", setting: "critFumbleButtons"): boolean;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { ActorSourcePF2e } from "@actor/data";
import { ItemSourcePF2e } from "@item/data";
import { HomebrewElements, HomebrewTag } from "@system/settings/homebrew";
import { HomebrewTag, HOMEBREW_TRAIT_KEYS } from "@system/settings/homebrew";
import { LocalizePF2e } from "@system/localize";
import { sluggify } from "@util";
import { MigrationBase } from "../base";

export class Migration674StableHomebrewTagIDs extends MigrationBase {
static override version = 0.674;

private homebrewKeys = deepClone(HomebrewElements.SETTINGS);
private homebrewKeys = deepClone(HOMEBREW_TRAIT_KEYS);

private homebrewTags = this.homebrewKeys.reduce(
(settings, key) => mergeObject(settings, { [key]: game.settings.get("pf2e", `homebrew.${key}`) }),
Expand Down
9 changes: 4 additions & 5 deletions src/module/system/damage/roll.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ class DamageInstance extends AbstractDamageRoll {
constructor(formula: string, data = {}, options?: RollOptions) {
super(formula, data, options);

const flavorIdentifiers = (this.options.flavor?.replace(/[^a-z,]/g, "").split(",") ?? []).map((f) => f.trim());
const flavorIdentifiers = this.options.flavor?.replace(/[^a-z,_-]/g, "").split(",") ?? [];
this.type = flavorIdentifiers.find((t): t is DamageType => setHasElement(DAMAGE_TYPES, t)) ?? "untyped";
this.persistent = flavorIdentifiers.includes("persistent") || flavorIdentifiers.includes("bleed");
}
Expand Down Expand Up @@ -260,13 +260,12 @@ class DamageInstance extends AbstractDamageRoll {
}

override get formula(): string {
const typeFlavor = game.i18n.localize(CONFIG.PF2E.damageRollFlavors[this.type] ?? this.type);
const damageType =
this.persistent && this.type !== "bleed"
? game.i18n.format("PF2E.Damage.RollFlavor.persistent", {
damageType: game.i18n.localize(`PF2E.Damage.RollFlavor.${this.type}`),
})
? game.i18n.format("PF2E.Damage.RollFlavor.persistent", { damageType: typeFlavor })
: this.type
? game.i18n.localize(`PF2E.Damage.RollFlavor.${this.type}`)
? typeFlavor
: "";
return [this.head.expression, damageType].join(" ").trim();
}
Expand Down
2 changes: 1 addition & 1 deletion src/module/system/damage/values.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ const DAMAGE_TYPES = new Set([
] as const);

/** Maps damage types to their damage category; these are the immutable base mappings used if there is no override. */
const BASE_DAMAGE_TYPES_TO_CATEGORIES: Readonly<Record<string, DamageCategory>> = {
const BASE_DAMAGE_TYPES_TO_CATEGORIES: Record<string, DamageCategory> = {
// The three default physical damage types.
bludgeoning: "physical",
piercing: "physical",
Expand Down
137 changes: 0 additions & 137 deletions src/module/system/settings/homebrew/cleanup-migration.ts

This file was deleted.

62 changes: 62 additions & 0 deletions src/module/system/settings/homebrew/data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { BaseWeaponType } from "@item";
import { MenuTemplateData, SettingsTemplateData } from "../menu";

const HOMEBREW_TRAIT_KEYS = [
"creatureTraits",
"featTraits",
"languages",
"magicSchools",
"spellTraits",
"weaponCategories",
"weaponGroups",
"baseWeapons",
"weaponTraits",
"equipmentTraits",
] as const;

/** Homebrew elements from some of the above records are propagated to related records */
const SECONDARY_TRAIT_RECORDS = {
creatureTraits: ["ancestryItemTraits"],
equipmentTraits: ["armorTraits", "consumableTraits"],
featTraits: ["actionTraits"],
weaponTraits: ["npcAttackTraits"],
} as const;

type HomebrewTraitKey = typeof HOMEBREW_TRAIT_KEYS[number];
type HomebrewKey = HomebrewTraitKey | "damageTypes";
type HomebrewTraitSettingsKey = `homebrew.${HomebrewTraitKey}`;

interface HomebrewTag<T extends HomebrewTraitKey = HomebrewTraitKey> {
id: T extends "baseWeapons"
? BaseWeaponType
: T extends Exclude<HomebrewTraitKey, "baseWeapons">
? keyof ConfigPF2e["PF2E"][T]
: never;
value: string;
}

type MainDamageCategories = "physical" | "energy";

interface CustomDamageData {
slug?: string;
label: string;
category: MainDamageCategories;
icon: string | null;
}

interface HomebrewElementsSheetData extends MenuTemplateData {
traitSettings: Record<string, SettingsTemplateData>;
damageCategories: Record<MainDamageCategories, string>;
customDamageTypes: CustomDamageData[];
}

export {
CustomDamageData,
HOMEBREW_TRAIT_KEYS,
HomebrewElementsSheetData,
HomebrewKey,
HomebrewTag,
HomebrewTraitKey,
HomebrewTraitSettingsKey,
SECONDARY_TRAIT_RECORDS,
};
Loading

0 comments on commit 68d462f

Please sign in to comment.