diff options
| -rw-r--r-- | engines/neverhood/gamemodule.cpp | 18 | ||||
| -rw-r--r-- | engines/neverhood/klayman.cpp | 72 | ||||
| -rw-r--r-- | engines/neverhood/klayman.h | 7 | ||||
| -rw-r--r-- | engines/neverhood/module.mk | 1 | ||||
| -rw-r--r-- | engines/neverhood/module2800.cpp | 201 | ||||
| -rw-r--r-- | engines/neverhood/module2800.h | 59 | 
6 files changed, 357 insertions, 1 deletions
| diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 72f15a6bed..781a9c305a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -39,6 +39,7 @@  #include "neverhood/module2300.h"  #include "neverhood/module2600.h"  #include "neverhood/module2700.h" +#include "neverhood/module2800.h"  #include "neverhood/module3000.h"  namespace Neverhood { @@ -275,7 +276,7 @@ void GameModule::startup() {  	_vm->gameState().sceneNum = 0;  	createModule(1000, -1);  #endif -#if 1 +#if 0  	_vm->gameState().sceneNum = 1;  	createModule(1000, -1);  #endif @@ -301,6 +302,10 @@ void GameModule::startup() {  	_vm->gameState().sceneNum = 1;  	createModule(2700, -1);  #endif +#if 1 +	_vm->gameState().sceneNum = 0; +	createModule(2800, -1); +#endif  }  void GameModule::createModule(int moduleNum, int which) { @@ -372,6 +377,10 @@ void GameModule::createModule(int moduleNum, int which) {  		setGlobalVar(0x91080831, 0x42212411);  		_childObject = new Module2700(_vm, this, which);  		break; +	case 2800: +		setGlobalVar(0x91080831, 0x64210814); +		_childObject = new Module2800(_vm, this, which); +		break;  	case 3000:  		setGlobalVar(0x91080831, 0x81293110);  		_childObject = new Module3000(_vm, this, which); @@ -489,6 +498,13 @@ void GameModule::updateModule() {  		case 2700:  			createModule(1800, 2);  			break; +		case 2800: +			if (_moduleResult == 1) { +				createModule(2900, 5); +			} else { +				createModule(1800, 0); +			} +			break;  		case 3000:  			if (_moduleResult == 1) {  				createModule(1900, 0); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index bdc53d65f6..6873e505fa 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -4847,4 +4847,76 @@ void KmScene2247::sub453520() {  	FinalizeState(&Klayman::stStartWalkingDone);  } +KmScene2801::KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +	: Klayman(vm, parentScene, x, y, 1000, 1000) { +	// Empty +} + +uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { +	switch (messageNum) { +	case 0x4001: +	case 0x4800: +		startWalkToX(param.asPoint().x, false); +		break; +	case 0x4004: +		GotoState(&Klayman::stTryStandIdle); +		break; +	case 0x4812: +		GotoState(&Klayman::stPickUpGeneric); +		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 0x481D: +		GotoState(&Klayman::stTurnToUse); +		break; +	case 0x481E: +		GotoState(&Klayman::stReturnFromUse); +		break; +	case 0x481F: +		if (param.asInteger() == 1) { +			GotoState(&Klayman::stWonderAboutAfter); +		} else if (param.asInteger() == 0) { +			GotoState(&Klayman::stWonderAboutHalf); +		} else if (param.asInteger() == 4) { +			GotoState(&Klayman::stTurnAwayFromUse); +		} else if (param.asInteger() == 3) { +			GotoState(&Klayman::stTurnToUseHalf); +		} else { +			GotoState(&Klayman::stWonderAbout); +		} +		break; +	case 0x482D: +		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); +		gotoNextStateExt(); +		break; +	case 0x482E:	  +		if (param.asInteger() == 1) { +			GotoState(&Klayman::stWalkToFrontNoStep); +		} else { +			GotoState(&Klayman::stWalkToFront); +		} +		break; +	case 0x482F: +		if (param.asInteger() == 1) { +			GotoState(&Klayman::stTurnToFront); +		} else { +			GotoState(&Klayman::stTurnToBack); +		} +		break; +	case 0x4837: +		sub41CE70(); +		break; +	} +	return 0; +} +  } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 7b8b42ebae..355c6d6f15 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -542,6 +542,13 @@ protected:  	void sub453520();  }; +class KmScene2801 : public Klayman { +public: +	KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: +	uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; +  } // End of namespace Neverhood  #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index adf58b1225..780ee76ae1 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -27,6 +27,7 @@ MODULE_OBJS = \  	module2300.o \  	module2600.o \  	module2700.o \ +	module2800.o \  	module3000.o \  	mouse.o \  	navigationscene.o \ diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp new file mode 100644 index 0000000000..3a86e29f36 --- /dev/null +++ b/engines/neverhood/module2800.cpp @@ -0,0 +1,201 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2800.h" +#include "neverhood/gamemodule.h" +#include "neverhood/module1000.h" +#include "neverhood/module1200.h" +#include "neverhood/module1700.h" + +namespace Neverhood { + +Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) +	: Module(vm, parentModule) { + +	_fileHash = 0; +	// TODO music stuff +	// TODO Music18hList_add(0x64210814, 0xD2FA4D14); +	setGlobalVar(0x28D8C940, 1); +	 +	if (which < 0) { +		createScene(_vm->gameState().sceneNum, which); +	} else if (which == 2) { +		createScene(4, 3); +	} else if (which == 1) { +		createScene(4, 1); +	} else { +		createScene(0, 0); +	} + +} + +Module2800::~Module2800() { +	// TODO music stuff +	// TODO Sound1ChList_sub_407A50(0x64210814); +	// TODO Module2800_sub471DF0(); +} + +void Module2800::createScene(int sceneNum, int which) { +	debug("Module2800::createScene(%d, %d)", sceneNum, which); +	_vm->gameState().sceneNum = sceneNum; +	switch (_vm->gameState().sceneNum) { +	case 0: +		// TODO Music18hList_stop(0xD2FA4D14, 0, 0); +		_childObject = new Scene2801(_vm, this, which); +		break; +	// TODO ...		 +	} +	SetUpdateHandler(&Module2800::updateScene); +	_childObject->handleUpdate(); +} + +void Module2800::updateScene() { +	if (!updateChild()) { +		switch (_vm->gameState().sceneNum) { +		case 0: +			if (_moduleResult != 2) { +				// TODO music stuff +			}			 +			if (_moduleResult == 1) { +				createScene(2, 0); +			} else if (_moduleResult == 2) { +				createScene(1, 0); +			} else { +				leaveModule(0); +			} +			break; +		} +	} else { +		switch (_vm->gameState().sceneNum) { +		case 0: +			// TODO Module2800_sub4731E0(true); +			break; +		} +	} +} + +Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) +	: Scene(vm, parentModule, true) { + +	// TODO _vm->gameModule()->initScene2801Vars(); + +	_surfaceFlag = true; +	SetMessageHandler(&Scene2801::handleMessage); +	SetUpdateHandler(&Scene::update); + +	if (getGlobalVar(0x4DE80AC0) == 0) { +		insertStaticSprite(0x0001264C, 100); +	} + +	if (which < 0) { +		insertKlayman<KmScene2801>(194, 430); +		setMessageList(0x004B6BB8); +	} else if (which == 1) { +		insertKlayman<KmScene2801>(443, 398); +		setMessageList(0x004B6BC0); +	} else if (which == 2) { +		if (getGlobalVar(0xC0418A02)) { +			insertKlayman<KmScene2801>(312, 432); +			_klayman->setDoDeltaX(1); +			setMessageList(0x004B6C10); +		} else { +			insertKlayman<KmScene2801>(194, 432); +			setMessageList(0x004B6C10); +		} +	} else { +		insertKlayman<KmScene2801>(0, 432); +		setMessageList(0x004B6BB0); +	} + +	if (getGlobalVar(0x09880D40)) { +		setRectList(0x004B6CE0); +		setBackground(0x01400666); +		setPalette(0x01400666); +		_paletteHash = 0x15021024; +		_palette->addBasePalette(0x01400666, 0, 256, 0); +		_sprite1 = insertStaticSprite(0x100CA0A8, 1100); +		_sprite2 = insertStaticSprite(0x287C21A4, 1100); +		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); +		insertMouse433(0x0066201C); +		_asTape = insertSprite<AsScene1201Tape>(this, 8, 1100, 302, 437, 0x9148A011); +		_vm->_collisionMan->addSprite(_asTape);  +	} else if (getGlobalVar(0x08180ABC)) { +		setRectList(0x004B6CD0); +		setBackground(0x11E00684); +		setPalette(0x11E00684); +		_paletteHash = 0x15021024; +		_palette->addBasePalette(0x11E00684, 0, 256, 0); +		_sprite2 = insertStaticSprite(0x061601C8, 1100); +		_klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); +		insertMouse433(0x00680116); +		_asTape = insertSprite<Class606>(this, 8, 1100, 302, 437, 0x01142428); +		_vm->_collisionMan->addSprite(_asTape);  +	} else { +		setRectList(0x004B6CF0); +		setBackground(0x030006E6); +		setPalette(0x030006E6); +		_paletteHash = 0x15021024; +		_palette->addBasePalette(0x030006E6, 0, 256, 0); +		_sprite2 = insertStaticSprite(0x273801CE, 1100); +		_klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); +		insertMouse433(0x006E2038); +		_asTape = insertSprite<AsScene1201Tape>(this, 8, 1100, 302, 437, 0x9148A011); +		_vm->_collisionMan->addSprite(_asTape);  +	} + +	if (which == 1) { +		_palette->addPalette(0xB103B604, 0, 65, 0); +		_palette->addBasePalette(0xB103B604, 0, 65, 0); +	} else { +		_palette->addPalette(_paletteHash, 0, 65, 0); +		_palette->addBasePalette(_paletteHash, 0, 65, 0); +	} + +} + +Scene2801::~Scene2801() { +	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +	uint32 messageResult = Scene::handleMessage(messageNum, param, sender); +	switch (messageNum) { +	// TODO: case 0x000D: +	case 0x4826: +		if (sender == _asTape) { +			sendEntityMessage(_klayman, 0x1014, _asTape); +			setMessageList(0x004B6C40); +		} +		break; +	case 0x482A: +		_palette->addBasePalette(0xB103B604, 0, 65, 0); +		_palette->startFadeToPalette(12); +		break; +	case 0x482B: +		_palette->addBasePalette(_paletteHash, 0, 65, 0); +		_palette->startFadeToPalette(12); +		break; +	} +	return messageResult; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h new file mode 100644 index 0000000000..cdfcdbe802 --- /dev/null +++ b/engines/neverhood/module2800.h @@ -0,0 +1,59 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2800_H +#define NEVERHOOD_MODULE2800_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2800 + +class Module2800 : public Module { +public: +	Module2800(NeverhoodEngine *vm, Module *parentModule, int which); +	virtual ~Module2800(); +protected: +	bool _flag; +	uint32 _fileHash; +	void createScene(int sceneNum, int which); +	void updateScene(); +}; + +class Scene2801 : public Scene { +public: +	Scene2801(NeverhoodEngine *vm, Module *parentModule, int which); +	~Scene2801(); +protected: +	Sprite *_sprite1; +	Sprite *_sprite2; +	Sprite *_asTape; +	uint32 _paletteHash; +	uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2800_H */ | 
