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>(keys: (keyof T)[], ...stats: T[]) { const base: Record = {} 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 }