Catalog RoM leveling gear package milestones
This commit is contained in:
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,
|
||||
|
||||
Reference in new issue
Block a user