UNPKG

farming-weight

Version:

Tools for calculating farming weight and fortune in Hypixel Skyblock

58 lines 2.67 kB
import { CROP_INFO } from '../constants/crops.js'; import { Stat } from '../constants/stats.js'; import { getQueryStats } from '../constants/upgrades.js'; const CROP_FORTUNE_STATS = new Set(Object.values(CROP_INFO).map((c) => c.fortuneType)); export function getUpgradeDelta(upgrade, stat) { if (stat === Stat.FarmingFortune) { return upgrade.stats?.[Stat.FarmingFortune] ?? upgrade.increase ?? 0; } // Crop fortune totals include global Farming Fortune. // When a caller filters by a crop fortune stat, treat FarmingFortune upgrades // as affecting that crop's total as well. if (CROP_FORTUNE_STATS.has(stat)) { const cropDelta = upgrade.stats?.[stat] ?? 0; const farmingDelta = upgrade.stats?.[Stat.FarmingFortune] ?? upgrade.increase ?? 0; return cropDelta + farmingDelta; } return upgrade.stats?.[stat] ?? 0; } function upgradeHasRelatedEffect(upgrade, stats) { return upgrade.effects?.some((effect) => effect.relatedStats?.some((related) => stats.includes(related))) ?? false; } function getUpgradeScore(upgrade, stats) { return stats.reduce((sum, stat) => sum + getUpgradeDelta(upgrade, stat), 0); } export function filterAndSortUpgrades(upgrades, options) { const stats = getQueryStats(options); const primaryStat = stats[0] ?? Stat.FarmingFortune; const explicitMultiStat = options?.stats !== undefined && options.stats.length > 0; if (!explicitMultiStat && primaryStat === Stat.FarmingFortune) { upgrades.sort((a, b) => (b.increase ?? 0) - (a.increase ?? 0)); return upgrades; } const filtered = upgrades.filter((u) => { if (stats.some((stat) => getUpgradeDelta(u, stat) !== 0)) return true; if (upgradeHasRelatedEffect(u, stats)) return true; const upgradeStats = u.stats; if (upgradeStats && stats.some((stat) => Object.hasOwn(upgradeStats, stat))) return true; // For crop-fortune views, keep 0-delta FarmingFortune upgrades so the UI can // still show upgrade trees (e.g. Dedication) when milestones/context are missing. if (stats.some((stat) => CROP_FORTUNE_STATS.has(stat)) && u.stats && Object.hasOwn(u.stats, Stat.FarmingFortune)) { return true; } return false; }); filtered.sort((a, b) => { const primaryDelta = getUpgradeDelta(b, primaryStat) - getUpgradeDelta(a, primaryStat); if (primaryDelta !== 0) return primaryDelta; return getUpgradeScore(b, stats) - getUpgradeScore(a, stats); }); return filtered; } //# sourceMappingURL=upgradeutils.js.map