[Scummvm-cvs-logs] scummvm master -> 19e92a09fc790dfc1da69f886b1d330a878d7e75

bluegr bluegr at gmail.com
Tue Jun 11 10:49:03 CEST 2013


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
8fee784965 NEVERHOOD: Cleanup, merge some duplicate code
19e92a09fc NEVERHOOD: Fix crashes in scene 3009 (cannon scene), and add a FIXME


Commit: 8fee7849654cdca69ce31cbb345f89ff9e33f28f
    https://github.com/scummvm/scummvm/commit/8fee7849654cdca69ce31cbb345f89ff9e33f28f
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-06-11T01:47:50-07:00

Commit Message:
NEVERHOOD: Cleanup, merge some duplicate code

Changed paths:
    engines/neverhood/diskplayerscene.cpp



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index da1ec98..534b2b9 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -478,12 +478,12 @@ void DiskplayerScene::openSmacker(uint32 fileHash, bool keepLastFrame) {
 	removeSurface(_diskSmackerPlayer->getSurface());
 	_diskSmackerPlayer->open(fileHash, keepLastFrame);
 	addSurface(_diskSmackerPlayer->getSurface());
+	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
+	_palette->usePalette();
 }
 
 void DiskplayerScene::stop() {
 	openSmacker(0x08288103, true);
-	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
-	_palette->usePalette();
 	_ssPlayButton->release();
 	_updateStatus = kUSStopped;
 	_diskSlots[_diskIndex]->activate();
@@ -491,8 +491,6 @@ void DiskplayerScene::stop() {
 
 void DiskplayerScene::tuneIn() {
 	openSmacker(0x900001C1, false);
-	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
-	_palette->usePalette();
 	_ssPlayButton->release();
 	_updateStatus = kUSTuningIn;
 	_diskSlots[_diskIndex]->activate();
@@ -500,16 +498,12 @@ void DiskplayerScene::tuneIn() {
 
 void DiskplayerScene::playDisk() {
 	openSmacker(kDiskplayerSmackerFileHashes[_diskIndex], false);
-	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
-	_palette->usePalette();
 	_updateStatus = kUSPlaying;
 	_diskSlots[_diskIndex]->play();
 }
 
 void DiskplayerScene::playStatic() {
 	openSmacker(0x90000101, false);
-	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
-	_palette->usePalette();
 	_ssPlayButton->release();
 	_updateStatus = kUSPlaying;
 	_diskSlots[_diskIndex]->activate();


Commit: 19e92a09fc790dfc1da69f886b1d330a878d7e75
    https://github.com/scummvm/scummvm/commit/19e92a09fc790dfc1da69f886b1d330a878d7e75
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-06-11T01:47:50-07:00

Commit Message:
NEVERHOOD: Fix crashes in scene 3009 (cannon scene), and add a FIXME

Changed paths:
    engines/neverhood/modules/module3000.cpp
    engines/neverhood/modules/module3000.h



diff --git a/engines/neverhood/modules/module3000.cpp b/engines/neverhood/modules/module3000.cpp
index b5cc83d..75e44ed 100644
--- a/engines/neverhood/modules/module3000.cpp
+++ b/engines/neverhood/modules/module3000.cpp
@@ -786,8 +786,8 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 	}
 
-	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009CannonScopeVideos[_cannonTargetStatus], false, _keepVideo));
-	_smackerPlayer->setDrawPos(89, 37);
+	_cannonSmackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009CannonScopeVideos[_cannonTargetStatus], false, _keepVideo));
+	_cannonSmackerPlayer->setDrawPos(89, 37);
 	_palette->usePalette(); // Use it again since the SmackerPlayer overrides the usage
 
 	insertStaticSprite(0x8540252C, 400);
@@ -817,32 +817,43 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 
 }
 
