Esempio n. 1
0
int sd_sprite_save(sd_writer *w, const sd_sprite *sprite) {
    if(w == NULL || sprite == NULL) {
        return SD_INVALID_INPUT;
    }
    sd_write_uword(w, sprite->len);
    sd_write_word(w, sprite->pos_x);
    sd_write_word(w, sprite->pos_y);
    sd_write_uword(w, sprite->width);
    sd_write_uword(w, sprite->height);
    sd_write_ubyte(w, sprite->index);
    sd_write_ubyte(w, sprite->missing);
    if(!sprite->missing) {
        sd_write_buf(w, sprite->data, sprite->len);
    }
    return SD_SUCCESS;
}
Esempio n. 2
0
void sd_animation_save(sd_writer *writer, sd_animation *ani) {
    // Animation header
    sd_write_word(writer, ani->start_x);
    sd_write_word(writer, ani->start_y);
    sd_write_buf(writer, ani->unknown_a, 4);
    sd_write_uword(writer, ani->col_coord_count);
    sd_write_ubyte(writer, ani->frame_count);
    
    // collision table
    uint32_t tmp;
    for(int i = 0; i < ani->col_coord_count; i++) {
        tmp = (ani->col_coord_table[i].y_ext & 0x3f);
        tmp = tmp << 10;
        tmp = (tmp | (ani->col_coord_table[i].y & 0x3ff));
        tmp = tmp << 6;
        tmp = (tmp | (ani->col_coord_table[i].x_ext & 0x3f));
        tmp = tmp << 10;
        tmp = (tmp | (ani->col_coord_table[i].x & 0x3ff));
        sd_write_udword(writer, tmp);
    }

    // Animation string header
    uint16_t a_size = strlen(ani->anim_string);
    sd_write_uword(writer, a_size);
    sd_write_buf(writer, ani->anim_string, a_size);
    sd_write_ubyte(writer, 0);

    // Extra animation strings
    uint16_t s_size = 0;
    sd_write_ubyte(writer, ani->extra_string_count);
    for(int i = 0; i < ani->extra_string_count; i++) {
        s_size = strlen(ani->extra_strings[i]);
        sd_write_uword(writer, s_size);
        sd_write_buf(writer, ani->extra_strings[i], s_size);
        sd_write_ubyte(writer, 0);
    }

    // Sprites
    for(int i = 0; i < ani->frame_count; i++) {
        sd_sprite_save(writer, ani->sprites[i]);
    }
}