farming-weight
Version:
Tools for calculating farming weight and fortune in Hypixel Skyblock
86 lines • 3.11 kB
JavaScript
import { mergeCost } from '../constants/upgrades.js';
const SLOT_ORDER = {
Helmet: 0,
Chestplate: 1,
Leggings: 2,
Boots: 3,
Necklace: 4,
Cloak: 5,
Belt: 6,
Gloves: 7,
};
export function withGroupedUpgrades(upgrades) {
const groupedRows = buildGroupedUpgrades(upgrades);
if (groupedRows.length === 0)
return upgrades;
const groupedMemberKeys = new Set(groupedRows.flatMap((group) => group.groupedUpgrades ?? []).map((upgrade) => getUpgradeKey(upgrade)));
const ungroupedRows = upgrades.filter((upgrade) => !groupedMemberKeys.has(getUpgradeKey(upgrade)));
return [...groupedRows, ...ungroupedRows];
}
export function buildGroupedUpgrades(upgrades) {
const grouped = new Map();
for (const upgrade of upgrades) {
if (!upgrade.group?.id)
continue;
const members = grouped.get(upgrade.group.id) ?? [];
members.push(upgrade);
grouped.set(upgrade.group.id, members);
}
const result = [];
for (const members of grouped.values()) {
if (members.length < 2)
continue;
const sorted = [...members].sort(compareUpgradeGroupMembers);
const first = sorted[0];
const group = first?.group;
if (!group)
continue;
const stats = sumStats(sorted);
const cost = mergeUpgradeCosts(sorted);
result.push({
title: group.label,
increase: sorted.reduce((sum, upgrade) => sum + (upgrade.increase ?? 0), 0),
stats,
action: first.action,
category: first.category,
cost,
wiki: first.wiki,
conflictKey: `upgrade_group:${group.id}:${sorted.map((upgrade) => upgrade.conflictKey ?? upgrade.title).join('|')}`,
group: {
...group,
memberCount: sorted.length,
},
groupedUpgrades: sorted,
meta: {
type: 'upgrade_group',
id: group.id,
},
});
}
return result.sort((a, b) => a.title.localeCompare(b.title));
}
function compareUpgradeGroupMembers(a, b) {
const slotA = a.onto?.slot ? (SLOT_ORDER[a.onto.slot] ?? 99) : 99;
const slotB = b.onto?.slot ? (SLOT_ORDER[b.onto.slot] ?? 99) : 99;
if (slotA !== slotB)
return slotA - slotB;
return a.title.localeCompare(b.title);
}
function sumStats(upgrades) {
const stats = {};
for (const upgrade of upgrades) {
for (const [stat, value] of Object.entries(upgrade.stats ?? {})) {
stats[stat] = (stats[stat] ?? 0) + (value ?? 0);
}
}
return Object.keys(stats).length > 0 ? stats : undefined;
}
function mergeUpgradeCosts(upgrades) {
const costs = upgrades.map((upgrade) => upgrade.cost).filter((cost) => cost !== undefined);
return costs.length > 0 ? mergeCost(...costs) : undefined;
}
function getUpgradeKey(upgrade) {
return (upgrade.conflictKey ??
`${upgrade.title}:${upgrade.action}:${upgrade.meta?.type ?? ''}:${upgrade.meta?.id ?? ''}`);
}
//# sourceMappingURL=groups.js.map