diff options
| author | johndoe123 | 2012-09-14 14:17:39 +0000 | 
|---|---|---|
| committer | Willem Jan Palenstijn | 2013-05-08 20:43:41 +0200 | 
| commit | 1a581543a79ed90547e9db2d741cab66424d5225 (patch) | |
| tree | 8e9b3c3632724974ce4425a4ec09a2dd3dd0b9f2 | |
| parent | a94c1fcb8f8b1aac20a20c17a6b4a3bfff931ae6 (diff) | |
| download | scummvm-rg350-1a581543a79ed90547e9db2d741cab66424d5225.tar.gz scummvm-rg350-1a581543a79ed90547e9db2d741cab66424d5225.tar.bz2 scummvm-rg350-1a581543a79ed90547e9db2d741cab66424d5225.zip | |
NEVERHOOD: Implement Scene2403
| -rw-r--r-- | engines/neverhood/gamemodule.cpp | 2 | ||||
| -rw-r--r-- | engines/neverhood/klayman.cpp | 86 | ||||
| -rw-r--r-- | engines/neverhood/klayman.h | 7 | ||||
| -rw-r--r-- | engines/neverhood/module2400.cpp | 106 | ||||
| -rw-r--r-- | engines/neverhood/module2400.h | 17 | 
5 files changed, 217 insertions, 1 deletions
| diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 23f6dbc0bd..19bdc65fa1 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -354,7 +354,7 @@ void GameModule::startup() {  	createModule(2500, -1);  #endif  #if 1 -	_vm->gameState().sceneNum = 5; +	_vm->gameState().sceneNum = 2;  	createModule(2400, -1);  #endif  } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index cebf71529c..957b9ef6ca 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5443,6 +5443,92 @@ void KmScene2402::sub415840() {  	SetSpriteUpdate(NULL);  } +KmScene2403::KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +	: Klayman(vm, parentScene, x, y, 1000, 1000) { +	// Empty +} + +uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { +	uint32 messageResult = 0; +	switch (messageNum) { +	case 0x4001: +	case 0x4800: +		startWalkToX(param.asPoint().x, false); +		break; +	case 0x4004: +		GotoState(&Klayman::stTryStandIdle); +		break; +	case 0x480D: +		GotoState(&Klayman::sub420F60); +		break; +	case 0x4812: +		GotoState(&Klayman::stPickUpGeneric); +		break; +	case 0x4816: +		if (param.asInteger() == 1) { +			GotoState(&Klayman::stTurnPressButton); +		} else if (param.asInteger() == 2) { +			GotoState(&Klayman::stStampFloorButton); +		} else { +			GotoState(&Klayman::stPressButtonSide); +		}  +		break; +	case 0x4817: +		setDoDeltaX(param.asInteger()); +		gotoNextStateExt(); +		break; +	case 0x481B: +		if (param.asPoint().y != 0) { +			sub41CC40(param.asPoint().y, param.asPoint().x); +		} else { +			sub41CCE0(param.asPoint().x); +		} +		break; +	case 0x481F: +		if (param.asInteger() == 0) { +			GotoState(&Klayman::stWonderAboutHalf); +		} else if (param.asInteger() == 1) { +			GotoState(&Klayman::stWonderAboutAfter); +		} else if (param.asInteger() == 3) { +			GotoState(&Klayman::stTurnToUseHalf); +		} else if (param.asInteger() == 4) { +			GotoState(&Klayman::stTurnAwayFromUse); +		} else { +			GotoState(&Klayman::stWonderAbout); +		} +		break; +	case 0x4820:   +		sendMessage(_parentScene, 0x2000, 0); +		GotoState(&Klayman::stContinueClimbLadderUp);	  +		break; +	case 0x4821:	 +		sendMessage(_parentScene, 0x2000, 0); +		_destY = param.asInteger(); +		GotoState(&Klayman::stStartClimbLadderDown);	  +		break; +	case 0x4822:   +		sendMessage(_parentScene, 0x2000, 0); +		_destY = param.asInteger(); +		GotoState(&Klayman::stStartClimbLadderUp);	  +		break; +	case 0x4823: +		sendMessage(_parentScene, 0x2001, 0); +		GotoState(&Klayman::stClimbLadderHalf);	  +		break; +	case 0x482D: +		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); +		gotoNextStateExt(); +		break; +	case 0x483F: +		startSpecialWalkRight(param.asInteger()); +		break; +	case 0x4840:  +		startSpecialWalkLeft(param.asInteger()); +		break; +	} +	return messageResult; +} +	  KmScene2406::KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)  	: Klayman(vm, parentScene, x, y, 1000, 1000) {  	// TODO Cliprects diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 0f2077e2a6..b752b1ecdb 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -603,6 +603,13 @@ protected:  	void sub415840();  }; +class KmScene2403 : public Klayman { +public: +	KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: +	uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; +  class KmScene2406 : public Klayman {  public:  	KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index d161389fc2..22ea30bb45 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -53,6 +53,10 @@ void Module2400::createScene(int sceneNum, int which) {  		// TODO Music18hList_play(0xB110382D, 0, 2, 1);  		_childObject = new Scene2402(_vm, this, which);  		break; +	case 2: +		// TODO Music18hList_play(0xB110382D, 0, 0, 1); +		_childObject = new Scene2403(_vm, this, which); +		break;  	case 5:  		// TODO Music18hList_play(0xB110382D, 0, 2, 1);  		_childObject = new Scene2406(_vm, this, which); @@ -79,6 +83,14 @@ void Module2400::updateScene() {  			else  				createScene(0, 1);  			break; +		case 2: +			if (_moduleResult == 1) +				createScene(9, -1); +			else if (_moduleResult == 2) +				createScene(6, -1); +			else +				createScene(5, 1); +			break;  		case 5:  			if (_moduleResult == 1)  				createScene(2, 0); @@ -778,6 +790,100 @@ void Scene2402::playPipeSound(uint32 fileHash) {  	_soundToggle = !_soundToggle;  } +Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) +	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm) { +	 +	Sprite *tempSprite; + +	_surfaceFlag = true; +	SetMessageHandler(&Scene2403::handleMessage); +	setBackground(0x0C05060C); +	setPalette(0x0C05060C); +	_palette->addPalette(0x414364B0, 0, 65, 0); +	insertMouse433(0x506080C8); +	_asTape = insertSprite<AsScene1201Tape>(this, 2, 1100, 480, 454, 0x9148A011); +	_vm->_collisionMan->addSprite(_asTape); +	_asLightCord = insertSprite<AsScene2803LightCord>(this, 0xA1095A10, 0x836D3813, 368, 200); +	_asLightCord->setClipRect(0, 25, 640, 480); +	 +	if (which < 0) { +		_flag1 = false; +		insertKlayman<KmScene2403>(220, 449); +		setMessageList(0x004B5C98); +		setRectList(0x004B5E18); +	} else if (which == 1) { +		_flag1 = false; +		insertKlayman<KmScene2403>(433, 449); +		setMessageList(0x004B5D70); +		setRectList(0x004B5E18); +	} else if (which == 2) { +		_flag1 = false; +		insertKlayman<KmScene2403>(440, 449); +		_klayman->setDoDeltaX(1); +		setMessageList(0x004B5C98); +		setRectList(0x004B5E18); +	} else { +		_flag1 = true; +		insertKlayman<KmScene2403>(122, 599); +		setMessageList(0x004B5CA0); +		setRectList(0x004B5E28); +	} + +	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x3130B0EB, 100, 0); +	_sprite1 = insertStaticSprite(0x20C24220, 1100);	 +	_sprite2 = insertStaticSprite(0x03080900, 1300); +	tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman); +	tempSprite->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2()); +	_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2());	 + +	_soundResource2.load(calcHash("fxFogHornSoft")); + +} + +uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +	uint32 messageResult = Scene::handleMessage(messageNum, param, sender); +	switch (messageNum) { +	case 0x100D: +		if (param.asInteger() == 0x040424D0) { +			sendEntityMessage(_klayman, 0x1014, _ssButton); +		} else if (param.asInteger() == 0x180CE614) { +			sendEntityMessage(_klayman, 0x1014, _asLightCord); +		} +		break; +	case 0x2000: +		_flag1 = true; +		setRectList(0x004B5E28); +		break; +	case 0x2001: +		_flag1 = false; +		setRectList(0x004B5E18); +		break; +	case 0x480B: +		if (sender == _ssButton) { +			if (getSubVar(0x14800353, 0x304008D2)) { +				setSubVar(0x14800353, 0x304008D2, 0); +				_soundResource1.play(calcHash("fx3LocksDisable")); +			} else { +				setSubVar(0x14800353, 0x304008D2, 1); +				_soundResource2.play(); +			} +		} +		break; +	case 0x480F: +		if (sender == _asLightCord) { +			leaveScene(2); +		} +		break; +	case 0x4826: +		if (sender == _asTape && !_flag1) { +			sendEntityMessage(_klayman, 0x1014, _asTape); +			setMessageList(0x004B5D98); +		} +		break; +	} +	return messageResult; +} +  Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)  	: Scene(vm, parentModule, true) { diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index 9a593d8dc9..16c1d64625 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -32,6 +32,7 @@  #include "neverhood/module1200.h"  #include "neverhood/module2100.h"  #include "neverhood/module2200.h" +#include "neverhood/module2800.h"  namespace Neverhood { @@ -160,6 +161,22 @@ protected:  	void playPipeSound(uint32 fileHash);  }; +class Scene2403 : public Scene { +public: +	Scene2403(NeverhoodEngine *vm, Module *parentModule, int which); +protected: +	Sprite *_sprite1; +	Sprite *_sprite2; +	Sprite *_ssButton; +	Sprite *_asTape; +	Sprite *_class545; +	Sprite *_asLightCord; +	bool _flag1; +	SoundResource _soundResource1; +	SoundResource _soundResource2; +	uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; +  class Scene2406 : public Scene {  public:  	Scene2406(NeverhoodEngine *vm, Module *parentModule, int which); | 
