Release Healer Man 0.1.5

This commit is contained in:
phenom committed 2026-08-18 16:22:19 -04:00
1 parent f4c9cf356c
commit 55cfd43d66
62 files changed
+3030 -153

No files matched your search

+22 -4
View File
@@ -32,6 +32,7 @@ export type ManastormPhase =
export interface ManastormEncounterDefinition {
readonly id: string;
readonly encounterId?: number;
readonly dungeonId: DungeonId;
/** Authoritative package map identity; dungeonId may only select fallback scene geometry. */
readonly mapId?: number;
@@ -42,9 +43,12 @@ export interface ManastormEncounterDefinition {
readonly bossEntityId: string;
readonly bossName: string;
readonly bossPosition: MobVector3;
readonly bossYaw?: number;
readonly playerSpawn: WorldSpawn;
readonly portalPosition: MobVector3;
readonly trashRuntimeIds?: readonly string[];
readonly requiredGuardianKills?: number;
readonly chaoticLinkEnabled?: boolean;
readonly modeIds?: readonly number[];
readonly stageKind?: ManastormStageKind;
readonly unlockLevel?: number;
@@ -186,9 +190,12 @@ export interface ManastormCatalogEncounterLike {
readonly bossEntityId?: string;
readonly bossName?: string;
readonly bossPosition?: MobVector3;
readonly bossYaw?: number;
readonly playerSpawn?: WorldSpawn;
readonly portalPosition?: MobVector3;
readonly trashRuntimeIds?: readonly string[];
readonly requiredGuardianKills?: number;
readonly chaoticLinkEnabled?: boolean;
readonly stageKind?: ManastormStageKind;
readonly unlockLevel?: number;
readonly milestoneLevel?: ManastormSpecialLevel;
@@ -299,6 +306,15 @@ export interface ManastormCatalogLike {
readonly rewards?: readonly ManastormCatalogRewardLike[];
readonly loadouts?: readonly ManastormCatalogLoadoutLike[];
readonly defaultLoadoutId?: string;
readonly fallbackPolicy?: "legacy" | "none";
readonly runtimeOptions?: {
readonly enabled?: boolean;
readonly levelingEnabled?: boolean;
readonly endgameEnabled?: boolean;
readonly affixesEnabled?: boolean;
readonly chaoticLinkEnabled?: boolean;
readonly milestoneEncountersEnabled?: boolean;
};
readonly scaling?: {
readonly perLevel?: number;
readonly bonusLootPerLevel?: number;
@@ -583,7 +599,7 @@ export function runtimeStages(catalog: ManastormCatalogLike = getManastormCatalo
minimumPartySize: normalizeManastormPartySize(stage.minimumPartySize ?? 1),
maximumPartySize: normalizeManastormPartySize(stage.maximumPartySize ?? 5),
}));
return stages.length ? stages : MANASTORM_ENCOUNTERS;
return stages.length || catalog.fallbackPolicy === "none" ? stages : MANASTORM_ENCOUNTERS;
}
export function drawManastormStage(
@@ -609,7 +625,8 @@ export function drawManastormStage(
&& (stage.minimumPartySize ?? 1) <= safePartySize
&& (stage.maximumPartySize ?? 5) >= safePartySize
));
const special = isManastormSpecialLevel(safeLevel);
const special = catalog.runtimeOptions?.milestoneEncountersEnabled !== false
&& isManastormSpecialLevel(safeLevel);
const milestoneStages = unlocked.filter((stage) => stage.milestoneLevel === safeLevel);
const milestonePool = unlocked.filter((stage) => (
stage.stageKind === "milestone" || stage.milestoneLevel !== undefined
@@ -621,7 +638,7 @@ export function drawManastormStage(
let eligible = special
? (milestoneStages.length ? milestoneStages : milestonePool)
: standardStages;
if (!eligible.length) {
if (!eligible.length && catalog.fallbackPolicy !== "none") {
eligible = MANASTORM_ENCOUNTERS.filter((stage) => (
(stage.unlockLevel ?? 1) <= safeLevel
&& (special
@@ -629,7 +646,7 @@ export function drawManastormStage(
: stage.stageKind !== "milestone" && !stage.milestoneLevel)
));
}
if (!eligible.length) eligible = [MANASTORM_ENCOUNTERS[0]];
if (!eligible.length && catalog.fallbackPolicy !== "none") eligible = [MANASTORM_ENCOUNTERS[0]];
const byId = new Map(eligible.map((stage) => [stage.id, stage]));
let available = bag.filter((id) => byId.has(id));
@@ -839,6 +856,7 @@ export function manastormAffixes(
modeId = manastormModeId(catalog),
unlockedThroughLevel = level,
): readonly ManastormAffixState[] {
if (catalog.runtimeOptions?.affixesEnabled === false) return [];
const safeLevel = Math.max(1, Math.trunc(Number.isFinite(level) ? level : 1));
const safeUnlockedThroughLevel = Math.max(
safeLevel,