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; }
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]); } }