Update Healer Man server

This commit is contained in:
phenom committed 2026-10-04 13:13:35 -04:00
1 parent 39458d5de6
commit 6cc1b9217f
203 files changed
+133929 -31271

No files matched your search

+38 -3
View File
@@ -276,7 +276,7 @@ async function readStatsPanelPage(page) {
}));
return {
...stats,
caption: await page.locator('.equipment-character-stats__note').innerText().catch(() => ''),
caption: await page.locator('.equipment-character-stats__note').first().innerText().catch(() => ''),
};
}
@@ -509,10 +509,19 @@ async function readStatsPanelPage(page) {
assert.ok(nativeRuntime.inventory.some((item) => item.instanceId === 'qa-robes-native'));
assert.equal(nativeRuntime.playerEquipment.chest, 'qa-robes-native', 'The equipped test item reaches the actual dungeon runtime.');
for (const member of nativeRuntime.party) {
if (member.classId.startsWith('rom-')) assert.equal(member.statRuleset, 'rom', `${member.name} keeps its own RoM ruleset.`);
if (member.classId.startsWith('rom-')) {
assert.equal(member.statRuleset, 'rom', `${member.name} keeps its own RoM ruleset.`);
assert.ok(['rom-knight', 'rom-priest', 'rom-rogue', 'rom-scout', 'rom-mage'].includes(member.classId),
'Ordinary generated RoM companions stay inside the active five classes.');
}
}
results.observations.nativeDungeonRuntime = nativeRuntime;
await openStatsPanel(page);
const trainingGearText = await page.locator('.equipment-loadout').innerText();
assert.match(trainingGearText, /Training gear scales automatically through level 79\./);
assert.match(trainingGearText, /Training gear 30/i);
assert.doesNotMatch(trainingGearText, /\bHeirloom\b/i, 'RoM automatic gear uses training labels, not authentic heirloom claims.');
results.observations.romTrainingGearLabels = true;
const nativePanelPages = {};
for (const [index, pageName] of ['attributes', 'offense', 'defense'].entries()) {
if (pageName !== 'attributes') {
@@ -528,7 +537,7 @@ async function readStatsPanelPage(page) {
const labels = new Set(panelPage.rows.map((row) => row.label));
const missing = requiredNativeRows[pageName].filter((label) => !labels.has(label));
assert.deepEqual(missing, [], `Native RoM ${pageName} page is missing fields: ${missing.join(', ')}`);
assert.equal(panelPage.caption, 'Native RoM stats · shared dungeon combat rules');
assert.equal(panelPage.caption, 'Native RoM stats');
nativePanelPages[pageName] = panelPage;
results.screenshots[`nativeStats${pageName[0].toUpperCase()}${pageName.slice(1)}Desktop`] = await capture(
page,
@@ -560,6 +569,32 @@ async function readStatsPanelPage(page) {
assert.ok(nativePanelPages.attributes.vitals.some((row) => row.includes(`Combat health ${Math.round(nativeRuntime.maxHealth).toLocaleString()}`)));
results.observations.nativePanelPages = { ...nativePanelPages, renderedMeters };
await page.locator('.equipment-stat-tabs').getByRole('tab', { name: 'attributes', exact: true }).click();
const npcMember = nativeRuntime.party.find((member) => member.classId === 'rom-mage')
?? nativeRuntime.party.find((member) => member.classId.startsWith('rom-') && member.statRuleset === 'rom');
assert.ok(npcMember, 'The live party contains a native RoM companion owner to inspect.');
const npcOwnerButton = page.locator('.equipment-panel__owners .equipment-owner').filter({ hasText: npcMember.name });
await npcOwnerButton.waitFor();
await npcOwnerButton.click();
await page.waitForFunction((name) => (
document.querySelector('.equipment-loadout > header strong')?.textContent?.trim() === name
), npcMember.name);
const npcNativeStats = await readStatsPanelPage(page);
const npcNativeLabels = new Set(npcNativeStats.rows.map((row) => row.label));
const missingNpcRows = requiredNativeRows.attributes.filter((label) => !npcNativeLabels.has(label));
assert.deepEqual(missingNpcRows, [], `Native RoM NPC attributes page is missing fields: ${missingNpcRows.join(', ')}`);
assert.equal(npcNativeStats.caption, 'Native RoM stats');
const npcTrainingGearText = await page.locator('.equipment-loadout').innerText();
assert.match(npcTrainingGearText, /Training gear scales automatically through level 79\./);
assert.match(npcTrainingGearText, /Training gear 30/i);
assert.doesNotMatch(npcTrainingGearText, /\bHeirloom\b/i, 'RoM NPC automatic gear uses training labels.');
assert.equal(npcMember?.statRuleset, 'rom', 'The selected NPC owner keeps its own native ruleset.');
results.observations.nativeNpcOwnerPanel = { member: npcMember, stats: npcNativeStats };
results.screenshots.nativeNpcStatsAttributesDesktop = await capture(page, '05-native-npc-stats-attributes-desktop');
const playerOwnerButton = page.locator('.equipment-panel__owners .equipment-owner').filter({ hasText: nativeCreated.name });
await playerOwnerButton.click();
await page.waitForFunction((name) => (
document.querySelector('.equipment-loadout > header strong')?.textContent?.trim() === name
), nativeCreated.name);
await page.locator('.equipment-panel .equipment-character-stats').scrollIntoViewIfNeeded();
await page.setViewportSize({ width: 390, height: 844 });
await page.waitForTimeout(350);