Example #1
0
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;
}
Example #2
0
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;
}