Release Healer Man 0.1.33
This commit is contained in:
1 parent
6dcb1034e5
commit
05b25c4341
20 files changed
+573
-51
No files matched your search
@@ -8,6 +8,7 @@ import { DEFAULT_AZEROTHCORE_COMMIT } from "./import-azerothcore-world.mjs";
|
||||
|
||||
const projectRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
||||
const recipesRoot = path.join(projectRoot, "dungeon-pipeline", "recipes");
|
||||
const runtimeOverridesRoot = path.join(projectRoot, "dungeon-pipeline", "runtime-overrides");
|
||||
const workRoot = path.resolve(process.env.DUNGEON_PIPELINE_WORK ?? path.join(projectRoot, "..", "HealerMan-Storage", "pipeline-work", "dungeons"));
|
||||
const outputFile = path.join(projectRoot, "src", "game", "generated", "dungeonCampaignCatalog.json");
|
||||
const gameObjectAssetManifestFile = path.join(
|
||||
@@ -1445,13 +1446,13 @@ function finiteBounds(points) {
|
||||
};
|
||||
}
|
||||
|
||||
function presentationFor(recipe, assetPackage, environmentMode, bounds) {
|
||||
function presentationFor(recipe, assetPackage, environmentMode, bounds, override = {}) {
|
||||
const palette = EXPANSION_PRESENTATION[recipe.expansion] ?? EXPANSION_PRESENTATION.classic;
|
||||
const span = Math.max(
|
||||
bounds.max[0] - bounds.min[0],
|
||||
bounds.max[2] - bounds.min[2],
|
||||
);
|
||||
return {
|
||||
const presentation = {
|
||||
location: assetPackage.location || recipe.title,
|
||||
theme: environmentMode === "adt-hybrid" ? "Open-world expedition" : "Instanced dungeon",
|
||||
summary: `Fight through ${recipe.title}, defeat its encounter roster, and keep the party alive.`,
|
||||
@@ -1480,6 +1481,16 @@ function presentationFor(recipe, assetPackage, environmentMode, bounds) {
|
||||
],
|
||||
},
|
||||
};
|
||||
return {
|
||||
...presentation,
|
||||
...override,
|
||||
fog: { ...presentation.fog, ...override.fog },
|
||||
ambientLight: { ...presentation.ambientLight, ...override.ambientLight },
|
||||
hemisphereLight: { ...presentation.hemisphereLight, ...override.hemisphereLight },
|
||||
directionalLight: { ...presentation.directionalLight, ...override.directionalLight },
|
||||
materials: presentation.materials,
|
||||
map: presentation.map,
|
||||
};
|
||||
}
|
||||
|
||||
async function compile() {
|
||||
@@ -1535,6 +1546,19 @@ async function compile() {
|
||||
const importsBySlug = new Map(
|
||||
(fivePlayerImports.imports ?? []).map((entry) => [entry.slug, entry]),
|
||||
);
|
||||
const runtimeOverrides = new Map();
|
||||
for (const recipe of recipes) {
|
||||
const file = path.join(runtimeOverridesRoot, `${recipe.slug}.json`);
|
||||
if (!await exists(file)) continue;
|
||||
const override = await readJson(file);
|
||||
if (override.schemaVersion !== 1 || override.dungeonId !== recipe.slug) {
|
||||
throw new Error(`${recipe.slug}: runtime override identity or schema is invalid.`);
|
||||
}
|
||||
if (override.validation?.navigation === "green" && !(override.navigationLinks?.length > 0)) {
|
||||
throw new Error(`${recipe.slug}: green navigation requires at least one reviewed link.`);
|
||||
}
|
||||
runtimeOverrides.set(recipe.slug, override);
|
||||
}
|
||||
const drafts = new Map();
|
||||
const wantedSpellIds = new Set();
|
||||
for (const recipe of recipes) {
|
||||
@@ -1584,6 +1608,7 @@ async function compile() {
|
||||
const coverage = [];
|
||||
for (const recipe of recipes) {
|
||||
const dungeonImport = importsBySlug.get(recipe.slug);
|
||||
const runtimeOverride = runtimeOverrides.get(recipe.slug) ?? {};
|
||||
// Manastorm packages contain the complete optimized dungeon geometry.
|
||||
// Reuse them for full dungeons so the install ships one map package.
|
||||
const assetPackage = packagesByMap.get(recipe.mapId) ?? dungeonImport?.environment;
|
||||
@@ -1951,7 +1976,7 @@ async function compile() {
|
||||
difficultyVariants: recipe.difficultyVariants,
|
||||
defaultDifficultyId: recipe.difficultyVariants[0]?.id ?? "normal",
|
||||
availability: "available",
|
||||
presentation: presentationFor(recipe, assetPackage, environmentMode, bounds),
|
||||
presentation: presentationFor(recipe, assetPackage, environmentMode, bounds, runtimeOverride.presentation),
|
||||
assets: {
|
||||
visual: assetPackage.visual.map(assetChunk),
|
||||
collision: assetPackage.collision.map(assetChunk),
|
||||
@@ -1979,7 +2004,13 @@ async function compile() {
|
||||
roamingPacks,
|
||||
bosses,
|
||||
objectiveOrder: bosses,
|
||||
navigationLinks: [],
|
||||
navigationLinks: (runtimeOverride.navigationLinks ?? []).map((link) => ({
|
||||
id: String(link.id),
|
||||
start: vector(link.start),
|
||||
end: vector(link.end),
|
||||
bidirectional: link.bidirectional !== false,
|
||||
authoredReason: String(link.authoredReason),
|
||||
})),
|
||||
encounters: [compileBossProgressionEncounter(recipe, bosses, syntheticTrash)],
|
||||
serverGameObjects,
|
||||
provenance: {
|
||||
@@ -2009,8 +2040,17 @@ async function compile() {
|
||||
},
|
||||
validation: {
|
||||
status: "unvalidated",
|
||||
...(runtimeOverride.validation?.navigation
|
||||
? { navigation: runtimeOverride.validation.navigation }
|
||||
: {}),
|
||||
...(runtimeOverride.validation?.report
|
||||
? { report: runtimeOverride.validation.report }
|
||||
: {}),
|
||||
blockers: [],
|
||||
warnings: sourceWarnings,
|
||||
warnings: [
|
||||
...sourceWarnings,
|
||||
...(runtimeOverride.validation?.warnings ?? []),
|
||||
],
|
||||
},
|
||||
});
|
||||
coverage.push({
|
||||
|
||||
Reference in new issue
Block a user