Skip to content
Snippets Groups Projects
Commit 2cc144d6 authored by Jumbo's avatar Jumbo
Browse files

hit_object working except sliders

parent 4622c78e
No related branches found
No related tags found
No related merge requests found
......@@ -409,12 +409,14 @@ int osu_parse_colors(char *line, osu_song *song,
song->combo_colors[n][1] = g;
song->combo_colors[n][2] = b;
song->combo_colors_count = n + 1;
song->combo_colors_start = n;
return 0;
}
int osu_parse_hitobjs(char *line, osu_song *song,
mdev *dev, osu_meta *meta, osu_dir *cont) {
return 0;
return osu_parse_hit_object(line,song);
}
char *osu_util_str_split(char *line, char delim) {
......
......@@ -16,6 +16,8 @@
#include <string>
#include "osufs.h"
#include "osu_object_parser.h"
typedef struct osu_dir_t {
char dirname[512];
DIR *dir;
......
......@@ -2,13 +2,13 @@
#include "osu_object_parser.h"
using std::stoi;
//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);
uint32_t object_count=0,temp;
while (/*get line*/){
while (){
temp = osu_parse_hit_object(line,hit_object_list+object_count,song){
if (temp==-1) {
printf("parsing failed!\n");
......@@ -24,20 +24,19 @@ int osu_storyboard_generate(void* buff,osu_song* song){
memcpy(buff,hit_object_list,(object_count*32));
free(hit_object_list);
return 0;
}
}*/
int osu_parse_hit_object(char* line,osu_hit_object* elemn,osu_song* song){
int combo_count=(song->combo_colors_count-1);
int osu_parse_hit_object(char* line,osu_song* song){
elem_hit_circle* elemn = malloc(32);
vector<string> v;
string_split(line,",",v);
elemn->x = stoi(v[0]);
elemn->y = stoi(v[1]);
sscanf(v[0],"%d",&(elemn->x));
sscanf(v[1],"%d",&(elemn->y));
//type
char t_type = stoi(v[3]);
char t_type;
sscanf(v[3],"%c",&t_type);
//color handle
if (t_type & 0x04){
//combo analysis
......@@ -48,28 +47,44 @@ int osu_parse_hit_object(char* line,osu_hit_object* elemn,osu_song* song){
if (t_type & 0x01) t_type = 'h';
if (t_type & 0x02) t_type = 'l';
if (t_type & 0x08) t_type = 's';
elemn->type = t_type;
elemn -> type = t_type;
elemn -> gradient_color1 = /*conversion*/(song->combo_colors[combo_count]);
elemn -> gradient_color1 = ((song->combo_colors[combo_count][0]&0b11111000)<<11)
|((song->combo_colors[combo_count][1]&0b11111100)<<5)
|((song->combo_colors[combo_count][2]&0b11111000));
//hit sound
//elemn->hit_sound = stoi(v[4]); //
elemn->hit_sound = 1;
//handle timing stuff
int temp_c;
switch (t_type){
case 'h':
osu_parse_hit_circle(v,elemn,song);
return 1;
temp_c=osu_parse_hit_circle(v,elemn,song);
break;
case 'l':
return 0;
return osu_parse_slider(v,elemn,song);
temp_c=osu_parse_slider(v,elemn,song);
break;
case 's':
osu_parse_spinner(v,elemn,song);
return 1;
temp_c=osu_parse_spinner(v,elemn,song);
break;
}
//update count and data block
if (song->storyboard){
song->storyboard = 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+
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);
}
free(elemn);
return 0;
}
void string_split(char* dup, const char* delim, vector<string> & v){
......@@ -82,21 +97,22 @@ void string_split(char* dup, const char* delim, vector<string> & v){
}
}
void osu_parse_hit_circle(vector<string>& v, elemn_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
elemn -> check_timing = v[2];
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);
elemn -> hit_radius = 100 - (osu_song ->difficulty) * 4;
elemn -> approach_radius = 3*(elemn->hit_radius);
elemn -> stroke_color = /**/(0xFFFFFF);
elemn -> stroke_color = 0xFFFF;
}
void osu_parse_spinner(vector<string>& v, elemn_spinner* elemn,osu_song* song){
elemn -> start_timing = v[2];
elemn -> disappear_timing = v[5];
int osu_parse_spinner(vector<string>& v, elem_spinner* elemn,osu_song* song){
//elemn -> start_timing = v[2];
sscanf(v[2],"%ld",&(elemn -> start_timing));
//elemn -> disappear_timing = v[5];
sscanf(v[5],"%ld",&(elemn -> disappear_timing));
}
/*int osu_parse_slider(vector<string>& v, elemn_spinner* elemn,osu_song* song){
......
#ifndef OSU_OBJECT_PARSER_H_
#define OSU_OBJECT_PARSER_H_
int osu_storyboard_generate(void* buff,osu_song* song);
#include "osu_object_includes.h"
#include <vector.h>
#include <string>
//int osu_storyboard_generate(void* buff,osu_song* song);
int osu_parse_hit_object(char* line,osu_hit_object* elemn,osu_song* song);
void string_split(char* dup, const char* delim, vector<string> & v);
void osu_parse_hit_circle(vector<string>& v, elemn_hit_circle* elemn,osu_song* song);
int osu_parse_hit_circle(vector<string>& v, elemn_hit_circle* elemn,osu_song* song);
void osu_parse_spinner(vector<string>& v, elemn_spinner* elemn,osu_song* song);
int osu_parse_spinner(vector<string>& v, elemn_spinner* elemn,osu_song* song);
#endif
\ No newline at end of file
......@@ -17,6 +17,7 @@ extern "C" {
#include <inttypes.h>
#include "blkio.h"
typedef struct __attribute__((__packed__)) osu_meta_t {
char magic[4]; // 0 - 3
uint16_t songs; // 4 - 5
......@@ -143,7 +144,12 @@ extern "C" {
uint16_t audio_leadin; // 76 - 77
uint16_t stack_leniency; // 78 - 79
char _padding[240]; // 80 - 319
//for analyze side only
uint8_t combo_colors_count; //80 - 80
uint8_t combo_colors_start; //81 - 81
void* storyboard; //82 - 89
char _padding[230]; // 90 - 319
char title[64]; // 320 - 383
char artist[64]; // 384 - 447
......
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