diff --git a/osufs/osufs.xcodeproj/project.pbxproj b/osufs/osufs.xcodeproj/project.pbxproj index 326b3551d6e2ced80d5f5803a675dc7f8020c7bc..e09370d78dafeca03deb00d86a3d1ef9fd210c88 100644 --- a/osufs/osufs.xcodeproj/project.pbxproj +++ b/osufs/osufs.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 2012336E1FCD501200FCBFC8 /* osufs.c in Sources */ = {isa = PBXBuildFile; fileRef = 2012336C1FCD501200FCBFC8 /* osufs.c */; }; 201233711FCD581200FCBFC8 /* blkio.c in Sources */ = {isa = PBXBuildFile; fileRef = 2012336F1FCD581200FCBFC8 /* blkio.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 */; }; 20CF19421FD3EFAA00D49D75 /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = 20CF19261FD3EFAA00D49D75 /* adler32.c */; }; 20CF19431FD3EFAA00D49D75 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 20CF19281FD3EFAA00D49D75 /* compress.c */; }; @@ -106,6 +107,9 @@ 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>"; }; 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>"; }; 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; }; @@ -233,10 +237,21 @@ 20CF19D91FD4AD8D00D49D75 /* osu.h */, 204F28151FDDED7A0055EADC /* fontenc.c */, 204F28161FDDED7A0055EADC /* fontenc.h */, + 204F281B1FDE02D10055EADC /* osu_object_analyze */, ); path = osufs; 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 */ = { isa = PBXGroup; children = ( @@ -450,6 +465,7 @@ 20CF19D71FD49C7E00D49D75 /* wavenc.c in Sources */, 201233711FCD581200FCBFC8 /* blkio.c in Sources */, 2012336E1FCD501200FCBFC8 /* osufs.c in Sources */, + 204F281F1FDE03DF0055EADC /* osu_object_parser.cpp in Sources */, 20CF19D11FD3F79400D49D75 /* libpng-wrapper.c in Sources */, 2012336B1FCD4FC400FCBFC8 /* main.cpp in Sources */, 204F28171FDDED7A0055EADC /* fontenc.c in Sources */, diff --git a/osufs/osufs/main.cpp b/osufs/osufs/main.cpp index cb977cbbbb50c8408eee86c1dc752b9717059606..6d26e5fabd3dfe3bb2c84e49f1b6127852e225d5 100644 --- a/osufs/osufs/main.cpp +++ b/osufs/osufs/main.cpp @@ -16,6 +16,7 @@ #include "blkio.h" #include "osufs.h" #include "osu.h" +#include "osu_object_includes.h" #define IO_BUFLEN 1024 @@ -28,6 +29,8 @@ int main(int argc, char *argv[]) { // Self-checks assert(sizeof(osu_meta) == 512 && "Invalid osu_meta 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]); if (!dev) { diff --git a/osufs/osufs/osu.cpp b/osufs/osufs/osu.cpp index d09f31a8cd63e9fc8ab93091fcdb6ca5e78ce5d6..2fea11bd0271db14b6be47e5e29b1bcb93f1db71 100644 --- a/osufs/osufs/osu.cpp +++ b/osufs/osufs/osu.cpp @@ -18,6 +18,8 @@ #include "wavenc.h" #include "fontenc.h" +#include "osu_object_parser.h" + #define ISHOT(ptr) (((uint8_t*)ptr)[0]==0xcc) using namespace std; @@ -556,8 +558,7 @@ int osu_parse_colors(char *line, osu_song *song, int osu_parse_hitobjs(char *line, osu_song *song, mdev *dev, osu_meta *meta, osu_dir *cont) { -// return osu_parse_hit_object(line,song); - return 0; + return osu_parse_hit_object(line,song); } char *osu_util_str_split(char *line, char delim) { diff --git a/osufs/osufs/osu_object_analyze/osu_object_includes.h b/osufs/osufs/osu_object_analyze/osu_object_includes.h index 62e97acd6204b55ce50077bce72629d85d03145a..1ab8e9fc40110b6562b363790650347a13e80b3b 100644 --- a/osufs/osufs/osu_object_analyze/osu_object_includes.h +++ b/osufs/osufs/osu_object_analyze/osu_object_includes.h @@ -2,52 +2,51 @@ #define OSU_OBJECT_INCLUDES_H_ -#include<inttypes> +#include <inttypes.h> typedef struct __attribute__((__packed__)) hit_circle_t{ //32 Byte - char type, - uint_16t x,y, - uint_32t start_timing, - uint_32t check_timing, - uint_32t disappear_timing, - //uint_32t end_timing, - uint_16t hit_radius, - uint_16t approach_radius, - uint_16t gradient_color1, - uint_16t gradient_color2, - uint_16t stroke_color, - uint_8t gradient_direction, - uint_32t reserved - -}elem_hit_circle; + uint16_t x,y; + uint32_t start_timing; + uint32_t check_timing; + uint32_t disappear_timing; + //uint32_t end_timing, + uint32_t reserved; + uint16_t hit_radius; + uint16_t approach_radius; + uint16_t approach_rate; + uint16_t gradient_color1; + uint16_t gradient_color2; + uint8_t gradient_direction; + char type; +} elem_hit_circle; -typedef struct __attribute__((__packed__)) hit_circle_t{ +typedef struct __attribute__((__packed__)) hit_spinner_t{ //32 Byte - char type, - uint_16t x,y, - uint_32t start_timing, - uint_32t disappear_timing, - uint_16t radius, - uint_16t gradient_color1, - uint_16t gradient_color2, - uint_16t stroke_color, - uint_8t gradient_direction, - char padding[10] - -}elem_spinner; + uint32_t start_timing; + uint32_t disappear_timing; + uint16_t x,y; + uint16_t radius; + uint16_t gradient_color1; + uint16_t gradient_color2; + uint16_t stroke_color; + uint8_t gradient_direction; + char padding[10]; + char type; + +} elem_spinner; /*typedef struct __attribute__((__packed__)) rect_slider_t{ char type; - uint_32t start_timing, - uint_32t check_timing, - uint_32t disappear_timing, - //uint_32t end_timing, - uint_16t hit_radius, - uint_16t approach_radius, - uint_16t x1,y1,x2,y2,x3,y3,x4,y4, - uint_8t gradient_direction, - uint_32t reserved + uint32_t start_timing, + uint32_t check_timing, + uint32_t disappear_timing, + //uint32_t end_timing, + uint16_t hit_radius, + uint16_t approach_radius, + uint16_t x1,y1,x2,y2,x3,y3,x4,y4, + uint8_t gradient_direction, + uint32_t reserved }elem_rect_slider;*/ -#endif \ No newline at end of file +#endif diff --git a/osufs/osufs/osu_object_analyze/osu_object_parser.cpp b/osufs/osufs/osu_object_analyze/osu_object_parser.cpp index 2ed38e875739679afbaab619a38af3934cb05aaf..d26440c24c8077378191022c740ab0a9d068ab80 100644 --- a/osufs/osufs/osu_object_analyze/osu_object_parser.cpp +++ b/osufs/osufs/osu_object_analyze/osu_object_parser.cpp @@ -1,9 +1,6 @@ - #include "osu_object_parser.h" - -//using std::stoi; -using std::vector; +using namespace std; /*int osu_storyboard_generate(void* buff,osu_song* song){ osu_hit_object* hit_object_list = malloc(65536); @@ -27,23 +24,29 @@ using std::vector; }*/ -int osu_parse_hit_object(char* line,osu_song* song){ - elem_hit_circle* elemn = malloc(32); +int osu_parse_hit_object(char* line, osu_song* song){ + elem_hit_circle* elemn = (elem_hit_circle*) malloc(sizeof(elem_hit_circle)); vector<string> 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 char t_type; - sscanf(v[3],"%c",&t_type); + sscanf(v[3].c_str(),"%c",&t_type); //color handle if (t_type & 0x04){ //combo analysis - ++combo_count; - combo_count += (t_type>>4); - combo_count %= (song->combo_colors_count); + song->combo_colors_start++; + song->combo_colors_start += (t_type>>4); + 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 & 0x02) t_type = 'l'; if (t_type & 0x08) t_type = 's'; @@ -55,30 +58,29 @@ int osu_parse_hit_object(char* line,osu_song* song){ //hit sound //elemn->hit_sound = stoi(v[4]); // - elemn->hit_sound = 1; +// elemn->hit_sound = 1; // TODO //handle timing stuff - int temp_c; + int temp_c = 0; switch (t_type){ case 'h': temp_c=osu_parse_hit_circle(v,elemn,song); break; case 'l': - return 0; - temp_c=osu_parse_slider(v,elemn,song); +// temp_c=osu_parse_slider(v,elemn,song); // TODO break; case 's': - temp_c=osu_parse_spinner(v,elemn,song); + temp_c=osu_parse_spinner(v,(elem_spinner *)elemn,song); break; } //update count and data block 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)+1) = temp_c; memcpy(song->storyboard+8,elemn,32*temp_c); }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)))); *((uint32_t*)(song->storyboard)+1) += 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){ int osu_parse_hit_circle(vector<string>& v, elem_hit_circle* elemn,osu_song* song){ // - 140 * approach rate + 1800 - sscanf(v[2],"%ld",&(elemn -> check_timing)); - elemn -> start_timing = check_timing - ((osu_song->approach_rate*(-140))+1800); - elemn -> disappear_timing = check_timing + (200-(osu_song->difficulty)*10); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Waddress-of-packed-member" + 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 //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_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){ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Waddress-of-packed-member" //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]; - 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){ @@ -127,4 +136,4 @@ int osu_parse_spinner(vector<string>& v, elem_spinner* elemn,osu_song* song){ }else{ return 0; } -}*/ \ No newline at end of file +}*/ diff --git a/osufs/osufs/osu_object_analyze/osu_object_parser.h b/osufs/osufs/osu_object_analyze/osu_object_parser.h index 9e3e72a94dc6349708ce635887faf061b6c2ade3..7dfec40e1c01121570e00fb76b19c3a3440c967a 100644 --- a/osufs/osufs/osu_object_analyze/osu_object_parser.h +++ b/osufs/osufs/osu_object_analyze/osu_object_parser.h @@ -3,16 +3,18 @@ #include "osu_object_includes.h" -#include <vector.h> +#include <vector> #include <string> +#include "osufs.h" + //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); -#endif \ No newline at end of file +int osu_parse_spinner(std::vector<std::string>& v, elem_spinner* elemn,osu_song* song); +#endif diff --git a/osufs/osufs/osufs.h b/osufs/osufs/osufs.h index 1175f9f370c7b5cc4d62f53623b0d00e0bfac2b1..7a97d15664adaf681d296bcfebc4da71883782e5 100644 --- a/osufs/osufs/osufs.h +++ b/osufs/osufs/osufs.h @@ -228,9 +228,9 @@ extern "C" { uint16_t stack_leniency; // 78 - 79 //for analyze side only - uint8_t combo_colors_count; //80 - 80 - uint8_t combo_colors_start; //81 - 81 - void* storyboard; //82 - 89 + uint8_t combo_colors_count; // 80 - 80 + uint8_t combo_colors_start; // 81 - 81 + uint8_t *storyboard; // 82 - 89 char _padding[230]; // 90 - 319