export enum HitObjectType { HitCircle = 1, Slider = 2, Spinner = 8 } export type HitObject = { x: number; y: number; time: number; type: number; hitSound: number; objectParams: string; hitSample: string; }; export function parseHitObjects(beatmap: string): any[] { const lines = beatmap.split('\n'); let recording = false; const hitObjects = []; for (const line of lines) { if (line.trim() === '[HitObjects]') { recording = true; continue; } if (!recording) continue; if (line.startsWith('[')) break; const parts = line.split(','); if (parts.length < 5) continue; const type = parseInt(parts[3], 10); const hitObject = { x: parseInt(parts[0], 10), y: parseInt(parts[1], 10), time: parseInt(parts[2], 10), type: getTypeFromFlag(type), hitSound: parseInt(parts[4], 10), objectParams: parts[5], hitSample: parts.length > 6 ? parts[6] : '0:0:0:0:' }; hitObjects.push(hitObject); } return hitObjects; } function getTypeFromFlag(flag: number): HitObjectType | null { if (flag & HitObjectType.HitCircle) return HitObjectType.HitCircle; if (flag & HitObjectType.Slider) return HitObjectType.Slider; if (flag & HitObjectType.Spinner) return HitObjectType.Spinner; return null; }