feat: only allow specific selectable values for the cooldown duration of spells
World data (including compendium packs) is migrated automatically. In order to also migrate packs provided by modules, you can use the following macro: ```js const pack = game.packs.get("<name-of-the-module>.<name-of-the-pack>"); game.ds4.migration.migrateCompendiumFromTo(pack, 4, 5); ```
This commit is contained in:
parent
73e2d44c55
commit
da1f6999eb
20 changed files with 558 additions and 876 deletions
|
@ -2,7 +2,7 @@
|
|||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import { DS4SpellDataSourceData, TemporalUnit, UnitData } from "../../../src/item/item-data-source";
|
||||
import { CooldownDuration, DS4SpellDataSourceData } from "../../../src/item/item-data-source";
|
||||
import { calculateSpellPrice } from "../../../src/item/type-specific-helpers/spell";
|
||||
|
||||
const defaultData: DS4SpellDataSourceData = {
|
||||
|
@ -23,10 +23,7 @@ const defaultData: DS4SpellDataSourceData = {
|
|||
value: "",
|
||||
unit: "custom",
|
||||
},
|
||||
cooldownDuration: {
|
||||
value: "",
|
||||
unit: "rounds",
|
||||
},
|
||||
cooldownDuration: "0r",
|
||||
minimumLevels: {
|
||||
healer: null,
|
||||
wizard: null,
|
||||
|
@ -167,65 +164,41 @@ function buildCombinedTestCases(): CombinedTestCase[] {
|
|||
}
|
||||
|
||||
describe("calculateSpellPrice", () => {
|
||||
const cooldownDurations: (UnitData<TemporalUnit> & { factor: number })[] = [
|
||||
{ value: "", unit: "rounds", factor: 1 },
|
||||
{ value: "foo", unit: "rounds", factor: 1 },
|
||||
{ value: "0", unit: "rounds", factor: 1 },
|
||||
{ value: "1", unit: "rounds", factor: 1 },
|
||||
{ value: "17279", unit: "rounds", factor: 1 },
|
||||
{ value: "17280", unit: "rounds", factor: 2 },
|
||||
{ value: "34559", unit: "rounds", factor: 2 },
|
||||
{ value: "34560", unit: "rounds", factor: 3 },
|
||||
|
||||
{ value: "", unit: "minutes", factor: 1 },
|
||||
{ value: "foo", unit: "minutes", factor: 1 },
|
||||
{ value: "0", unit: "minutes", factor: 1 },
|
||||
{ value: "1", unit: "minutes", factor: 1 },
|
||||
{ value: "1439", unit: "minutes", factor: 1 },
|
||||
{ value: "1440", unit: "minutes", factor: 2 },
|
||||
{ value: "2879", unit: "minutes", factor: 2 },
|
||||
{ value: "2880", unit: "minutes", factor: 3 },
|
||||
|
||||
{ value: "", unit: "hours", factor: 1 },
|
||||
{ value: "foo", unit: "hours", factor: 1 },
|
||||
{ value: "0", unit: "hours", factor: 1 },
|
||||
{ value: "1", unit: "hours", factor: 1 },
|
||||
{ value: "23", unit: "hours", factor: 1 },
|
||||
{ value: "24", unit: "hours", factor: 2 },
|
||||
{ value: "47", unit: "hours", factor: 2 },
|
||||
{ value: "48", unit: "hours", factor: 3 },
|
||||
|
||||
{ value: "", unit: "days", factor: 3 },
|
||||
{ value: "foo", unit: "days", factor: 3 },
|
||||
{ value: "0", unit: "days", factor: 1 },
|
||||
{ value: "1", unit: "days", factor: 2 },
|
||||
{ value: "2", unit: "days", factor: 3 },
|
||||
const cooldownDurations: { cooldownDuration: CooldownDuration; factor: number }[] = [
|
||||
{ cooldownDuration: "0r", factor: 1 },
|
||||
{ cooldownDuration: "1r", factor: 1 },
|
||||
{ cooldownDuration: "2r", factor: 1 },
|
||||
{ cooldownDuration: "5r", factor: 1 },
|
||||
{ cooldownDuration: "10r", factor: 1 },
|
||||
{ cooldownDuration: "100r", factor: 1 },
|
||||
{ cooldownDuration: "1d", factor: 2 },
|
||||
{ cooldownDuration: "d20d", factor: 3 },
|
||||
];
|
||||
|
||||
describe.each(cooldownDurations)("with cooldown duration set to $value $unit", ({ value, unit, factor }) => {
|
||||
const dataWithCooldownDuration = {
|
||||
...defaultData,
|
||||
cooldownDuration: {
|
||||
value,
|
||||
unit,
|
||||
},
|
||||
};
|
||||
describe.each(cooldownDurations)(
|
||||
"with cooldown duration set to $cooldownDuration",
|
||||
({ cooldownDuration, factor }) => {
|
||||
const dataWithCooldownDuration = {
|
||||
...defaultData,
|
||||
cooldownDuration,
|
||||
};
|
||||
|
||||
it.each(buildCombinedTestCases())(
|
||||
`returns ${factor} × $expected if the minimum leves are $minimumLevels`,
|
||||
({ minimumLevels, expected }) => {
|
||||
// given
|
||||
const data: DS4SpellDataSourceData = {
|
||||
...dataWithCooldownDuration,
|
||||
minimumLevels,
|
||||
};
|
||||
it.each(buildCombinedTestCases())(
|
||||
`returns ${factor} × $expected if the minimum leves are $minimumLevels`,
|
||||
({ minimumLevels, expected }) => {
|
||||
// given
|
||||
const data: DS4SpellDataSourceData = {
|
||||
...dataWithCooldownDuration,
|
||||
minimumLevels,
|
||||
};
|
||||
|
||||
// when
|
||||
const spellPrice = calculateSpellPrice(data);
|
||||
// when
|
||||
const spellPrice = calculateSpellPrice(data);
|
||||
|
||||
// then
|
||||
expect(spellPrice).toBe(expected !== null ? expected * factor : expected);
|
||||
},
|
||||
);
|
||||
});
|
||||
// then
|
||||
expect(spellPrice).toBe(expected !== null ? expected * factor : expected);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue