Exemple #1
0
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");
}
Exemple #2
0
/// \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;
	}
}