Release v0.1.3 2026-07-11

This commit is contained in:
Warren H
2026-07-11 23:23:02 -04:00
parent 076f6cf97c
commit b48b3a4f8f
103 changed files with 6708 additions and 454 deletions
+55 -5
View File
@@ -1,6 +1,13 @@
import { BOSS_DEFINITIONS } from "./bossCatalog";
import { clampToArena } from "./arena";
import { advanceCindermawMechanics, createCindermawMotion, createCindermawState, upcomingCindermawMechanic } from "./bosses/cindermaw";
import { advanceCinderbackMechanics, createCinderbackMotion, createCinderbackState, upcomingCinderbackMechanic } from "./bosses/cinderbackRicochet";
import { advanceCragclawMechanics, createCragclawMotion, createCragclawState, upcomingCragclawMechanic } from "./bosses/cragclawCrab";
import { advanceCrownshardMechanics, createCrownshardMotion, createCrownshardState, upcomingCrownshardMechanic } from "./bosses/crownshardGolem";
import { advanceEmberMantisMechanics, createEmberMantisMotion, createEmberMantisState, upcomingEmberMantisMechanic } from "./bosses/emberMantis";
import { advanceMournveilMechanics, createMournveilMotion, createMournveilState, upcomingMournveilMechanic } from "./bosses/mournveilGhost";
import { advanceObsidianRamMechanics, createObsidianRamMotion, createObsidianRamState, upcomingObsidianRamMechanic } from "./bosses/obsidianRamGolem";
import { advanceSandglassMechanics, createSandglassMotion, createSandglassState, upcomingSandglassMechanic } from "./bosses/sandglassScorpion";
import { createBaseMotion } from "./bosses/shared";
import type { BossMechanicContext, BossMechanicEvent, BossMechanicResult } from "./bosses/types";
import { advanceVexaMechanics, createVexaMotion, createVexaState, dropVexaVenomPool, upcomingVexaMechanic } from "./bosses/vexa";
@@ -24,7 +31,7 @@ export const BULL_POUNCE = {
afterCharges: 3,
stackDuration: 5,
stackRadius: 2.2,
sharedDamage: 300,
sharedDamage: 200,
leapDuration: 0.55,
} as const;
@@ -41,6 +48,25 @@ export function createBossState(bossId: BossId = "bulldrome"): BossState {
if (bossId === "vexa") return createVexaState();
if (bossId === "cindermaw") return createCindermawState();
if (bossId === "ember-mantis-duelist") return createEmberMantisState();
if (bossId === "obsidian-ram-golem") return createObsidianRamState();
if (bossId === "cinderback-ricochet") return createCinderbackState();
if (bossId === "sandglass-scorpion") return createSandglassState();
if (bossId === "cragclaw-crab") return createCragclawState();
if (bossId === "mournveil-ghost") return createMournveilState();
if (bossId === "crownshard-golem") return createCrownshardState();
if (bossId === "pumpking-king-of-ghosts" || bossId === "blue-eyes-ultimate-dragon") {
const definition = BOSS_DEFINITIONS[bossId];
return {
id: definition.id,
name: definition.name,
maxHp: definition.maxHp,
hp: definition.maxHp,
nextMeleeAt: bossId === "pumpking-king-of-ghosts" ? 2.35 : 2.4,
nextNovaAt: Number.POSITIVE_INFINITY,
nextBrandAt: Number.POSITIVE_INFINITY,
brandCount: 0,
};
}
const definition = BOSS_DEFINITIONS.bulldrome;
return {
id: "bulldrome",
@@ -58,6 +84,14 @@ export function createBossMotionState(bossId: BossId = "bulldrome"): BossMotionS
if (bossId === "vexa") return createVexaMotion();
if (bossId === "cindermaw") return createCindermawMotion();
if (bossId === "ember-mantis-duelist") return createEmberMantisMotion();
if (bossId === "obsidian-ram-golem") return createObsidianRamMotion();
if (bossId === "cinderback-ricochet") return createCinderbackMotion();
if (bossId === "sandglass-scorpion") return createSandglassMotion();
if (bossId === "cragclaw-crab") return createCragclawMotion();
if (bossId === "mournveil-ghost") return createMournveilMotion();
if (bossId === "crownshard-golem") return createCrownshardMotion();
if (bossId === "pumpking-king-of-ghosts") return { ...createMournveilMotion(), bossId };
if (bossId === "blue-eyes-ultimate-dragon") return { ...createCrownshardMotion(), bossId };
return {
...createBaseMotion("bulldrome"),
mode: "holding",
@@ -80,10 +114,10 @@ function chargeEndpoint(start: WorldPosition, target: WorldPosition): WorldPosit
const dx = target[0] - start[0];
const dz = target[1] - start[1];
const length = Math.max(0.001, Math.hypot(dx, dz));
return [
Math.max(-7.3, Math.min(7.3, start[0] + (dx / length) * BULL_CHARGE.distance)),
Math.max(-8.8, Math.min(7.1, start[1] + (dz / length) * BULL_CHARGE.distance)),
];
return clampToArena([
start[0] + (dx / length) * BULL_CHARGE.distance,
start[1] + (dz / length) * BULL_CHARGE.distance,
]);
}
function livingMember(party: PartyMember[], memberId: MemberId) {
@@ -352,6 +386,14 @@ export function advanceBossMechanics(context: BossMechanicContext): BossMechanic
if (context.boss.id === "vexa") return advanceVexaMechanics(context);
if (context.boss.id === "cindermaw") return advanceCindermawMechanics(context);
if (context.boss.id === "ember-mantis-duelist") return advanceEmberMantisMechanics(context);
if (context.boss.id === "obsidian-ram-golem") return advanceObsidianRamMechanics(context);
if (context.boss.id === "cinderback-ricochet") return advanceCinderbackMechanics(context);
if (context.boss.id === "sandglass-scorpion") return advanceSandglassMechanics(context);
if (context.boss.id === "cragclaw-crab") return advanceCragclawMechanics(context);
if (context.boss.id === "mournveil-ghost") return advanceMournveilMechanics(context);
if (context.boss.id === "crownshard-golem") return advanceCrownshardMechanics(context);
if (context.boss.id === "pumpking-king-of-ghosts") return advanceMournveilMechanics(context);
if (context.boss.id === "blue-eyes-ultimate-dragon") return advanceCrownshardMechanics(context);
return advanceBulldromeMechanics(context);
}
@@ -376,6 +418,14 @@ export function upcomingMechanic(boss: BossState, motion: BossMotionState, time:
if (boss.id === "vexa") return upcomingVexaMechanic(boss, motion, time);
if (boss.id === "cindermaw") return upcomingCindermawMechanic(boss, motion, time);
if (boss.id === "ember-mantis-duelist") return upcomingEmberMantisMechanic(boss, motion, time);
if (boss.id === "obsidian-ram-golem") return upcomingObsidianRamMechanic(boss, motion, time);
if (boss.id === "cinderback-ricochet") return upcomingCinderbackMechanic(boss, motion, time);
if (boss.id === "sandglass-scorpion") return upcomingSandglassMechanic(boss, motion, time);
if (boss.id === "cragclaw-crab") return upcomingCragclawMechanic(boss, motion, time);
if (boss.id === "mournveil-ghost") return upcomingMournveilMechanic(boss, motion, time);
if (boss.id === "crownshard-golem") return upcomingCrownshardMechanic(boss, motion, time);
if (boss.id === "pumpking-king-of-ghosts") return upcomingMournveilMechanic(boss, motion, time);
if (boss.id === "blue-eyes-ultimate-dragon") return upcomingCrownshardMechanic(boss, motion, time);
if (motion.mode === "telegraph") {
return { name: "Bull Charge", remaining: Math.max(0, motion.phaseEndsAt - time), cycle: BULL_CHARGE.telegraphDuration, urgent: true };
}