58 lines
1.3 KiB
TypeScript
58 lines
1.3 KiB
TypeScript
|
|
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;
|
||
|
|
}
|