void TR_Level::read_tr5_moveable(SDL_RWops * const src, tr_moveable_t & moveable) { read_tr_moveable(src, moveable); if (read_bitu16(src) != 0xFFEF) Sys_extWarn("read_tr5_moveable: filler has wrong value"); }
/// \brief reads frame and moveable data. void TR_Level::read_frame_moveable_data(SDL_RWops * const src) { bitu32 i; bitu32 frame_data_size = read_bitu32(src) * 2; bitu8 *buffer = NULL; SDL_RWops *newsrc = NULL; bitu32 pos = 0; bitu32 frame = 0; buffer = new bitu8[frame_data_size]; try { if (SDL_RWread(src, buffer, 1, frame_data_size) < (int)frame_data_size) throw TR_ReadError ("read_tr_level: frame_data: SDL_RWread(buffer)", __FILE__, __LINE__, RCSID); if ((newsrc = SDL_RWFromMem(buffer, frame_data_size)) == NULL) throw TR_ReadError ("read_tr_level: frame_data: SDL_RWFromMem", __FILE__, __LINE__, RCSID); this->moveables.resize(read_bitu32(src)); for (i = 0; i < this->moveables.size(); i++) if (this->game_version < TR_V) read_tr_moveable(src, this->moveables[i]); else read_tr5_moveable(src, this->moveables[i]); //this->frames.reserve(this->moveables.size()); for (i = 0; i < this->moveables.size(); i++) { bitu32 j; //tr_frame_t tr_frame; for (j = 0; j < this->moveables.size(); j++) if (this->moveables[j].frame_offset == pos) { this->moveables[j].frame_index = frame; this->moveables[j].frame_offset = 0; } SDL_RWseek(newsrc, pos, SEEK_SET); /* try { if (this->game_version < TR_II) read_tr_frame(newsrc, tr_frame, this->moveables[i].num_meshes); else read_tr2_frame(newsrc, tr_frame, this->moveables[i].num_meshes); tr_frame.byte_offset = pos; } catch(TR_ReadError) { tr_frame.byte_offset = -(bit32)pos; } this->frames.push_back(tr_frame); */ frame++; pos = 0; for (j = 0; j < this->moveables.size(); j++) if (this->moveables[j].frame_offset > pos) { pos = this->moveables[j].frame_offset; break; } } SDL_RWclose(newsrc); newsrc = NULL; delete [] buffer; } catch(...) { if (newsrc) SDL_RWclose(newsrc); delete [] buffer; throw; } }