nise/nise-frontend/src/corelib/components/replay-viewer/decode-beatmap.ts

58 lines
1.3 KiB
TypeScript
Raw Normal View History

2024-02-29 02:02:14 +00:00
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;
}