Catalog RoM leveling gear package milestones

This commit is contained in:
phenom committed 2026-09-23 16:21:55 -04:00
1 parent 189b94d6b7
commit d3cc27a54a
7 files changed
+134 -24

No files matched your search

@@ -70,25 +70,36 @@ function sourceName(id) {
// source's armor category, required levels, names, and suit membership. Package
// expansion itself is not present in these DB records and remains unverified.
const milestones = [
{ level: 50, questId: 424596, choices: [
{ level: 5, questId: 423783, packageStructure: "single-package-contents-unverified", choices: [
["cloth", 209015],
["leather", 209024],
["chain", 209025],
] },
{ level: 30, questId: 423771, packageStructure: "battlefield-package-contents-unverified", choices: [
["armor", 208802],
["chain", 208803],
["leather", 208804],
["cloth", 208805],
] },
{ level: 50, questId: 424596, packageStructure: "named-subpackages-links-unverified", choices: [
["plate", 240384, 240385, 240386, 610363],
["chain", 240387, 240388, 240389, 610364],
["leather", 240390, 240391, 240392, 610365],
["cloth", 240393, 240394, 240395, 610366],
] },
{ level: 55, questId: 424597, choices: [
{ level: 55, questId: 424597, packageStructure: "named-subpackages-links-unverified", choices: [
["plate", 240353, 240354, 240355, 610395],
["chain", 240356, 240357, 240358, 610396],
["leather", 240359, 240360, 240361, 610397],
["cloth", 240362, 240363, 240364, 610398],
] },
{ level: 60, questId: 424598, choices: [
{ level: 60, questId: 424598, packageStructure: "named-subpackages-links-unverified", choices: [
["plate", 240341, 240342, 240343, 610391],
["chain", 240344, 240345, 240346, 610392],
["leather", 240347, 240348, 240349, 610393],
["cloth", 240350, 240351, 240352, 610394],
] },
{ level: 65, questId: 424213, choices: [
{ level: 65, questId: 424213, packageStructure: "named-subpackages-links-unverified", choices: [
["plate", 240304, 240302, 240303, 610387],
["chain", 240307, 240305, 240306, 610388],
["leather", 240310, 240308, 240309, 610389],
@@ -96,15 +107,18 @@ const milestones = [
] },
];
const extracted = milestones.map(({ level, questId, choices }) => {
const extracted = milestones.map(({ level, questId, packageStructure, choices }) => {
const quest = record("questdetailobject.db", questId);
if (quest.readInt32LE(0xc0) !== level) throw new Error(`Quest ${questId} level drifted.`);
const rewardIds = Array.from({ length: 4 }, (_, index) => quest.readInt32LE(0x34c + index * 4));
if (rewardIds.slice(choices.length).some((id) => id !== 0)) {
throw new Error(`Quest ${questId} has an unrecorded reward choice.`);
}
const packages = choices.map(([armorCategory, packageId, weaponPackageId, armorPackageId, matchingSuitId], index) => {
if (rewardIds[index] !== packageId) throw new Error(`Quest ${questId} reward order drifted.`);
for (const id of [packageId, weaponPackageId, armorPackageId]) record("itemobject.db", id);
const suit = record("suitobject.db", matchingSuitId);
const matchingArmorItems = Array.from({ length: 10 }, (_, member) => suit.readInt32LE(1224 + member * 4))
for (const id of [packageId, weaponPackageId, armorPackageId].filter(Boolean)) record("itemobject.db", id);
const suit = matchingSuitId ? record("suitobject.db", matchingSuitId) : null;
const matchingArmorItems = suit ? Array.from({ length: 10 }, (_, member) => suit.readInt32LE(1224 + member * 4))
.filter((id) => id > 0)
.map((itemId) => {
const item = record("armorobject.db", itemId);
@@ -116,26 +130,22 @@ const extracted = milestones.map(({ level, questId, choices }) => {
throw new Error(`Armor ${itemId} has unexpected required level ${requiredLevel}.`);
}
return { itemId, name: sourceName(itemId), requiredLevel };
});
if (matchingArmorItems.length !== 7) throw new Error(`Suit ${matchingSuitId} should have seven armor pieces.`);
}) : [];
if (suit && matchingArmorItems.length !== 7) throw new Error(`Suit ${matchingSuitId} should have seven armor pieces.`);
return {
armorCategory,
packageId,
packageName: sourceName(packageId),
weaponPackageId,
weaponPackageName: sourceName(weaponPackageId),
armorPackageId,
armorPackageName: sourceName(armorPackageId),
matchingSuitId,
matchingSuitName: sourceName(matchingSuitId),
matchingArmorItems,
...(weaponPackageId ? { weaponPackageId, weaponPackageName: sourceName(weaponPackageId) } : {}),
...(armorPackageId ? { armorPackageId, armorPackageName: sourceName(armorPackageId) } : {}),
...(suit ? { matchingSuitId, matchingSuitName: sourceName(matchingSuitId), matchingArmorItems } : {}),
};
});
return { level, questId, questName: sourceName(questId), packages };
return { level, questId, questName: sourceName(questId), packageStructure, packages };
});
const output = {
schemaVersion: 1,
schemaVersion: 2,
contentStatus: "quest-rewards-confirmed-package-expansion-unverified",
sourceFiles: Object.fromEntries(files.map((name) => [name, createHash("sha256").update(buffers[name]).digest("hex")])),
milestones: extracted,