+Scene3009::~Scene3009() {
+	removeSurface(_cannonSmackerPlayer->getSurface());
+	// FIXME: Deleting the player crashes the game when leaving the cannon scene!
+	//delete _cannonSmackerPlayer;
+}
+
+void Scene3009::openSmacker(uint32 fileHash, bool keepLastFrame) {
+	// The old Smacker surface is deleted when a new Smacker is opened.
+	removeSurface(_cannonSmackerPlayer->getSurface());
+	_cannonSmackerPlayer->open(fileHash, keepLastFrame);
+	addSurface(_cannonSmackerPlayer->getSurface());
+	//_vm->_screen->setSmackerDecoder(_cannonSmackerPlayer->getSmackerDecoder());
+	_palette->usePalette();
+}
+
 void Scene3009::update() {
 	Scene::update();
 	
-	if (!_keepVideo && _smackerPlayer->isDone() && _cannonTargetStatus <= kCTSCount) {
+	if (!_keepVideo && _cannonSmackerPlayer->isDone() && _cannonTargetStatus <= kCTSCount) {
 		switch (_cannonTargetStatus) {
 		case kCTSNull:
 		case kCTSLowerCannon:
-			_smackerPlayer->open(0x340A0049, true);
-			_palette->usePalette();
+			openSmacker(0x340A0049, true);
 			_keepVideo = true;
 			break;
 		case kCTSRightRobotNoTarget:
-			_smackerPlayer->open(0x0082080D, true);
-			_palette->usePalette();
+			openSmacker(0x0082080D, true);
 			_keepVideo = true;
 			_isTurning = false;
 			break;
 		case kCTSRightRobotIsTarget:
-			_smackerPlayer->open(0x0282080D, true);
-			_palette->usePalette();
+			openSmacker(0x0282080D, true);
 			_keepVideo = true;
 			_isTurning = false;
 			break;
 		case kCTSRightNoRobot:
-			_smackerPlayer->open(0x0882080D, true);
-			_palette->usePalette();
+			openSmacker(0x0882080D, true);
 			_keepVideo = true;
 			_isTurning = false;
 			break;
@@ -851,12 +862,11 @@ void Scene3009::update() {
 		case kCTSLeftNoRobot:
 			if (_moveCannonLeftFirst) {
 				if (_cannonTargetStatus == kCTSLeftRobotNoTarget)
-					_smackerPlayer->open(0x110A000F, false);
+					openSmacker(0x110A000F, false);
 				else if (_cannonTargetStatus == kCTSLeftRobotIsTarget)				
-					_smackerPlayer->open(0x500B004F, false);
+					openSmacker(0x500B004F, false);
 				else if (_cannonTargetStatus == kCTSLeftNoRobot)				
-					_smackerPlayer->open(0x100B010E, false);
-				_palette->usePalette();
+					openSmacker(0x100B010E, false);
 				_moveCannonLeftFirst = false;
 				_asHorizontalIndicator->stMoveLeft();
 			} else {
@@ -955,15 +965,14 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 				// Cannon is at the right position
 				if (!getGlobalVar(V_ROBOT_TARGET)) {
 					_cannonTargetStatus = kCTSLeftRobotNoTarget;
-					_smackerPlayer->open(0x108A000F, false);
+					openSmacker(0x108A000F, false);
 				} else if (!getGlobalVar(V_ROBOT_HIT)) {
 					_cannonTargetStatus = kCTSLeftRobotIsTarget;
-					_smackerPlayer->open(0x500B002F, false);
+					openSmacker(0x500B002F, false);
 				} else {
 					_cannonTargetStatus = kCTSLeftNoRobot;
-					_smackerPlayer->open(0x100B008E, false);
+					openSmacker(0x100B008E, false);
 				}
-				_palette->usePalette();
 				_moveCannonLeftFirst = true;
 				_isTurning = true;
 				_keepVideo = false;
diff --git a/engines/neverhood/modules/module3000.h b/engines/neverhood/modules/module3000.h
index 7634360..797be18 100644
--- a/engines/neverhood/modules/module3000.h
+++ b/engines/neverhood/modules/module3000.h
@@ -128,11 +128,12 @@ protected:
 class Scene3009 : public Scene {
 public:
 	Scene3009(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene3009();
 	bool isTurning();
 protected:
 	int _lockSymbolsPart1Countdown;
 	int _lockSymbolsPart2Countdown;
-	SmackerPlayer *_smackerPlayer;
+	SmackerPlayer *_cannonSmackerPlayer;
 	Sprite *_ssFireCannonButton;
 	SsScene3009SymbolEdges *_ssSymbolEdges[2];
 	SsScene3009TargetLine *_ssTargetLines[2];
@@ -149,6 +150,7 @@ protected:
 	void playActionVideo();
 	bool isSymbolsPart1Solved();
 	bool isSymbolsPart2Solved();
+	void openSmacker(uint32 fileHash, bool keepLastFrame);
 };
 
 // Scene3010






More information about the Scummvm-git-logs mailing list