Extract calculation of spell price to its own file
This commit is contained in:
parent
a2e2aea78b
commit
473ec3a903
2 changed files with 52 additions and 50 deletions
|
@ -1,10 +1,10 @@
|
||||||
import { DS4Actor } from "../actor/actor";
|
import { DS4Actor } from "../actor/actor";
|
||||||
import { hoursPerDay, minutesPerHour, secondsPerMinute, secondsPerRound } from "../common/time-helpers";
|
|
||||||
import { DS4 } from "../config";
|
import { DS4 } from "../config";
|
||||||
import { createCheckRoll } from "../rolls/check-factory";
|
import { createCheckRoll } from "../rolls/check-factory";
|
||||||
import notifications from "../ui/notifications";
|
import notifications from "../ui/notifications";
|
||||||
import { AttackType, DS4ItemData, DS4SpellDataData, ItemType, TemporalUnit, UnitData } from "./item-data";
|
import { AttackType, DS4ItemData, ItemType } from "./item-data";
|
||||||
import { DS4ItemPreparedData } from "./item-prepared-data";
|
import { DS4ItemPreparedData } from "./item-prepared-data";
|
||||||
|
import { calculateSpellPrice } from "./type-specific-helpers/spell";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Item class for DS4
|
* The Item class for DS4
|
||||||
|
@ -29,57 +29,10 @@ export class DS4Item extends Item<DS4ItemData, DS4ItemPreparedData> {
|
||||||
this.data.data.rollable = false;
|
this.data.data.rollable = false;
|
||||||
}
|
}
|
||||||
if (this.data.type === "spell") {
|
if (this.data.type === "spell") {
|
||||||
this.data.data.price = this.calculateSpellPrice(this.data.data);
|
this.data.data.price = calculateSpellPrice(this.data.data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected calculateSpellPrice(data: DS4SpellDataData): number | null {
|
|
||||||
const spellPriceFactor = DS4Item.calculateSpellPriceFactor(data.cooldownDuration);
|
|
||||||
const baseSpellPrices = [
|
|
||||||
data.minimumLevels.healer !== null ? 10 + (data.minimumLevels.healer - 1) * 35 : null,
|
|
||||||
data.minimumLevels.wizard !== null ? 10 + (data.minimumLevels.wizard - 1) * 50 : null,
|
|
||||||
data.minimumLevels.sorcerer !== null ? 10 + (data.minimumLevels.sorcerer - 1) * 65 : null,
|
|
||||||
].filter((baseSpellPrice: number | null): baseSpellPrice is number => baseSpellPrice !== null);
|
|
||||||
const baseSpellPrice = Math.min(...baseSpellPrices);
|
|
||||||
return baseSpellPrice === Infinity ? null : baseSpellPrice * spellPriceFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static calculateSpellPriceFactor(temporalData: UnitData<TemporalUnit>): number {
|
|
||||||
let days: number;
|
|
||||||
if (Number.isNumeric(temporalData.value)) {
|
|
||||||
switch (temporalData.unit) {
|
|
||||||
case "days": {
|
|
||||||
days = temporalData.value;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "hours": {
|
|
||||||
days = temporalData.value / hoursPerDay;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "minutes": {
|
|
||||||
days = temporalData.value / (hoursPerDay * minutesPerHour);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "rounds": {
|
|
||||||
days = (temporalData.value * secondsPerRound) / (hoursPerDay * minutesPerHour * secondsPerMinute);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch (temporalData.unit) {
|
|
||||||
case "days": {
|
|
||||||
days = 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
days = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Math.clamped(Math.floor(days), 0, 2) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
isNonEquippedEuipable(): boolean {
|
isNonEquippedEuipable(): boolean {
|
||||||
return "equipped" in this.data.data && !this.data.data.equipped;
|
return "equipped" in this.data.data && !this.data.data.equipped;
|
||||||
}
|
}
|
||||||
|
|
49
src/module/item/type-specific-helpers/spell.ts
Normal file
49
src/module/item/type-specific-helpers/spell.ts
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
import { hoursPerDay, minutesPerHour, secondsPerMinute, secondsPerRound } from "../../common/time-helpers";
|
||||||
|
import { DS4SpellDataData, TemporalUnit, UnitData } from "../item-data";
|
||||||
|
|
||||||
|
export function calculateSpellPrice(data: DS4SpellDataData): number | null {
|
||||||
|
const spellPriceFactor = calculateSpellPriceFactor(data.cooldownDuration);
|
||||||
|
const baseSpellPrices = [
|
||||||
|
data.minimumLevels.healer !== null ? 10 + (data.minimumLevels.healer - 1) * 35 : null,
|
||||||
|
data.minimumLevels.wizard !== null ? 10 + (data.minimumLevels.wizard - 1) * 50 : null,
|
||||||
|
data.minimumLevels.sorcerer !== null ? 10 + (data.minimumLevels.sorcerer - 1) * 65 : null,
|
||||||
|
].filter((baseSpellPrice: number | null): baseSpellPrice is number => baseSpellPrice !== null);
|
||||||
|
const baseSpellPrice = Math.min(...baseSpellPrices);
|
||||||
|
return baseSpellPrice === Infinity ? null : baseSpellPrice * spellPriceFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
function calculateSpellPriceFactor(temporalData: UnitData<TemporalUnit>): number {
|
||||||
|
let days: number;
|
||||||
|
if (Number.isNumeric(temporalData.value)) {
|
||||||
|
switch (temporalData.unit) {
|
||||||
|
case "days": {
|
||||||
|
days = temporalData.value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "hours": {
|
||||||
|
days = temporalData.value / hoursPerDay;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "minutes": {
|
||||||
|
days = temporalData.value / (hoursPerDay * minutesPerHour);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "rounds": {
|
||||||
|
days = (temporalData.value * secondsPerRound) / (hoursPerDay * minutesPerHour * secondsPerMinute);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (temporalData.unit) {
|
||||||
|
case "days": {
|
||||||
|
days = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
days = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Math.clamped(Math.floor(days), 0, 2) + 1;
|
||||||
|
}
|
Loading…
Reference in a new issue