Skip to content
Snippets Groups Projects
Commit 18e09f54 authored by Fang Lu's avatar Fang Lu
Browse files

osufs - add parsing code (pass compilation)

NOT tested
parent 01d0b89a
No related branches found
No related tags found
No related merge requests found
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
2012336E1FCD501200FCBFC8 /* osufs.c in Sources */ = {isa = PBXBuildFile; fileRef = 2012336C1FCD501200FCBFC8 /* osufs.c */; }; 2012336E1FCD501200FCBFC8 /* osufs.c in Sources */ = {isa = PBXBuildFile; fileRef = 2012336C1FCD501200FCBFC8 /* osufs.c */; };
201233711FCD581200FCBFC8 /* blkio.c in Sources */ = {isa = PBXBuildFile; fileRef = 2012336F1FCD581200FCBFC8 /* blkio.c */; }; 201233711FCD581200FCBFC8 /* blkio.c in Sources */ = {isa = PBXBuildFile; fileRef = 2012336F1FCD581200FCBFC8 /* blkio.c */; };
204F28171FDDED7A0055EADC /* fontenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 204F28151FDDED7A0055EADC /* fontenc.c */; }; 204F28171FDDED7A0055EADC /* fontenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 204F28151FDDED7A0055EADC /* fontenc.c */; };
204F281F1FDE03DF0055EADC /* osu_object_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 204F281D1FDE02D10055EADC /* osu_object_parser.cpp */; };
20CF18C41FD3E42700D49D75 /* imgenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 20CF18C21FD3E42700D49D75 /* imgenc.c */; }; 20CF18C41FD3E42700D49D75 /* imgenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 20CF18C21FD3E42700D49D75 /* imgenc.c */; };
20CF19421FD3EFAA00D49D75 /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = 20CF19261FD3EFAA00D49D75 /* adler32.c */; }; 20CF19421FD3EFAA00D49D75 /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = 20CF19261FD3EFAA00D49D75 /* adler32.c */; };
20CF19431FD3EFAA00D49D75 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 20CF19281FD3EFAA00D49D75 /* compress.c */; }; 20CF19431FD3EFAA00D49D75 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 20CF19281FD3EFAA00D49D75 /* compress.c */; };
...@@ -106,6 +107,9 @@ ...@@ -106,6 +107,9 @@
201233701FCD581200FCBFC8 /* blkio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = blkio.h; sourceTree = "<group>"; }; 201233701FCD581200FCBFC8 /* blkio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = blkio.h; sourceTree = "<group>"; };
204F28151FDDED7A0055EADC /* fontenc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = fontenc.c; sourceTree = "<group>"; }; 204F28151FDDED7A0055EADC /* fontenc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = fontenc.c; sourceTree = "<group>"; };
204F28161FDDED7A0055EADC /* fontenc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fontenc.h; sourceTree = "<group>"; }; 204F28161FDDED7A0055EADC /* fontenc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fontenc.h; sourceTree = "<group>"; };
204F281C1FDE02D10055EADC /* osu_object_includes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = osu_object_includes.h; sourceTree = "<group>"; };
204F281D1FDE02D10055EADC /* osu_object_parser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = osu_object_parser.cpp; sourceTree = "<group>"; };
204F281E1FDE02D10055EADC /* osu_object_parser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = osu_object_parser.h; sourceTree = "<group>"; };
20CF18C21FD3E42700D49D75 /* imgenc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = imgenc.c; sourceTree = "<group>"; }; 20CF18C21FD3E42700D49D75 /* imgenc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = imgenc.c; sourceTree = "<group>"; };
20CF18C31FD3E42700D49D75 /* imgenc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = imgenc.h; sourceTree = "<group>"; }; 20CF18C31FD3E42700D49D75 /* imgenc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = imgenc.h; sourceTree = "<group>"; };
20CF19211FD3EF7D00D49D75 /* libzlib.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libzlib.a; sourceTree = BUILT_PRODUCTS_DIR; }; 20CF19211FD3EF7D00D49D75 /* libzlib.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libzlib.a; sourceTree = BUILT_PRODUCTS_DIR; };
...@@ -233,10 +237,21 @@ ...@@ -233,10 +237,21 @@
20CF19D91FD4AD8D00D49D75 /* osu.h */, 20CF19D91FD4AD8D00D49D75 /* osu.h */,
204F28151FDDED7A0055EADC /* fontenc.c */, 204F28151FDDED7A0055EADC /* fontenc.c */,
204F28161FDDED7A0055EADC /* fontenc.h */, 204F28161FDDED7A0055EADC /* fontenc.h */,
204F281B1FDE02D10055EADC /* osu_object_analyze */,
); );
path = osufs; path = osufs;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
204F281B1FDE02D10055EADC /* osu_object_analyze */ = {
isa = PBXGroup;
children = (
204F281C1FDE02D10055EADC /* osu_object_includes.h */,
204F281D1FDE02D10055EADC /* osu_object_parser.cpp */,
204F281E1FDE02D10055EADC /* osu_object_parser.h */,
);
path = osu_object_analyze;
sourceTree = "<group>";
};
20CF19251FD3EFAA00D49D75 /* zlib */ = { 20CF19251FD3EFAA00D49D75 /* zlib */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
...@@ -450,6 +465,7 @@ ...@@ -450,6 +465,7 @@
20CF19D71FD49C7E00D49D75 /* wavenc.c in Sources */, 20CF19D71FD49C7E00D49D75 /* wavenc.c in Sources */,
201233711FCD581200FCBFC8 /* blkio.c in Sources */, 201233711FCD581200FCBFC8 /* blkio.c in Sources */,
2012336E1FCD501200FCBFC8 /* osufs.c in Sources */, 2012336E1FCD501200FCBFC8 /* osufs.c in Sources */,
204F281F1FDE03DF0055EADC /* osu_object_parser.cpp in Sources */,
20CF19D11FD3F79400D49D75 /* libpng-wrapper.c in Sources */, 20CF19D11FD3F79400D49D75 /* libpng-wrapper.c in Sources */,
2012336B1FCD4FC400FCBFC8 /* main.cpp in Sources */, 2012336B1FCD4FC400FCBFC8 /* main.cpp in Sources */,
204F28171FDDED7A0055EADC /* fontenc.c in Sources */, 204F28171FDDED7A0055EADC /* fontenc.c in Sources */,
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "blkio.h" #include "blkio.h"
#include "osufs.h" #include "osufs.h"
#include "osu.h" #include "osu.h"
#include "osu_object_includes.h"
#define IO_BUFLEN 1024 #define IO_BUFLEN 1024
...@@ -28,6 +29,8 @@ int main(int argc, char *argv[]) { ...@@ -28,6 +29,8 @@ int main(int argc, char *argv[]) {
// Self-checks // Self-checks
assert(sizeof(osu_meta) == 512 && "Invalid osu_meta struct size"); assert(sizeof(osu_meta) == 512 && "Invalid osu_meta struct size");
assert(sizeof(osu_song) == 512 && "Invalid osu_song struct size"); assert(sizeof(osu_song) == 512 && "Invalid osu_song struct size");
assert(sizeof(elem_hit_circle) == 32 && "Invalid elem_hit_circle size");
assert(sizeof(elem_spinner) == 32 && "Invalid elem_spinner size");
mdev *dev = blkio_open(argv[1]); mdev *dev = blkio_open(argv[1]);
if (!dev) { if (!dev) {
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#include "wavenc.h" #include "wavenc.h"
#include "fontenc.h" #include "fontenc.h"
#include "osu_object_parser.h"
#define ISHOT(ptr) (((uint8_t*)ptr)[0]==0xcc) #define ISHOT(ptr) (((uint8_t*)ptr)[0]==0xcc)
using namespace std; using namespace std;
...@@ -556,8 +558,7 @@ int osu_parse_colors(char *line, osu_song *song, ...@@ -556,8 +558,7 @@ int osu_parse_colors(char *line, osu_song *song,
int osu_parse_hitobjs(char *line, osu_song *song, int osu_parse_hitobjs(char *line, osu_song *song,
mdev *dev, osu_meta *meta, osu_dir *cont) { mdev *dev, osu_meta *meta, osu_dir *cont) {
// return osu_parse_hit_object(line,song); return osu_parse_hit_object(line,song);
return 0;
} }
char *osu_util_str_split(char *line, char delim) { char *osu_util_str_split(char *line, char delim) {
......
...@@ -2,52 +2,51 @@ ...@@ -2,52 +2,51 @@
#define OSU_OBJECT_INCLUDES_H_ #define OSU_OBJECT_INCLUDES_H_
#include<inttypes> #include <inttypes.h>
typedef struct __attribute__((__packed__)) hit_circle_t{ typedef struct __attribute__((__packed__)) hit_circle_t{
//32 Byte //32 Byte
char type, uint16_t x,y;
uint_16t x,y, uint32_t start_timing;
uint_32t start_timing, uint32_t check_timing;
uint_32t check_timing, uint32_t disappear_timing;
uint_32t disappear_timing, //uint32_t end_timing,
//uint_32t end_timing, uint32_t reserved;
uint_16t hit_radius, uint16_t hit_radius;
uint_16t approach_radius, uint16_t approach_radius;
uint_16t gradient_color1, uint16_t approach_rate;
uint_16t gradient_color2, uint16_t gradient_color1;
uint_16t stroke_color, uint16_t gradient_color2;
uint_8t gradient_direction, uint8_t gradient_direction;
uint_32t reserved char type;
} elem_hit_circle;
}elem_hit_circle;
typedef struct __attribute__((__packed__)) hit_circle_t{ typedef struct __attribute__((__packed__)) hit_spinner_t{
//32 Byte //32 Byte
char type, uint32_t start_timing;
uint_16t x,y, uint32_t disappear_timing;
uint_32t start_timing, uint16_t x,y;
uint_32t disappear_timing, uint16_t radius;
uint_16t radius, uint16_t gradient_color1;
uint_16t gradient_color1, uint16_t gradient_color2;
uint_16t gradient_color2, uint16_t stroke_color;
uint_16t stroke_color, uint8_t gradient_direction;
uint_8t gradient_direction, char padding[10];
char padding[10] char type;
}elem_spinner; } elem_spinner;
/*typedef struct __attribute__((__packed__)) rect_slider_t{ /*typedef struct __attribute__((__packed__)) rect_slider_t{
char type; char type;
uint_32t start_timing, uint32_t start_timing,
uint_32t check_timing, uint32_t check_timing,
uint_32t disappear_timing, uint32_t disappear_timing,
//uint_32t end_timing, //uint32_t end_timing,
uint_16t hit_radius, uint16_t hit_radius,
uint_16t approach_radius, uint16_t approach_radius,
uint_16t x1,y1,x2,y2,x3,y3,x4,y4, uint16_t x1,y1,x2,y2,x3,y3,x4,y4,
uint_8t gradient_direction, uint8_t gradient_direction,
uint_32t reserved uint32_t reserved
}elem_rect_slider;*/ }elem_rect_slider;*/
#endif #endif
\ No newline at end of file
#include "osu_object_parser.h" #include "osu_object_parser.h"
using namespace std;
//using std::stoi;
using std::vector;
/*int osu_storyboard_generate(void* buff,osu_song* song){ /*int osu_storyboard_generate(void* buff,osu_song* song){
osu_hit_object* hit_object_list = malloc(65536); osu_hit_object* hit_object_list = malloc(65536);
...@@ -27,23 +24,29 @@ using std::vector; ...@@ -27,23 +24,29 @@ using std::vector;
}*/ }*/
int osu_parse_hit_object(char* line,osu_song* song){ int osu_parse_hit_object(char* line, osu_song* song){
elem_hit_circle* elemn = malloc(32); elem_hit_circle* elemn = (elem_hit_circle*) malloc(sizeof(elem_hit_circle));
vector<string> v; vector<string> v;
string_split(line,",",v); string_split(line,",",v);
sscanf(v[0],"%d",&(elemn->x));
sscanf(v[1],"%d",&(elemn->y)); #pragma clang diagnostic push
#pragma clang diagnostic ignored "-Waddress-of-packed-member"
sscanf(v[0].c_str(),"%hd",&(elemn->x));
sscanf(v[1].c_str(),"%hd",&(elemn->y));
#pragma clang diagnostic pop
//type //type
char t_type; char t_type;
sscanf(v[3],"%c",&t_type); sscanf(v[3].c_str(),"%c",&t_type);
//color handle //color handle
if (t_type & 0x04){ if (t_type & 0x04){
//combo analysis //combo analysis
++combo_count; song->combo_colors_start++;
combo_count += (t_type>>4); song->combo_colors_start += (t_type>>4);
combo_count %= (song->combo_colors_count); song->combo_colors_start %= (song->combo_colors_count);
} }
int combo_count = song->combo_colors_start;
if (t_type & 0x01) t_type = 'h'; if (t_type & 0x01) t_type = 'h';
if (t_type & 0x02) t_type = 'l'; if (t_type & 0x02) t_type = 'l';
if (t_type & 0x08) t_type = 's'; if (t_type & 0x08) t_type = 's';
...@@ -55,30 +58,29 @@ int osu_parse_hit_object(char* line,osu_song* song){ ...@@ -55,30 +58,29 @@ int osu_parse_hit_object(char* line,osu_song* song){
//hit sound //hit sound
//elemn->hit_sound = stoi(v[4]); // //elemn->hit_sound = stoi(v[4]); //
elemn->hit_sound = 1; // elemn->hit_sound = 1; // TODO
//handle timing stuff //handle timing stuff
int temp_c; int temp_c = 0;
switch (t_type){ switch (t_type){
case 'h': case 'h':
temp_c=osu_parse_hit_circle(v,elemn,song); temp_c=osu_parse_hit_circle(v,elemn,song);
break; break;
case 'l': case 'l':
return 0; // temp_c=osu_parse_slider(v,elemn,song); // TODO
temp_c=osu_parse_slider(v,elemn,song);
break; break;
case 's': case 's':
temp_c=osu_parse_spinner(v,elemn,song); temp_c=osu_parse_spinner(v,(elem_spinner *)elemn,song);
break; break;
} }
//update count and data block //update count and data block
if (song->storyboard){ if (song->storyboard){
song->storyboard = malloc(4+4+32*temp_c); song->storyboard = (uint8_t *) malloc(4+4+32*temp_c);
*((uint32_t*)(song->storyboard)) = 0b01110010011001010110000101101100; *((uint32_t*)(song->storyboard)) = 0b01110010011001010110000101101100;
*((uint32_t*)(song->storyboard)+1) = temp_c; *((uint32_t*)(song->storyboard)+1) = temp_c;
memcpy(song->storyboard+8,elemn,32*temp_c); memcpy(song->storyboard+8,elemn,32*temp_c);
}else{ }else{
song->storyboard = realloc(song->storyboard,4+4+ song->storyboard = (uint8_t *) realloc(song->storyboard,4+4+
32*(temp_c+(*((uint32_t*)(song->storyboard)+1)))); 32*(temp_c+(*((uint32_t*)(song->storyboard)+1))));
*((uint32_t*)(song->storyboard)+1) += temp_c; *((uint32_t*)(song->storyboard)+1) += temp_c;
memcpy(song->storyboard+8+32*(*((uint32_t*)(song->storyboard)+1)),elemn,32*temp_c); memcpy(song->storyboard+8+32*(*((uint32_t*)(song->storyboard)+1)),elemn,32*temp_c);
...@@ -99,23 +101,30 @@ void string_split(char* dup, const char* delim, vector<string> & v){ ...@@ -99,23 +101,30 @@ void string_split(char* dup, const char* delim, vector<string> & v){
int osu_parse_hit_circle(vector<string>& v, elem_hit_circle* elemn,osu_song* song){ int osu_parse_hit_circle(vector<string>& v, elem_hit_circle* elemn,osu_song* song){
// - 140 * approach rate + 1800 // - 140 * approach rate + 1800
sscanf(v[2],"%ld",&(elemn -> check_timing)); #pragma clang diagnostic push
elemn -> start_timing = check_timing - ((osu_song->approach_rate*(-140))+1800); #pragma clang diagnostic ignored "-Waddress-of-packed-member"
elemn -> disappear_timing = check_timing + (200-(osu_song->difficulty)*10); sscanf(v[2].c_str(),"%d",&(elemn -> check_timing));
#pragma clang diagnostic pop
elemn -> start_timing = elemn -> check_timing - ((song->approach_rate*(-140))+1800);
elemn -> disappear_timing = elemn -> check_timing + (200-(song->difficulty)*10);
//TBD //TBD
//elemn -> end_timing //elemn -> end_timing
elemn -> hit_radius = 100 - (osu_song ->difficulty) * 4; elemn -> hit_radius = 100 - (song ->difficulty) * 4;
elemn -> approach_radius = 3*(elemn->hit_radius); elemn -> approach_radius = 3*(elemn->hit_radius);
elemn -> approach_rate = (elemn->approach_radius-elemn->hit_radius)/(elemn->check_timing-elemn->start_timing); elemn -> approach_rate = (elemn->approach_radius-elemn->hit_radius)/(elemn->check_timing-elemn->start_timing);
elemn -> stroke_color = 0xFFFF;
return 1;
} }
int osu_parse_spinner(vector<string>& v, elem_spinner* elemn,osu_song* song){ int osu_parse_spinner(vector<string>& v, elem_spinner* elemn,osu_song* song){
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Waddress-of-packed-member"
//elemn -> start_timing = v[2]; //elemn -> start_timing = v[2];
sscanf(v[2],"%ld",&(elemn -> start_timing)); sscanf(v[2].c_str(),"%d",&(elemn -> start_timing));
//elemn -> disappear_timing = v[5]; //elemn -> disappear_timing = v[5];
sscanf(v[5],"%ld",&(elemn -> disappear_timing)); sscanf(v[5].c_str(),"%d",&(elemn -> disappear_timing));
return 1;
#pragma clang diagnostic pop
} }
/*int osu_parse_slider(vector<string>& v, elemn_spinner* elemn,osu_song* song){ /*int osu_parse_slider(vector<string>& v, elemn_spinner* elemn,osu_song* song){
...@@ -127,4 +136,4 @@ int osu_parse_spinner(vector<string>& v, elem_spinner* elemn,osu_song* song){ ...@@ -127,4 +136,4 @@ int osu_parse_spinner(vector<string>& v, elem_spinner* elemn,osu_song* song){
}else{ }else{
return 0; return 0;
} }
}*/ }*/
\ No newline at end of file
...@@ -3,16 +3,18 @@ ...@@ -3,16 +3,18 @@
#include "osu_object_includes.h" #include "osu_object_includes.h"
#include <vector.h> #include <vector>
#include <string> #include <string>
#include "osufs.h"
//int osu_storyboard_generate(void* buff,osu_song* song); //int osu_storyboard_generate(void* buff,osu_song* song);
int osu_parse_hit_object(char* line,osu_hit_object* elemn,osu_song* song); int osu_parse_hit_object(char* line, osu_song* song);
void string_split(char* dup, const char* delim, vector<string> & v); void string_split(char* dup, const char* delim, std::vector<std::string> & v);
int osu_parse_hit_circle(vector<string>& v, elemn_hit_circle* elemn,osu_song* song); int osu_parse_hit_circle(std::vector<std::string>& v, elem_hit_circle* elemn,osu_song* song);
int osu_parse_spinner(vector<string>& v, elemn_spinner* elemn,osu_song* song); int osu_parse_spinner(std::vector<std::string>& v, elem_spinner* elemn,osu_song* song);
#endif #endif
\ No newline at end of file
...@@ -228,9 +228,9 @@ extern "C" { ...@@ -228,9 +228,9 @@ extern "C" {
uint16_t stack_leniency; // 78 - 79 uint16_t stack_leniency; // 78 - 79
//for analyze side only //for analyze side only
uint8_t combo_colors_count; //80 - 80 uint8_t combo_colors_count; // 80 - 80
uint8_t combo_colors_start; //81 - 81 uint8_t combo_colors_start; // 81 - 81
void* storyboard; //82 - 89 uint8_t *storyboard; // 82 - 89
char _padding[230]; // 90 - 319 char _padding[230]; // 90 - 319
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment