forked from phenom/healer-man
Release Healer Man 0.1.21
This commit is contained in:
1 parent
699fc858c9
commit
f6f2375145
210 files changed
+976039
-6247
No files matched your search
@@ -29,6 +29,8 @@ const reviewedFindings = {
|
||||
"cave-water-dragon": {
|
||||
disposition: "gated-wave-and-door-review",
|
||||
safeAutomaticLink: false,
|
||||
objectiveOrderStatus: "partial-gate-evidence-insufficient-for-complete-order",
|
||||
requirements: ["encounter-gate-state", "source-objective-review", "dynamic-navigation-transition"],
|
||||
finding: "Template 104161 runs the ten-add water-elemental controller, creates a blocking door, and removes it only after the counter reaches ten. Lytfir is on a lower isolated surface, so a permanent link would bypass the preserved gate/drop sequence.",
|
||||
evidence: [
|
||||
"../rom-pvt-server-backups/Runewaker/Resource/luascript/01562.lua:1",
|
||||
@@ -39,6 +41,8 @@ const reviewedFindings = {
|
||||
hoto: {
|
||||
disposition: "source-order-required-before-linking",
|
||||
safeAutomaticLink: false,
|
||||
objectiveOrderStatus: "source-objective-review-required",
|
||||
requirements: ["source-objective-review", "navigation-geometry-review"],
|
||||
finding: "The distance fallback crosses the same 6.65m vertical surface break three times. Preserved local configuration supplies boss anchors but no authoritative encounter order, so these heuristic legs cannot justify a link.",
|
||||
evidence: [
|
||||
"scripts/runewaker-pipeline/build-population.mjs:634",
|
||||
@@ -48,6 +52,8 @@ const reviewedFindings = {
|
||||
"ice-dwarf-kingdom": {
|
||||
disposition: "door-gated-room-review",
|
||||
safeAutomaticLink: false,
|
||||
objectiveOrderStatus: "partial-gate-evidence-insufficient-for-complete-order",
|
||||
requirements: ["encounter-gate-state", "source-objective-review", "dynamic-navigation-transition"],
|
||||
finding: "Crasset's isolated surface is separated by a 1.64m/0.60m gap, but his preserved death hook creates an orb that finds and hides door 112321. A permanent bidirectional link would erase that gate state.",
|
||||
evidence: [
|
||||
"../rom-pvt-server-backups/Runewaker/Resource/luascript/01356.lua:16",
|
||||
@@ -59,28 +65,41 @@ const reviewedFindings = {
|
||||
"kalins-shrine": {
|
||||
disposition: "teleport-room-mechanic",
|
||||
safeAutomaticLink: false,
|
||||
finding: "The preserved server scripts register six Kalin locations as separate keeper rooms and advance with a group teleport. The vertical component gaps are therefore encounter state, not wall seams.",
|
||||
objectiveOrderStatus: "source-randomized-not-linear",
|
||||
requirements: ["nonlinear-objectives", "encounter-teleport-state", "dynamic-navigation-transition"],
|
||||
finding: "The preserved server scripts register six Kalin locations as separate keeper rooms, select the next uncleared room randomly, and advance with a group teleport. The vertical component gaps are encounter state, not wall seams, and a fixed objective order would contradict the source.",
|
||||
evidence: [
|
||||
"../rom-pvt-server-backups/Runewaker/Resource/luascript/03246.lua:713",
|
||||
"../rom-pvt-server-backups/Runewaker/Resource/luascript/03246.lua:1298",
|
||||
"../rom-pvt-server-backups/Runewaker/Resource/luascript/03246.lua:1363",
|
||||
"../rom-pvt-server-backups/Runewaker/Resource/luascript/03246.lua:1354",
|
||||
],
|
||||
},
|
||||
"raksha-temple": {
|
||||
disposition: "missing-modular-environment-assembly",
|
||||
safeAutomaticLink: false,
|
||||
objectiveOrderStatus: "not-applicable-single-objective",
|
||||
requirements: ["modular-environment-assembly"],
|
||||
finding: "The environment recipe explicitly adds isolated source-anchor support pads because the single primary ROS does not cover the modular WDB combat anchors. Secondary environment pieces must be assembled before route authoring.",
|
||||
evidence: ["scripts/runewaker-pipeline/recipes/raksha-temple.json:16"],
|
||||
},
|
||||
"the-origin": {
|
||||
disposition: "missing-modular-environment-assembly",
|
||||
safeAutomaticLink: false,
|
||||
objectiveOrderStatus: "source-objective-review-required",
|
||||
requirements: ["modular-environment-assembly", "source-objective-review"],
|
||||
finding: "Both objectives and the entrance sit on isolated source-anchor support pads. The WDB contains many separately placed cathedral, slope, bridge, and connector ROS pieces that the primary-only environment package does not yet assemble.",
|
||||
evidence: ["scripts/runewaker-pipeline/recipes/the-origin.json:16"],
|
||||
},
|
||||
"treasure-trove": {
|
||||
disposition: "missing-modular-environment-plus-bridge-door-mechanics",
|
||||
safeAutomaticLink: false,
|
||||
objectiveOrderStatus: "partial-gate-evidence-insufficient-for-complete-order",
|
||||
requirements: [
|
||||
"modular-environment-assembly",
|
||||
"encounter-gate-state",
|
||||
"source-objective-review",
|
||||
"dynamic-navigation-transition",
|
||||
],
|
||||
finding: "Boss anchors are isolated support pads, while preserved Lua requires a boss-enabled drawbridge switch and a key-gated hold door. The modular environment and stateful bridge/door must precede navigation links.",
|
||||
evidence: [
|
||||
"scripts/runewaker-pipeline/recipes/treasure-trove.json:16",
|
||||
@@ -92,6 +111,8 @@ const reviewedFindings = {
|
||||
"ystra-labyrinth-boss1": {
|
||||
disposition: "separate-authored-room-placements",
|
||||
safeAutomaticLink: false,
|
||||
objectiveOrderStatus: "independent-room-order-unresolved",
|
||||
requirements: ["encounter-teleport-state", "source-objective-review", "dynamic-navigation-transition"],
|
||||
finding: "The package intentionally clones three distinct WDB room placements hundreds of meters apart; the preserved travel catalog also treats the boss-room destinations separately. Connecting them through open space would invent geometry.",
|
||||
evidence: [
|
||||
"scripts/runewaker-pipeline/recipes/ystra-labyrinth-boss1.json:16",
|
||||
@@ -418,7 +439,9 @@ function renderMarkdown(report) {
|
||||
"The current boss sequence is HealerMan's distance-from-entrance fallback, not a claimed",
|
||||
"source-authored order. It does not create links or infer doors/teleports.",
|
||||
"",
|
||||
`Unreachable heuristic legs analyzed: **${report.unreachableLegs}** across **${report.dungeons.length}** dungeons.`,
|
||||
`Unreachable currently ordered legs analyzed: **${report.unreachableLegs}** across **${report.dungeons.length}** dungeons.`,
|
||||
`Source-authored fixed orders implemented by the audited packages: **${report.resolutionSummary.sourceAuthoredFixedOrders}**.`,
|
||||
`Authored off-mesh links added by this review: **${report.resolutionSummary.authoredOffMeshLinksAdded}**.`,
|
||||
"",
|
||||
"| Dungeon | Ordered leg | Geometry classification | From raw comp/dist | To raw comp/dist | Retained distances |",
|
||||
"| --- | --- | --- | --- | --- | --- |",
|
||||
@@ -442,9 +465,21 @@ function renderMarkdown(report) {
|
||||
const finding = dungeon.reviewedFinding;
|
||||
lines.push(`### ${dungeon.id}`, "", `- Disposition: ${finding.disposition}.`,
|
||||
`- Safe automatic link: ${finding.safeAutomaticLink ? "yes" : "no"}.`,
|
||||
`- Objective order: ${finding.objectiveOrderStatus}.`,
|
||||
`- Current package order: ${dungeon.objectiveOrdering.kind} (${dungeon.objectiveOrdering.authoritative ? "authoritative" : "non-authoritative"}).`,
|
||||
`- Finding: ${finding.finding}`,
|
||||
...finding.requirements.map((entry) => `- Remaining requirement: ${entry}.`),
|
||||
...finding.evidence.map((entry) => `- Evidence: ${entry}`), "");
|
||||
}
|
||||
lines.push("## Resolution boundary", "",
|
||||
"No off-mesh link was emitted. Every failed leg is either controlled by encounter state,",
|
||||
"depends on environment geometry that is not yet in the runtime package, represents",
|
||||
"separate authored rooms, or still lacks a complete source-authored boss sequence.",
|
||||
"A static link would let companions bypass a door, bridge, wave, or teleport mechanic.",
|
||||
"The structured requirement counts below are deterministic and identify the remaining work.", "");
|
||||
for (const [requirement, count] of Object.entries(report.resolutionSummary.requirementDungeonCounts)) {
|
||||
lines.push(`- ${requirement}: ${count} dungeon(s).`);
|
||||
}
|
||||
lines.push("");
|
||||
return lines.join("\n");
|
||||
}
|
||||
@@ -474,6 +509,11 @@ for (const recipeName of recipeNames) {
|
||||
constantCase(recipe.dungeonId) + "_BOSSES",
|
||||
" as const satisfies readonly DungeonBossObjective[];",
|
||||
);
|
||||
const populationProvenance = generatedJson(
|
||||
source,
|
||||
constantCase(recipe.dungeonId) + "_POPULATION_PROVENANCE",
|
||||
" as const;",
|
||||
);
|
||||
const graph = buildPartyNavigationGraph(geometryFromPositions(positions));
|
||||
const retainedTriangleComponents = triangleComponents(graph);
|
||||
const raw = analyzeRawComponents(positions);
|
||||
@@ -519,9 +559,12 @@ for (const recipeName of recipeNames) {
|
||||
reviewedFinding: reviewedFindings[recipe.dungeonId] ?? {
|
||||
disposition: "manual-review-required",
|
||||
safeAutomaticLink: false,
|
||||
objectiveOrderStatus: "source-objective-review-required",
|
||||
requirements: ["source-objective-review"],
|
||||
finding: "No reviewed source-backed navigation disposition is recorded.",
|
||||
evidence: [],
|
||||
},
|
||||
objectiveOrdering: populationProvenance.objectiveOrder,
|
||||
rawComponents: raw.components.map((component) => ({
|
||||
id: component.id,
|
||||
vertexCount: component.vertices.length,
|
||||
@@ -532,15 +575,26 @@ for (const recipeName of recipeNames) {
|
||||
});
|
||||
}
|
||||
|
||||
const requirementDungeonCounts = {};
|
||||
for (const dungeon of dungeons) {
|
||||
for (const requirement of new Set(dungeon.reviewedFinding.requirements)) {
|
||||
requirementDungeonCounts[requirement] = (requirementDungeonCounts[requirement] ?? 0) + 1;
|
||||
}
|
||||
}
|
||||
const report = {
|
||||
schemaVersion: 1,
|
||||
generatedAt: new Date().toISOString(),
|
||||
schemaVersion: 2,
|
||||
generator: "scripts/runewaker-pipeline/analyze-navigation-gaps.mjs",
|
||||
methodology: {
|
||||
weldTolerance,
|
||||
liveStartSnapDistance: 3,
|
||||
liveObjectiveSnapDistance: 6,
|
||||
mutatesAssets: false,
|
||||
},
|
||||
resolutionSummary: {
|
||||
sourceAuthoredFixedOrders: dungeons.filter((dungeon) => dungeon.objectiveOrdering.authoritative).length,
|
||||
authoredOffMeshLinksAdded: 0,
|
||||
requirementDungeonCounts: Object.fromEntries(Object.entries(requirementDungeonCounts).sort()),
|
||||
},
|
||||
unreachableLegs: dungeons.flatMap((dungeon) => dungeon.legs).filter((leg) => !leg.reachable).length,
|
||||
dungeons,
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user