Release v0.1.3 2026-07-11
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
import type { BossMotionState, WorldPosition } from "./types";
|
||||
|
||||
export const ARENA_CENTER: WorldPosition = [0, -1];
|
||||
export const ARENA_RADIUS = 8.35;
|
||||
export const ARENA_WALL_RADIUS = 9.55;
|
||||
|
||||
export function clampToArena(position: WorldPosition, padding = 0): WorldPosition {
|
||||
const radius = Math.max(0, ARENA_RADIUS - padding);
|
||||
const dx = position[0] - ARENA_CENTER[0];
|
||||
const dz = position[1] - ARENA_CENTER[1];
|
||||
const distance = Math.hypot(dx, dz);
|
||||
if (distance <= radius || distance < 0.0001) return [position[0], position[1]];
|
||||
const scale = radius / distance;
|
||||
return [ARENA_CENTER[0] + dx * scale, ARENA_CENTER[1] + dz * scale];
|
||||
}
|
||||
|
||||
export function constrainBossMotion(motion: BossMotionState): BossMotionState {
|
||||
return {
|
||||
...motion,
|
||||
position: clampToArena(motion.position),
|
||||
chargeStart: clampToArena(motion.chargeStart),
|
||||
chargeEnd: clampToArena(motion.chargeEnd),
|
||||
pounceCenter: clampToArena(motion.pounceCenter),
|
||||
};
|
||||
}
|
||||
|
||||
export function isInsideArena(position: WorldPosition, tolerance = 0.001) {
|
||||
return Math.hypot(position[0] - ARENA_CENTER[0], position[1] - ARENA_CENTER[1]) <= ARENA_RADIUS + tolerance;
|
||||
}
|
||||
Reference in New Issue
Block a user