aboutsummaryrefslogtreecommitdiff
path: root/src/cleaners/skyblock/skills.ts
blob: 9076a820baeedeb1642fdb34be46573f29dc09a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import { fetchSkillXp, fetchSkillXpEasier } from '../../constants'

export interface Skill {
	name: string
	xp: number
	level: number

	maxLevel: number

	levelXp: number
	levelXpRequired: number
}

// the highest level you can have in each skill
// numbers taken from https://hypixel-skyblock.fandom.com/wiki/Skills
// maybe these should be moved to skyblock-constants?
const skillsMaxLevel: { [ key: string ]: number } = {
	farming: 60,
	mining: 60,
	combat: 60,
	foraging: 50,
	fishing: 50,
	enchanting: 60,
	alchemy: 50,
	taming: 50,
	dungeoneering: 50,
	carpentry: 50,
	runecrafting: 25,
	social: 25
}

// for skills that aren't in maxSkills, default to this
const skillsDefaultMaxLevel: number = 50

/**
 * Get the skill level for the amount of total xp
 * @param xp The xp we're finding the level for
 * @param easierLevel Whether it should use the alternate leveling xp table (used for cosmetic skills and dungeoneering)
 */
export async function levelForSkillXp(xp: number, maxLevel: number) {
	const xpTable = maxLevel <= 25 ? await fetchSkillXpEasier() : await fetchSkillXp()
	const skillLevel = [...xpTable].reverse().findIndex(levelXp => xp >= levelXp)
	return skillLevel === -1 ? 0 : xpTable.length - skillLevel
}

export async function cleanSkills(data: any): Promise<Skill[]> {
	const skills: Skill[] = []
	for (const item in data) {
		if (item.startsWith('experience_skill_')) {
			const skillName = item.substr('experience_skill_'.length)

			// the amount of total xp you have in this skill
			const skillXp = data[item]

			const skillMaxLevel = skillsMaxLevel[skillName] ?? skillsDefaultMaxLevel

			const xpTable = skillMaxLevel <= 25 ? await fetchSkillXpEasier() : await fetchSkillXp()

			// the level you're at for this skill
			const skillLevel = await levelForSkillXp(skillXp, skillMaxLevel)

			// the total xp required for the previous level
			const previousLevelXp = skillLevel >= 1 ? xpTable[skillLevel - 1] : 0

			// the extra xp left over
			const skillLevelXp = skillXp - previousLevelXp

			// the amount of extra xp required for this level
			const skillLevelXpRequired = xpTable[skillLevel] - previousLevelXp

			skills.push({
				name: skillName,
				xp: skillXp,
				level: skillLevel,
				maxLevel: skillMaxLevel,
				levelXp: skillLevelXp,
				levelXpRequired: skillLevelXpRequired
			})
		}
	}
	return skills
}