-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbeatmap.js
More file actions
93 lines (81 loc) · 2.56 KB
/
beatmap.js
File metadata and controls
93 lines (81 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
var beatmap = {
width:512, // osu! ref.
height:384,
datalist:null,
nextbeat:0 // next note in datalist to beat
};
var defaultRadius = 10.0;
function stringArrayToIntArray(stringArray){
var intArray=new Array(stringArray.length);
for(var i=0;i<stringArray.length;i++)
intArray[i]=parseInt(stringArray[i]);
return intArray;
}
function parseStandardOsuMap(osuData){
beatmap.datalist=new Array();
var mapInfo=osuData.split("\n");
//console.log(mapInfo);
// get BPM, naive method
var BPM=100;
for(var i=0;i<mapInfo.length;i++){
if(mapInfo[i]=="[TimingPoints]"){
BPM=60000/parseFloat(mapInfo[i+1].split(",")[1]);
break;
}
}
// get Slider Multiplier
var sliderMultiplier=1;
for(var i=0;i<mapInfo.length;i++){
if(mapInfo[i].slice(0,17)=="SliderMultiplier:"){
sliderMultiplier=parseFloat(mapInfo[i].split(":")[1]);
break;
}
}
// get items
var startPos; // where item data starts
for(startPos=0;startPos<mapInfo.length;startPos++){
if(mapInfo[startPos]=="[HitObjects]"){
break;
}
}
var ratioW=canvasW/beatmap.width;
var ratioH=canvasH/beatmap.height;
var isWidthFit=ratioW<ratioH;
var ratioB=isWidthFit?ratioW:ratioH;
for(var i=startPos+1;i<mapInfo.length;i++){
var hitItem=mapInfo[i];
if(hitItem.length==0)break;
//console.log(hitItem);
var itemParams=hitItem.split(",");
var startParams=[
parseInt(itemParams[0])*ratioB,
parseInt(itemParams[1])*ratioB,
parseInt(itemParams[2])];
if(itemParams.length>7){ // slide
// get ending point
var coords=itemParams[5].split("|");
var lastCoordStr=coords[coords.length-1].split(":");
var lastCoordX=parseInt(lastCoordStr[0])*ratioB;
var lastCoordY=parseInt(lastCoordStr[1])*ratioB;
// get duration
var slideLength=parseFloat(itemParams[7]);
var slideTime=slideLength*(600/BPM)/sliderMultiplier;
startParams.push(lastCoordX,lastCoordY,slideTime);
beatInt = startParams;
var length = Math.sqrt(Math.pow(beatInt[0] - beatInt[3], 2.0) + Math.pow(beatInt[1] - beatInt[4], 2.0));
beginx = beatInt[0] + (beatInt[3] - beatInt[0]) * defaultRadius / length;
beginy = beatInt[1] + (beatInt[4] - beatInt[1]) * defaultRadius / length;
endx = beatInt[0] + (beatInt[3] - beatInt[0]) * (length - defaultRadius) / length;
endy = beatInt[1] + (beatInt[4] - beatInt[1]) * (length - defaultRadius) / length;
startParams.push(beginx, beginy, endx, endy);
}
beatmap.datalist.push(startParams);
}
}
function parseBeatmap(data,status){
console.log(status);
if(data){
parseStandardOsuMap(data);
start();
}
}