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