Release Healer Man 0.1.21

This commit is contained in:
phenom committed 2026-09-08 10:40:26 -04:00
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,
};