int sd_animation_load(sd_reader *r, sd_animation *ani) { // Animation header ani->start_x = sd_read_word(r); ani->start_y = sd_read_word(r); sd_read_buf(r, ani->unknown_a, 4); ani->col_coord_count = sd_read_uword(r); ani->frame_count = sd_read_ubyte(r); // Read collision point data ani->col_coord_table = (col_coord*)malloc(sizeof(col_coord)*ani->col_coord_count); uint32_t tmp; int32_t a,b; for(int i = 0; i < ani->col_coord_count; i++) { tmp = sd_read_udword(r); a = tmp & 0xffff; b = (tmp & 0xffff0000) >> 16; ani->col_coord_table[i].x = ((a & 0x3ff) << (6+16)) >> (6+16); ani->col_coord_table[i].x_ext = (a >> 10); ani->col_coord_table[i].y = ((b & 0x3ff) << (6+16)) >> (6+16); ani->col_coord_table[i].y_ext = (b >> 10); } // Animation string header uint16_t anim_string_len = sd_read_uword(r); ani->anim_string = (char*)malloc(anim_string_len + 1); sd_read_buf(r, ani->anim_string, anim_string_len + 1); if(ani->anim_string[anim_string_len] != 0) { return SD_FILE_PARSE_ERROR; } // Extra animation strings ani->extra_string_count = sd_read_ubyte(r); ani->extra_strings = (char**)malloc(sizeof(char*)*ani->extra_string_count); for(int i = 0; i < ani->extra_string_count; i++) { uint16_t size = sd_read_uword(r); ani->extra_strings[i] = malloc(size+1); sd_read_buf(r, ani->extra_strings[i], size+1); if(ani->extra_strings[i][size] != 0) { return SD_FILE_PARSE_ERROR; } } // Sprites ani->sprites = (sd_sprite**)malloc(sizeof(sd_sprite*) * ani->frame_count); for(int i = 0; i < ani->frame_count; i++) { // finally, the actual sprite! ani->sprites[i] = sd_sprite_create(); if(sd_sprite_load(r, ani->sprites[i])) { return SD_FILE_PARSE_ERROR; } } // Return success return SD_SUCCESS; }
int sd_sprite_load(sd_reader *r, sd_sprite *sprite) { sprite->len = sd_read_uword(r); sprite->pos_x = sd_read_word(r); sprite->pos_y = sd_read_word(r); sprite->width = sd_read_uword(r); sprite->height = sd_read_uword(r); sprite->index = sd_read_ubyte(r); sprite->missing = sd_read_ubyte(r); // Copy sprite data, if there is any. if(sprite->missing == 0) { if((sprite->data = malloc(sprite->len)) == NULL) { return SD_OUT_OF_MEMORY; } sd_read_buf(r, sprite->data, sprite->len); } else { sprite->data = NULL; } if(!sd_reader_ok(r)) { return SD_FILE_PARSE_ERROR; } return SD_SUCCESS; }