Update Healer Man server

This commit is contained in:
phenom committed 2026-10-02 10:38:12 -04:00
1 parent 4c768fbec6
commit b16821e92e
330 files changed
+35406 -1760

No files matched your search

@@ -34,6 +34,14 @@ const CLASS_IDS = ["rom-warrior", "rom-scout", "rom-rogue", "rom-mage", "rom-pri
const CLASS_NAMES = ["Warrior", "Scout", "Rogue", "Mage", "Priest", "Knight", "Warden", "Druid", "Warlock", "Champion"];
const RESOURCES = ["rage", "focus", "energy", "mana", "mana", "mana", "mana", "mana", "focus", "rage"];
const ELITE_LEVELS = [15, 20, 25, 30, 35, 40, 45, 50, 60, 70];
const DRUID_WARRIOR_BRIAR_CHILD = {
mainClass: 8,
secondaryClass: 1,
level: 60,
keyItemId: 546833,
passiveSourceSkillId: 499955,
childSourceSkillId: 499956,
};
const RACE_MATRIX = {
"rom-human": [1, 2, 3, 4, 5, 6],
"rom-elf": [1, 2, 3, 4, 7, 8],
@@ -554,6 +562,41 @@ for (const key of [...eligiblePairs].sort()) {
icon: `/assets/ui/rom-spells/${spell.source.imageId}.png`,
iconResolution: "native-interface-fdb",
});
// RuneWaker unlocks Cross of Thorns Attacks as an additional class-8
// skill behind Briar Technique. It shares the passive's key item, so the
// usual one-candidate-per-elite-milestone lookup above would omit it.
if (mapping.mainClass === DRUID_WARRIOR_BRIAR_CHILD.mainClass
&& mapping.secondaryClass === DRUID_WARRIOR_BRIAR_CHILD.secondaryClass
&& milestone.level === DRUID_WARRIOR_BRIAR_CHILD.level
&& milestone.keyItemId === DRUID_WARRIOR_BRIAR_CHILD.keyItemId
&& candidate.sourceSkillId === DRUID_WARRIOR_BRIAR_CHILD.passiveSourceSkillId) {
const child = candidates.find((entry) => entry.classIndex === DRUID_WARRIOR_BRIAR_CHILD.mainClass
&& entry.sourceSkillId === DRUID_WARRIOR_BRIAR_CHILD.childSourceSkillId
&& entry.learnLevel === milestone.level
&& entry.keyItemId === milestone.keyItemId
&& entry.prerequisites.includes(DRUID_WARRIOR_BRIAR_CHILD.passiveSourceSkillId));
if (!child) throw new Error("Druid/Warrior Briar Technique child 499956 lost its source unlock row.");
const childSpell = sourceSpell(child.sourceSkillId, mapping.mainClass);
if (!childSpell) throw new Error("Druid/Warrior Briar Technique child 499956 has no MagicCollect row.");
skills.push({
id: `${CLASS_IDS[mapping.mainClass - 1]}-${CLASS_IDS[mapping.secondaryClass - 1]}-elite-${milestone.level}-${child.sourceSkillId}`,
classId: CLASS_IDS[mapping.mainClass - 1],
secondaryClassId: CLASS_IDS[mapping.secondaryClass - 1],
group: childSpell.passive ? "passive" : "elite",
unlockLevel: child.learnLevel,
keyItemId: child.keyItemId,
...childSpell,
ranks: [{
rank: 1,
level: child.learnLevel,
prerequisites: child.prerequisites,
...nestedRankSpell(childSpell, childSpell.sourceSkillId),
}],
icon: `/assets/ui/rom-spells/${childSpell.source.imageId}.png`,
iconResolution: "native-interface-fdb",
});
}
}
}
@@ -561,6 +604,8 @@ const eliteSkills = skills.filter((skill) => skill.secondaryClassId);
const ordinarySkills = skills.filter((skill) => !skill.secondaryClassId);
const unresolvedVisible = skills.filter((skill) => !skill.passive && !skill.effect?.kind);
const iconCoverage = await extractNativeIcons(skills);
const eliteMilestoneCount = [...eliteMappings.values()].reduce((sum, entry) => sum + entry.milestones.length, 0);
const supplementalEliteCount = eliteSkills.length - eliteMilestoneCount;
const sourceHashes = {
...Object.fromEntries(Object.entries(buffers).map(([key, value]) => [key, sha256(value)])),
interfaceFdb: await sha256File(interfaceFdb),
@@ -583,7 +628,7 @@ const audit = {
duelistExcluded: !CLASS_NAMES.includes("Duelist"),
races: Object.keys(RACE_MATRIX).length,
orderedPairs: eligiblePairs.size,
eliteMilestones: eliteSkills.length,
eliteMilestones: eliteMilestoneCount,
ordinaryFamilies: ordinarySkills.length,
sourceRankRows: ordinarySkills.reduce((sum, skill) => sum + skill.ranks.length, 0),
iconResolved: skills.filter((skill) => skill.iconResolution === "native-interface-fdb").length,
@@ -594,7 +639,12 @@ const audit = {
},
adaptations,
};
if (eliteSkills.length !== 660 || unresolvedVisible.length !== 0 || audit.coverage.iconResolved !== skills.length || iconCoverage.requested !== iconCoverage.resolved) throw new Error(`Coverage failed: ${JSON.stringify(audit.coverage)}`);
// In addition to the 660 ordinary milestones, this source emits the Druid/Warrior
// Cross of Thorns Attacks row behind its explicit learned prerequisite.
if (eliteMilestoneCount !== 660 || supplementalEliteCount !== 1 || unresolvedVisible.length !== 0
|| audit.coverage.iconResolved !== skills.length || iconCoverage.requested !== iconCoverage.resolved) {
throw new Error(`Coverage failed: ${JSON.stringify(audit.coverage)}`);
}
await mkdir(path.dirname(outputFile), { recursive: true });
await mkdir(path.dirname(auditFile), { recursive: true });
await Promise.all([
@@ -25,10 +25,10 @@
"eliteMilestones": 660,
"ordinaryFamilies": 269,
"sourceRankRows": 274,
"iconResolved": 929,
"iconResolved": 930,
"uniqueNativeIcons": 918,
"interfaceFdbEntries": 34954,
"executableOrNonCombat": 929,
"executableOrNonCombat": 930,
"unresolvedVisible": 0
},
"adaptations": [