farming-weight
Version:
Tools for calculating farming weight and fortune in Hypixel Skyblock
102 lines (101 loc) • 3.39 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
exports.getPetLevel = exports.FarmingPet = exports.createFarmingPet = void 0;
const PETS_1 = require('../constants/pets');
const REFORGES_1 = require('../constants/reforges');
const SKILLS_1 = require('../constants/skills');
const ITEMSTATS_1 = require('../util/itemstats');
function createFarmingPet(pet) {
return new FarmingPet(pet);
}
exports.createFarmingPet = createFarmingPet;
class FarmingPet {
constructor(pet, options) {
this.options = options;
this.pet = pet;
this.info = PETS_1.FARMING_PETS[pet.type];
if (!this.info) {
throw new Error(`Invalid farming pet type: ${pet.type}`);
}
this.type = pet.type;
this.rarity = (0, ITEMSTATS_1.getRarityFromLore)([pet.tier ?? '']) ?? REFORGES_1.Rarity.Common;
this.level = getPetLevel(pet);
this.item = pet.heldItem ? PETS_1.FARMING_PET_ITEMS[pet.heldItem] : undefined;
this.fortune = this.getFortune();
}
setOptions(options) {
this.options = options;
this.fortune = this.getFortune();
}
getFortune() {
let FORTUNE = 0;
const BREAKDOWN = {};
// Base stats
const STATS = this.info.stats?.[REFORGES_1.Stat.FarmingFortune];
if (STATS) {
FORTUNE += STATS;
BREAKDOWN['Base Stats'] = STATS;
}
// Per level/ability stats
const PER_LEVEL_STATS = this.info.perLevelStats?.[REFORGES_1.Stat.FarmingFortune];
if (PER_LEVEL_STATS) {
const AMOUNT = PER_LEVEL_STATS.multiplier * this.level;
FORTUNE += AMOUNT;
BREAKDOWN[PER_LEVEL_STATS.name] = AMOUNT;
}
// Per rarity fortune stats
const PER_RARITY_STATS = this.info.perRarityLevelStats?.[this.rarity]?.[REFORGES_1.Stat.FarmingFortune];
if (PER_RARITY_STATS) {
const AMOUNT = PER_RARITY_STATS.multiplier * this.level;
FORTUNE += AMOUNT;
BREAKDOWN[PER_RARITY_STATS.name] = AMOUNT;
}
// Mooshroom Cow Perk
if (this.type === PETS_1.FarmingPets.MooshroomCow && this.options?.strength) {
const STRENGTH_PER = 40 - this.level * 0.2;
const STRENGTH = this.options.strength;
const AMOUNT = Math.floor((STRENGTH / STRENGTH_PER) * 0.7);
FORTUNE += AMOUNT;
BREAKDOWN['Farming Strength'] = AMOUNT;
}
// Pet item stats
if (this.item) {
const stats = this.item.stats?.[REFORGES_1.Stat.FarmingFortune];
const perLevelStats = this.item.perLevelStats;
if (stats) {
FORTUNE += stats;
BREAKDOWN[this.item.name + ' Stats'] = stats;
}
if (perLevelStats && perLevelStats.skill === SKILLS_1.Skill.Garden) {
const AMOUNT =
(perLevelStats?.stats?.[REFORGES_1.Stat.FarmingFortune] ?? 0) * (this.options?.gardenLevel ?? 0);
FORTUNE += AMOUNT;
BREAKDOWN[this.item.name] = AMOUNT;
}
}
this.breakdown = BREAKDOWN;
this.fortune = FORTUNE;
return FORTUNE;
}
static isValid(pet) {
return pet.type && pet.type in PETS_1.FARMING_PETS;
}
static fromArray(items, options) {
return items
.filter((item) => FarmingPet.isValid(item))
.map((item) => new FarmingPet(item, options))
.sort((a, b) => b.fortune - a.fortune);
}
}
exports.FarmingPet = FarmingPet;
function getPetLevel(pet, max = 100) {
const LEVELS = PETS_1.PET_LEVELS;
const XP = pet.exp ?? 0;
const LEVEL_INDEX = LEVELS.findIndex((level) => level > XP);
if (LEVEL_INDEX === -1 || LEVEL_INDEX >= max) {
return max;
}
return LEVEL_INDEX + 1;
}
exports.getPetLevel = getPetLevel;
//# sourceMappingURL=farmingpet.js.map