Exemplo n.º 1
0
void Scene::endScene() {
	Rect rect;

	if (!_sceneLoaded)
		return;

	debug(3, "Ending scene...");

	if (_sceneProc != NULL) {
		_sceneProc(SCENE_END, this);
	}

	// Stop showing actors till the next scene's background is drawn from loadScene
	_vm->_render->setFlag(RF_DISABLE_ACTORS);

	_vm->_script->abortAllThreads();
	_vm->_script->_skipSpeeches = false;

	// WORKAROUND: Bug #2886151: "ITE: Mouse stops responding at Boar Castle"
	// This is bug in original engine
	if (_sceneNumber == 50) {
		_vm->_interface->activate();
	}

	// Copy current screen to render buffer so inset rooms will get proper background
	if (!(_sceneDescription.flags & kSceneFlagISO) && !_vm->_scene->isInIntro()) {
		BGInfo bgInfo;

		_vm->_scene->getBGInfo(bgInfo);
		_vm->_render->getBackGroundSurface()->blit(bgInfo.bounds, bgInfo.buffer);
		_vm->_render->addDirtyRect(bgInfo.bounds);
	} else {
		_vm->_gfx->getBackBufferRect(rect);
		_vm->_render->getBackGroundSurface()->blit(rect, (const byte *)_vm->_gfx->getBackBufferPixels());
		_vm->_render->addDirtyRect(rect);
	}

	// Free scene background
	if (_bg.loaded) {
		_bg.buffer.clear();
		_bg.loaded = false;
	}

	// Free scene background mask
	if (_bgMask.loaded) {
		_bgMask.buffer.clear();
		_bgMask.loaded = false;
	}

	// Free animation info list
	_vm->_anim->reset();

	_vm->_palanim->clear();

	_objectMap->clear();
	_actionMap->clear();
	_entryList.clear();
	_sceneStrings.clear();

	if (_vm->getGameId() == GID_ITE)
		_vm->_isoMap->clear();

	_vm->_events->clearList();
	_textList.clear();

	_sceneLoaded = false;
}
Exemplo n.º 2
0
void Scene::endScene() {
	Rect rect;
	size_t i;

	if (!_sceneLoaded)
		return;

	debug(3, "Ending scene...");

	if (_sceneProc != NULL) {
		_sceneProc(SCENE_END, this);
	}

	// Stop showing actors till the next scene's background is drawn from loadScene
	_vm->_render->setFlag(RF_DISABLE_ACTORS);

	_vm->_script->abortAllThreads();
	_vm->_script->_skipSpeeches = false;

	// Copy current screen to render buffer so inset rooms will get proper background
	if (!(_sceneDescription.flags & kSceneFlagISO) && !_vm->_scene->isInIntro()) {
		BGInfo bgInfo;

		_vm->_scene->getBGInfo(bgInfo);
		_vm->_render->getBackGroundSurface()->blit(bgInfo.bounds, bgInfo.buffer);
		_vm->_render->addDirtyRect(bgInfo.bounds);
	} else {
		_vm->_gfx->getBackBufferRect(rect);
		_vm->_render->getBackGroundSurface()->blit(rect, (const byte *)_vm->_gfx->getBackBufferPixels());
		_vm->_render->addDirtyRect(rect);
	}

	// Free scene background
	if (_bg.loaded) {
		free(_bg.buf);
		_bg.loaded = 0;
	}

	// Free scene background mask
	if (_bgMask.loaded) {
		free(_bgMask.buf);
		_bgMask.loaded = 0;
	}

	// Free scene resource list
	for (i = 0; i < _resourceListCount; i++) {
		free(_resourceList[i].buffer);
	}

	if (_loadDescription) {
		free(_resourceList);
	}

	// Free animation info list
	_vm->_anim->reset();

	_vm->_palanim->freePalAnim();

	_objectMap->freeMem();
	_actionMap->freeMem();
	_entryList.freeMem();
	_sceneStrings.freeMem();

	if (_vm->getGameId() == GID_ITE)
		_vm->_isoMap->freeMem();

	_vm->_events->clearList();
	_textList.clear();

	_sceneLoaded = false;
}