81 lines
1.6 KiB
TypeScript
81 lines
1.6 KiB
TypeScript
export function getProgress(min: number, mid: number, max: number) {
|
|
if (max === min) return 100
|
|
const diff = max - min
|
|
const progress = mid - min
|
|
|
|
return progress / diff * 100
|
|
}
|
|
|
|
export function devide(num: number, num2: number) {
|
|
if (num2 === 0) return num
|
|
|
|
return num / num2
|
|
}
|
|
|
|
export function floorLevel(level: number, base: number) {
|
|
const extra = level % base
|
|
|
|
if (extra === 0) {
|
|
return level
|
|
}
|
|
|
|
return level - extra
|
|
}
|
|
|
|
export function concatStatsArray<T extends Record<string, number>>(keys: (keyof T)[], ...stats: T[]) {
|
|
const base: Record<string, number> = {}
|
|
for (const k of keys) base[k as string] = 0
|
|
for (const s of stats) {
|
|
for (const k of keys) {
|
|
base[k as string] += s[k] ?? 0
|
|
}
|
|
}
|
|
return base as T
|
|
}
|
|
|
|
export function romanize(num: number) {
|
|
if (!Number.isFinite(num)) return "NaN"
|
|
const digits = Math.trunc(num).toString().split("")
|
|
const key = [
|
|
"",
|
|
"C",
|
|
"CC",
|
|
"CCC",
|
|
"CD",
|
|
"D",
|
|
"DC",
|
|
"DCC",
|
|
"DCCC",
|
|
"CM",
|
|
"",
|
|
"X",
|
|
"XX",
|
|
"XXX",
|
|
"XL",
|
|
"L",
|
|
"LX",
|
|
"LXX",
|
|
"LXXX",
|
|
"XC",
|
|
"",
|
|
"I",
|
|
"II",
|
|
"III",
|
|
"IV",
|
|
"V",
|
|
"VI",
|
|
"VII",
|
|
"VIII",
|
|
"IX"
|
|
] as const
|
|
|
|
let roman = ""
|
|
let i = 3
|
|
while (i--) {
|
|
const idx = Number(digits.pop()) + i * 10
|
|
roman = (key[idx] || "") + roman
|
|
}
|
|
const thousands = Number(digits.join(""))
|
|
return "M".repeat(thousands) + roman
|
|
}
|