[Scummvm-cvs-logs] scummvm master -> d798a4f12a95c3911b46e3bfddb9bc84f1b6a540

bluegr bluegr at gmail.com
Tue Oct 1 00:25:34 CEST 2013


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

Summary:
d798a4f12a NEVERHOOD: Split some more sprites from their respective scenes


Commit: d798a4f12a95c3911b46e3bfddb9bc84f1b6a540
    https://github.com/scummvm/scummvm/commit/d798a4f12a95c3911b46e3bfddb9bc84f1b6a540
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-09-30T15:24:56-07:00

Commit Message:
NEVERHOOD: Split some more sprites from their respective scenes

This splits modules 2400, 2500 and 2600

Changed paths:
  A engines/neverhood/modules/module2400_sprites.cpp
  A engines/neverhood/modules/module2400_sprites.h
  A engines/neverhood/modules/module2500_sprites.cpp
  A engines/neverhood/modules/module2500_sprites.h
  A engines/neverhood/modules/module2600_sprites.cpp
  A engines/neverhood/modules/module2600_sprites.h
    engines/neverhood/module.mk
    engines/neverhood/modules/module2400.cpp
    engines/neverhood/modules/module2400.h
    engines/neverhood/modules/module2500.cpp
    engines/neverhood/modules/module2500.h
    engines/neverhood/modules/module2600.cpp
    engines/neverhood/modules/module2600.h



diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index abedee0..c31a711 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -29,8 +29,11 @@ MODULE_OBJS = \
 	modules/module2200.o \
 	modules/module2300.o \
 	modules/module2400.o \
+	modules/module2400_sprites.o \
 	modules/module2500.o \
+	modules/module2500_sprites.o \
 	modules/module2600.o \
+	modules/module2600_sprites.o \
 	modules/module2700.o \
 	modules/module2700_sprites.o \
 	modules/module2800.o \
diff --git a/engines/neverhood/modules/module2400.cpp b/engines/neverhood/modules/module2400.cpp
index 21ea390..0e2056d 100644
--- a/engines/neverhood/modules/module2400.cpp
+++ b/engines/neverhood/modules/module2400.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/modules/module2400.h"
+#include "neverhood/modules/module2400_sprites.h"
 
 namespace Neverhood {
 
@@ -175,198 +176,6 @@ static const NRect kScene2401Rects[] = {
 	{ 465, 331, 491, 389 }
 };
 
-static const uint32 kAsScene2401WaterSpitFileHashes2[] = {
-	0x5C044690, 0x5C644690, 0x5CA44690,
-	0x5D244690, 0x5E244690
-};
-
-static const uint32 kAsScene2401WaterSpitFileHashes1[] = {
-	0xF4418408, 0xF4418808, 0xF4419008,
-	0xF441A008, 0xCD4F8411
-};
-
-AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1200) {
-
-	_x = 240;
-	_y = 447;
-	createSurface(100, 146, 74);
-	setVisible(false);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene2401WaterSpit::handleMessage);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
-uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x120A0013)
-			playSound(0, kAsScene2401WaterSpitFileHashes1[_soundIndex]);
-		break;
-	case 0x2000:
-		_x = 240;
-		_y = 447;
-		_soundIndex = getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger());
-		startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1);
-		setVisible(true);
-		playSound(0, 0x48640244);
-		break;
-	case 0x3002:
-		stopAnimation();
-		setVisible(false);
-		break;
-	}
-	return messageResult;
-}
-
-AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1200), _isWaterFlowing(false) {
-
-	_x = 88;
-	_y = 421;
-	createSurface1(0x10203116, 100);
-	setVisible(false);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene2401FlowingWater::handleMessage);
-}
-
-AsScene2401FlowingWater::~AsScene2401FlowingWater() {
-	_vm->_soundMan->deleteSoundGroup(0x40F11C09);
-}
-
-uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (_isWaterFlowing && param.asInteger() == 0x02421405)
-			startAnimationByHash(0x10203116, 0x01084280, 0);
-		break;
-	case 0x2002:
-		if (!_isWaterFlowing) {
-			_vm->_soundMan->addSound(0x40F11C09, 0x980C1420);
-			_vm->_soundMan->playSoundLooping(0x980C1420);
-			startAnimation(0x10203116, 0, -1);
-			setVisible(true);
-			_isWaterFlowing = true;
-		}
-		break;
-	case 0x2003:
-		_vm->_soundMan->deleteSound(0x980C1420);
-		_isWaterFlowing = false;
-		break;
-	case 0x3002:
-		stopAnimation();
-		setVisible(false);
-		break;
-	}
-	return messageResult;
-}
-
-AsScene2401WaterFlushing::AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y)
-	: AnimatedSprite(vm, 1200), _countdown(0), _flushLoopCount(0) {
-
-	_x = x;
-	_y = y;
-	createSurface1(0xB8596884, 100);
-	setVisible(false);
-	SetUpdateHandler(&AsScene2401WaterFlushing::update);
-	SetMessageHandler(&AsScene2401WaterFlushing::handleMessage);
-}
-
-void AsScene2401WaterFlushing::update() {
-	if (_countdown != 0 && (--_countdown) == 0) {
-		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
-		startAnimation(0xB8596884, 0, -1);
-		setVisible(true);
-	}
-	AnimatedSprite::update();
-}
-
-uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (_flushLoopCount > 0 && param.asInteger() == 0x02421405) {
-			startAnimationByHash(0xB8596884, 0x01084280, 0);
-			_flushLoopCount--;
-		}
-		break;
-	case 0x2002:
-		if (param.asInteger() > 0) {
-			_flushLoopCount = param.asInteger() - 1;
-			_countdown = _vm->_rnd->getRandomNumber(3) + 1;
-		}
-		break;
-	case 0x3002:
-		stopAnimation();
-		setVisible(false);
-		break;
-	}
-	return messageResult;
-}
-
-AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen)
-	: AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen) {
-
-	_x = 320;
-	_y = 240;
-	createSurface1(0x44687810, 100);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-	if (_isOpen) {
-		stopAnimation();
-		setVisible(false);
-		_countdown = 48;
-	} else {
-		startAnimation(0x44687810, 0, -1);
-		_newStickFrameIndex = 0;
-	}
-	SetUpdateHandler(&AsScene2401Door::update);
-	SetMessageHandler(&AsScene2401Door::handleMessage);
-}
-
-void AsScene2401Door::update() {
-	if (_isOpen && _countdown != 0 && (--_countdown) == 0) {
-		_isOpen = false;
-		setVisible(true);
-		startAnimation(0x44687810, -1, -1);
-		_newStickFrameIndex = 0;
-		_playBackwards = true;
-		playSound(0, calcHash("fxDoorClose38"));
-	}
-	AnimatedSprite::update();
-}
-
-uint32 AsScene2401Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2004:
-		if (_isOpen)
-			_countdown = 168;
-		messageResult = _isOpen ? 1 : 0;
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	case 0x4808:
-		if (!_isOpen) {
-			_countdown = 168;
-			_isOpen = true;
-			setVisible(true);
-			startAnimation(0x44687810, 0, -1);
-			playSound(0, calcHash("fxDoorOpen38"));
-			NextState(&AsScene2401Door::stDoorOpenFinished);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene2401Door::stDoorOpenFinished() {
-	stopAnimation();
-	setVisible(false);
-}
-
 Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _countdown1(0), _countdown2(0), _unkFlag(false),
 	_soundToggle(false), _asWaterSpitIndex(0) {
@@ -546,143 +355,6 @@ static const uint32 kScene2402FileHashes[] = {
 	0xD0910068, 0xD09100A8
 };
 
-AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _countdown(0) {
-
-	_x = 320;
-	_y = 240;
-	createSurface1(0x80495831, 100);
-	if (_isOpen) {
-		startAnimation(0x80495831, -1, -1);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-		_countdown = 48;
-	} else {
-		stopAnimation();
-		setVisible(false);
-	}
-	SetUpdateHandler(&AsScene2402Door::update);
-	SetMessageHandler(&AsScene2402Door::handleMessage);
-}
-
-void AsScene2402Door::update() {
-	if (_isOpen && _countdown != 0 && (--_countdown) == 0) {
-		_isOpen = false;
-		setVisible(true);
-		startAnimation(0x80495831, -1, -1);
-		_playBackwards = true;
-		playSound(0, calcHash("fxDoorClose38"));
-		NextState(&AsScene2402Door::stDoorClosingFinished);
-	}
-	AnimatedSprite::update();
-}
-
-uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2000:
-		if (_isOpen)
-			_countdown = 144;
-		messageResult = _isOpen ? 1 : 0;
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	case 0x4808:
-		_countdown = 144;
-		_isOpen = true;
-		setVisible(true);
-		startAnimation(0x80495831, 0, -1);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-		playSound(0, calcHash("fxDoorOpen38"));
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene2402Door::stDoorClosingFinished() {
-	sendMessage(_parentScene, 0x2001, 0);
-	setVisible(false);
-}
-
-AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klaymen *klaymen)
-	: AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown1(0), _countdown2(0) {
-
-	_x = 260;
-	_y = 210;
-	createSurface(100, 127, 90);
-	setDoDeltaX(1);
-	SetMessageHandler(&Sprite::handleMessage);
-	if (!getGlobalVar(V_TV_JOKE_TOLD)) {
-		loadSound(0, 0x58208810);
-		_countdown1 = 48;
-		startAnimation(0x4919397A, 0, -1);
-		_newStickFrameIndex = 0;
-		SetUpdateHandler(&AsScene2402TV::upWait);
-	} else {
-		int16 frameIndex;
-		if (_klaymen->getX() > 320)
-			_currFrameIndex = 29;
-		frameIndex = CLIP<int16>((_klaymen->getX() - _x + 150) / 10, 0, 29);
-		startAnimation(0x050A0103, frameIndex, -1);
-		_newStickFrameIndex = frameIndex;
-		_countdown1 = 0;
-		SetUpdateHandler(&AsScene2402TV::upFocusKlaymen);
-	}
-}
-
-AsScene2402TV::~AsScene2402TV() {
-	_vm->_soundMan->deleteSoundGroup(0x01520123);
-}
-
-void AsScene2402TV::upWait() {
-	if (_countdown1 != 0 && (--_countdown1) == 0) {
-		startAnimation(0x4919397A, 0, -1);
-		SetMessageHandler(&AsScene2402TV::hmJoke);
-		NextState(&AsScene2402TV::stJokeFinished);
-	}
-	AnimatedSprite::update();
-}
-
-void AsScene2402TV::upFocusKlaymen() {
-	int16 frameIndex = CLIP<int16>((_klaymen->getX() - _x + 150) / 10, 0, 29);
-	if (frameIndex != _currFrameIndex) {
-		if (frameIndex > _currFrameIndex)
-			_currFrameIndex++;
-		else if (frameIndex < _currFrameIndex)
-			_currFrameIndex--;
-		startAnimation(0x050A0103, _currFrameIndex, -1);
-		_newStickFrameIndex = _currFrameIndex;
-		if (_countdown2 == 0) {
-			_vm->_soundMan->addSound(0x01520123, 0xC42D4528);
-			_vm->_soundMan->playSoundLooping(0xC42D4528);
-		}
-		_countdown2 = 5;
-	} else if (_countdown2 != 0 && (--_countdown2 == 0))
-		_vm->_soundMan->deleteSound(0xC42D4528);
-	AnimatedSprite::update();
-}
-
-void AsScene2402TV::stJokeFinished() {
-	setGlobalVar(V_TV_JOKE_TOLD, 1);
-	startAnimation(0x050A0103, 0, -1);
-	_newStickFrameIndex = 0;
-	SetUpdateHandler(&AsScene2402TV::upFocusKlaymen);
-}
-
-uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x431EA0B0)
-			playSound(0);
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
 Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _countdown(0), _soundToggle(false) {
 
diff --git a/engines/neverhood/modules/module2400.h b/engines/neverhood/modules/module2400.h
index 3802c74..ba58ce3 100644
--- a/engines/neverhood/modules/module2400.h
+++ b/engines/neverhood/modules/module2400.h
@@ -51,44 +51,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class AsScene2401WaterSpit : public AnimatedSprite {
-public:
-	AsScene2401WaterSpit(NeverhoodEngine *vm);
-protected:
-	int _soundIndex;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene2401FlowingWater : public AnimatedSprite {
-public:
-	AsScene2401FlowingWater(NeverhoodEngine *vm);
-	virtual ~AsScene2401FlowingWater();
-protected:
-	bool _isWaterFlowing;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene2401WaterFlushing : public AnimatedSprite {
-public:
-	AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y);
-protected:
-	int _countdown;
-	int _flushLoopCount;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene2401Door : public AnimatedSprite {
-public:
-	AsScene2401Door(NeverhoodEngine *vm, bool isOpen);
-protected:
-	int _countdown;
-	bool _isOpen;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stDoorOpenFinished();
-};
-
 class Scene2401 : public Scene {
 public:
 	Scene2401(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -112,32 +74,6 @@ protected:
 	void playPipeSound(uint32 fileHash);
 };
 
-class AsScene2402Door : public AnimatedSprite {
-public:
-	AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen);
-protected:
-	Scene *_parentScene;
-	int _countdown;
-	bool _isOpen;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stDoorClosingFinished();
-};
-
-class AsScene2402TV : public AnimatedSprite {
-public:
-	AsScene2402TV(NeverhoodEngine *vm, Klaymen *klaymen);
-	virtual ~AsScene2402TV();
-protected:
-	Klaymen *_klaymen;
-	int _countdown1;
-	int _countdown2;
-	void upWait();
-	void upFocusKlaymen();
-	void stJokeFinished();
-	uint32 hmJoke(int messageNum, const MessageParam &param, Entity *sender);
-};
-
 class Scene2402 : public Scene {
 public:
 	Scene2402(NeverhoodEngine *vm, Module *parentModule, int which);
diff --git a/engines/neverhood/modules/module2400_sprites.cpp b/engines/neverhood/modules/module2400_sprites.cpp
new file mode 100644
index 0000000..4767670
--- /dev/null
+++ b/engines/neverhood/modules/module2400_sprites.cpp
@@ -0,0 +1,356 @@
+/* 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/modules/module2400_sprites.h"
+
+namespace Neverhood {
+
+static const uint32 kAsScene2401WaterSpitFileHashes2[] = {
+	0x5C044690, 0x5C644690, 0x5CA44690,
+	0x5D244690, 0x5E244690
+};
+
+static const uint32 kAsScene2401WaterSpitFileHashes1[] = {
+	0xF4418408, 0xF4418808, 0xF4419008,
+	0xF441A008, 0xCD4F8411
+};
+
+AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200) {
+
+	_x = 240;
+	_y = 447;
+	createSurface(100, 146, 74);
+	setVisible(false);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2401WaterSpit::handleMessage);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
+uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x120A0013)
+			playSound(0, kAsScene2401WaterSpitFileHashes1[_soundIndex]);
+		break;
+	case 0x2000:
+		_x = 240;
+		_y = 447;
+		_soundIndex = getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger());
+		startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1);
+		setVisible(true);
+		playSound(0, 0x48640244);
+		break;
+	case 0x3002:
+		stopAnimation();
+		setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200), _isWaterFlowing(false) {
+
+	_x = 88;
+	_y = 421;
+	createSurface1(0x10203116, 100);
+	setVisible(false);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2401FlowingWater::handleMessage);
+}
+
+AsScene2401FlowingWater::~AsScene2401FlowingWater() {
+	_vm->_soundMan->deleteSoundGroup(0x40F11C09);
+}
+
+uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (_isWaterFlowing && param.asInteger() == 0x02421405)
+			startAnimationByHash(0x10203116, 0x01084280, 0);
+		break;
+	case 0x2002:
+		if (!_isWaterFlowing) {
+			_vm->_soundMan->addSound(0x40F11C09, 0x980C1420);
+			_vm->_soundMan->playSoundLooping(0x980C1420);
+			startAnimation(0x10203116, 0, -1);
+			setVisible(true);
+			_isWaterFlowing = true;
+		}
+		break;
+	case 0x2003:
+		_vm->_soundMan->deleteSound(0x980C1420);
+		_isWaterFlowing = false;
+		break;
+	case 0x3002:
+		stopAnimation();
+		setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2401WaterFlushing::AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y)
+	: AnimatedSprite(vm, 1200), _countdown(0), _flushLoopCount(0) {
+
+	_x = x;
+	_y = y;
+	createSurface1(0xB8596884, 100);
+	setVisible(false);
+	SetUpdateHandler(&AsScene2401WaterFlushing::update);
+	SetMessageHandler(&AsScene2401WaterFlushing::handleMessage);
+}
+
+void AsScene2401WaterFlushing::update() {
+	if (_countdown != 0 && (--_countdown) == 0) {
+		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
+		startAnimation(0xB8596884, 0, -1);
+		setVisible(true);
+	}
+	AnimatedSprite::update();
+}
+
+uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (_flushLoopCount > 0 && param.asInteger() == 0x02421405) {
+			startAnimationByHash(0xB8596884, 0x01084280, 0);
+			_flushLoopCount--;
+		}
+		break;
+	case 0x2002:
+		if (param.asInteger() > 0) {
+			_flushLoopCount = param.asInteger() - 1;
+			_countdown = _vm->_rnd->getRandomNumber(3) + 1;
+		}
+		break;
+	case 0x3002:
+		stopAnimation();
+		setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen)
+	: AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen) {
+
+	_x = 320;
+	_y = 240;
+	createSurface1(0x44687810, 100);
+	_newStickFrameIndex = STICK_LAST_FRAME;
+	if (_isOpen) {
+		stopAnimation();
+		setVisible(false);
+		_countdown = 48;
+	} else {
+		startAnimation(0x44687810, 0, -1);
+		_newStickFrameIndex = 0;
+	}
+	SetUpdateHandler(&AsScene2401Door::update);
+	SetMessageHandler(&AsScene2401Door::handleMessage);
+}
+
+void AsScene2401Door::update() {
+	if (_isOpen && _countdown != 0 && (--_countdown) == 0) {
+		_isOpen = false;
+		setVisible(true);
+		startAnimation(0x44687810, -1, -1);
+		_newStickFrameIndex = 0;
+		_playBackwards = true;
+		playSound(0, calcHash("fxDoorClose38"));
+	}
+	AnimatedSprite::update();
+}
+
+uint32 AsScene2401Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2004:
+		if (_isOpen)
+			_countdown = 168;
+		messageResult = _isOpen ? 1 : 0;
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	case 0x4808:
+		if (!_isOpen) {
+			_countdown = 168;
+			_isOpen = true;
+			setVisible(true);
+			startAnimation(0x44687810, 0, -1);
+			playSound(0, calcHash("fxDoorOpen38"));
+			NextState(&AsScene2401Door::stDoorOpenFinished);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2401Door::stDoorOpenFinished() {
+	stopAnimation();
+	setVisible(false);
+}
+
+AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _countdown(0) {
+
+	_x = 320;
+	_y = 240;
+	createSurface1(0x80495831, 100);
+	if (_isOpen) {
+		startAnimation(0x80495831, -1, -1);
+		_newStickFrameIndex = STICK_LAST_FRAME;
+		_countdown = 48;
+	} else {
+		stopAnimation();
+		setVisible(false);
+	}
+	SetUpdateHandler(&AsScene2402Door::update);
+	SetMessageHandler(&AsScene2402Door::handleMessage);
+}
+
+void AsScene2402Door::update() {
+	if (_isOpen && _countdown != 0 && (--_countdown) == 0) {
+		_isOpen = false;
+		setVisible(true);
+		startAnimation(0x80495831, -1, -1);
+		_playBackwards = true;
+		playSound(0, calcHash("fxDoorClose38"));
+		NextState(&AsScene2402Door::stDoorClosingFinished);
+	}
+	AnimatedSprite::update();
+}
+
+uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		if (_isOpen)
+			_countdown = 144;
+		messageResult = _isOpen ? 1 : 0;
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	case 0x4808:
+		_countdown = 144;
+		_isOpen = true;
+		setVisible(true);
+		startAnimation(0x80495831, 0, -1);
+		_newStickFrameIndex = STICK_LAST_FRAME;
+		playSound(0, calcHash("fxDoorOpen38"));
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2402Door::stDoorClosingFinished() {
+	sendMessage(_parentScene, 0x2001, 0);
+	setVisible(false);
+}
+
+AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klaymen *klaymen)
+	: AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown1(0), _countdown2(0) {
+
+	_x = 260;
+	_y = 210;
+	createSurface(100, 127, 90);
+	setDoDeltaX(1);
+	SetMessageHandler(&Sprite::handleMessage);
+	if (!getGlobalVar(V_TV_JOKE_TOLD)) {
+		loadSound(0, 0x58208810);
+		_countdown1 = 48;
+		startAnimation(0x4919397A, 0, -1);
+		_newStickFrameIndex = 0;
+		SetUpdateHandler(&AsScene2402TV::upWait);
+	} else {
+		int16 frameIndex;
+		if (_klaymen->getX() > 320)
+			_currFrameIndex = 29;
+		frameIndex = CLIP<int16>((_klaymen->getX() - _x + 150) / 10, 0, 29);
+		startAnimation(0x050A0103, frameIndex, -1);
+		_newStickFrameIndex = frameIndex;
+		_countdown1 = 0;
+		SetUpdateHandler(&AsScene2402TV::upFocusKlaymen);
+	}
+}
+
+AsScene2402TV::~AsScene2402TV() {
+	_vm->_soundMan->deleteSoundGroup(0x01520123);
+}
+
+void AsScene2402TV::upWait() {
+	if (_countdown1 != 0 && (--_countdown1) == 0) {
+		startAnimation(0x4919397A, 0, -1);
+		SetMessageHandler(&AsScene2402TV::hmJoke);
+		NextState(&AsScene2402TV::stJokeFinished);
+	}
+	AnimatedSprite::update();
+}
+
+void AsScene2402TV::upFocusKlaymen() {
+	int16 frameIndex = CLIP<int16>((_klaymen->getX() - _x + 150) / 10, 0, 29);
+	if (frameIndex != _currFrameIndex) {
+		if (frameIndex > _currFrameIndex)
+			_currFrameIndex++;
+		else if (frameIndex < _currFrameIndex)
+			_currFrameIndex--;
+		startAnimation(0x050A0103, _currFrameIndex, -1);
+		_newStickFrameIndex = _currFrameIndex;
+		if (_countdown2 == 0) {
+			_vm->_soundMan->addSound(0x01520123, 0xC42D4528);
+			_vm->_soundMan->playSoundLooping(0xC42D4528);
+		}
+		_countdown2 = 5;
+	} else if (_countdown2 != 0 && (--_countdown2 == 0))
+		_vm->_soundMan->deleteSound(0xC42D4528);
+	AnimatedSprite::update();
+}
+
+void AsScene2402TV::stJokeFinished() {
+	setGlobalVar(V_TV_JOKE_TOLD, 1);
+	startAnimation(0x050A0103, 0, -1);
+	_newStickFrameIndex = 0;
+	SetUpdateHandler(&AsScene2402TV::upFocusKlaymen);
+}
+
+uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x431EA0B0)
+			playSound(0);
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/modules/module2400_sprites.h b/engines/neverhood/modules/module2400_sprites.h
new file mode 100644
index 0000000..1c4ab24
--- /dev/null
+++ b/engines/neverhood/modules/module2400_sprites.h
@@ -0,0 +1,99 @@
+/* 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_MODULES_MODULE2400_SPRITES_H
+#define NEVERHOOD_MODULES_MODULE2400_SPRITES_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+#include "neverhood/gamemodule.h"
+
+namespace Neverhood {
+
+class AsScene2401WaterSpit : public AnimatedSprite {
+public:
+	AsScene2401WaterSpit(NeverhoodEngine *vm);
+protected:
+	int _soundIndex;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2401FlowingWater : public AnimatedSprite {
+public:
+	AsScene2401FlowingWater(NeverhoodEngine *vm);
+	virtual ~AsScene2401FlowingWater();
+protected:
+	bool _isWaterFlowing;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2401WaterFlushing : public AnimatedSprite {
+public:
+	AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y);
+protected:
+	int _countdown;
+	int _flushLoopCount;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2401Door : public AnimatedSprite {
+public:
+	AsScene2401Door(NeverhoodEngine *vm, bool isOpen);
+protected:
+	int _countdown;
+	bool _isOpen;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stDoorOpenFinished();
+};
+
+class AsScene2402Door : public AnimatedSprite {
+public:
+	AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen);
+protected:
+	Scene *_parentScene;
+	int _countdown;
+	bool _isOpen;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stDoorClosingFinished();
+};
+
+class AsScene2402TV : public AnimatedSprite {
+public:
+	AsScene2402TV(NeverhoodEngine *vm, Klaymen *klaymen);
+	virtual ~AsScene2402TV();
+protected:
+	Klaymen *_klaymen;
+	int _countdown1;
+	int _countdown2;
+	void upWait();
+	void upFocusKlaymen();
+	void stJokeFinished();
+	uint32 hmJoke(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULES_MODULE2400_SPRITES_H */
diff --git a/engines/neverhood/modules/module2500.cpp b/engines/neverhood/modules/module2500.cpp
index 183793f..dcb3e94 100644
--- a/engines/neverhood/modules/module2500.cpp
+++ b/engines/neverhood/modules/module2500.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/modules/module2500.h"
+#include "neverhood/modules/module2500_sprites.h"
 #include "neverhood/modules/module2700_sprites.h"
 #include "neverhood/modules/module1600.h"
 
@@ -471,54 +472,6 @@ void Scene2501::updateKlaymenClipRect() {
 		_kmScene2501->setClipRect(0, 0, 640, 388);
 }
 
-SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm)
-	: StaticSprite(vm, 1400), _countdown(0), _isSoundPlaying(false) {
-
-	loadSprite(0x070220D9, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
-	setVisible(false);
-	loadSound(0, 0x4600204C);
-	loadSound(1, 0x408C0034);
-	loadSound(2, 0x44043000);
-	loadSound(3, 0x44045000);
-	SetMessageHandler(&SsScene2504Button::handleMessage);
-	SetUpdateHandler(&SsScene2504Button::update);
-}
-
-void SsScene2504Button::update() {
-	updatePosition();
-	if (_isSoundPlaying && !isSoundPlaying(0) && !isSoundPlaying(1)) {
-		playSound(3);
-		setVisible(false);
-		_isSoundPlaying = false;
-	}
-	if (_countdown != 0 && (--_countdown) == 0) {
-		if (getSubVar(VA_LOCKS_DISABLED, 0x01180951))
-			playSound(0);
-		else
-			playSound(1);
-		_isSoundPlaying = true;
-	}
-}
-
-uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		if (_countdown == 0 && !_isSoundPlaying) {
-			setVisible(true);
-			_countdown = 2;
-			if (getSubVar(VA_LOCKS_DISABLED, 0x01180951))
-				setSubVar(VA_LOCKS_DISABLED, 0x01180951, 0);
-			else
-				setSubVar(VA_LOCKS_DISABLED, 0x01180951, 1);
-			playSound(2);
-		}
-		messageResult = 1;
-		break;
-	}
-	return messageResult;
-}
-
 Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule) {
 
diff --git a/engines/neverhood/modules/module2500.h b/engines/neverhood/modules/module2500.h
index 07db790..2f07f24 100644
--- a/engines/neverhood/modules/module2500.h
+++ b/engines/neverhood/modules/module2500.h
@@ -79,16 +79,6 @@ protected:
 	void updateKlaymenClipRect();
 };
 
-class SsScene2504Button : public StaticSprite {
-public:
-	SsScene2504Button(NeverhoodEngine *vm);
-protected:
-	int _countdown;
-	bool _isSoundPlaying;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
 class Scene2504 : public Scene {
 public:
 	Scene2504(NeverhoodEngine *vm, Module *parentModule, int which);
diff --git a/engines/neverhood/modules/module2500_sprites.cpp b/engines/neverhood/modules/module2500_sprites.cpp
new file mode 100644
index 0000000..490c07a
--- /dev/null
+++ b/engines/neverhood/modules/module2500_sprites.cpp
@@ -0,0 +1,75 @@
+/* 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/modules/module2500_sprites.h"
+
+namespace Neverhood {
+
+SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm)
+	: StaticSprite(vm, 1400), _countdown(0), _isSoundPlaying(false) {
+
+	loadSprite(0x070220D9, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
+	setVisible(false);
+	loadSound(0, 0x4600204C);
+	loadSound(1, 0x408C0034);
+	loadSound(2, 0x44043000);
+	loadSound(3, 0x44045000);
+	SetMessageHandler(&SsScene2504Button::handleMessage);
+	SetUpdateHandler(&SsScene2504Button::update);
+}
+
+void SsScene2504Button::update() {
+	updatePosition();
+	if (_isSoundPlaying && !isSoundPlaying(0) && !isSoundPlaying(1)) {
+		playSound(3);
+		setVisible(false);
+		_isSoundPlaying = false;
+	}
+	if (_countdown != 0 && (--_countdown) == 0) {
+		if (getSubVar(VA_LOCKS_DISABLED, 0x01180951))
+			playSound(0);
+		else
+			playSound(1);
+		_isSoundPlaying = true;
+	}
+}
+
+uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown == 0 && !_isSoundPlaying) {
+			setVisible(true);
+			_countdown = 2;
+			if (getSubVar(VA_LOCKS_DISABLED, 0x01180951))
+				setSubVar(VA_LOCKS_DISABLED, 0x01180951, 0);
+			else
+				setSubVar(VA_LOCKS_DISABLED, 0x01180951, 1);
+			playSound(2);
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/modules/module2500_sprites.h b/engines/neverhood/modules/module2500_sprites.h
new file mode 100644
index 0000000..4b964e7
--- /dev/null
+++ b/engines/neverhood/modules/module2500_sprites.h
@@ -0,0 +1,44 @@
+/* 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_MODULES_MODULE2500_SPRITES_H
+#define NEVERHOOD_MODULES_MODULE2500_SPRITES_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+class SsScene2504Button : public StaticSprite {
+public:
+	SsScene2504Button(NeverhoodEngine *vm);
+protected:
+	int _countdown;
+	bool _isSoundPlaying;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULES_MODULE2500_SPRITES_H */
diff --git a/engines/neverhood/modules/module2600.cpp b/engines/neverhood/modules/module2600.cpp
index 2fce82b..a6484a4 100644
--- a/engines/neverhood/modules/module2600.cpp
+++ b/engines/neverhood/modules/module2600.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/modules/module2600.h"
+#include "neverhood/modules/module2600_sprites.h"
 
 namespace Neverhood {
 
@@ -219,94 +220,6 @@ void Module2600::updateScene() {
 	}
 }
 
-SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
-	: StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) {
-
-	SetUpdateHandler(&SsScene2609Button::update);
-	SetMessageHandler(&SsScene2609Button::handleMessage);
-
-	loadSprite(0x825A6923, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
-	if (!getGlobalVar(V_WATER_RUNNING))
-		setVisible(false);
-	loadSound(0, 0x10267160);
-	loadSound(1, 0x7027FD64);
-	loadSound(2, 0x44043000);
-	loadSound(3, 0x44045000);
-}
-
-void SsScene2609Button::update() {
-	updatePosition();
-	if (_countdown != 0 && (--_countdown == 0)) {
-		if (getGlobalVar(V_WATER_RUNNING)) {
-			setGlobalVar(V_WATER_RUNNING, 0);
-			sendMessage(_parentScene, 0x2001, 0);
-		} else {
-			setGlobalVar(V_WATER_RUNNING, 1);
-			sendMessage(_parentScene, 0x2002, 0);
-		}
-	}
-}
-
-uint32 SsScene2609Button::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		if (_countdown == 0) {
-			sendMessage(_parentScene, 0x2000, 0);
-			if (getGlobalVar(V_WATER_RUNNING)) {
-				setVisible(false);
-				playSound(3);
-				playSound(1);
-				_countdown = 12;
-			} else {
-				setVisible(true);
-				playSound(2);
-				playSound(0);
-				_countdown = 96;
-			}
-		}
-		messageResult = 1;
-		break;
-	}
-	return messageResult;
-}
-
-AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1000) {
-
-	_x = 240;
-	_y = 420;
-	setDoDeltaX(1);
-	createSurface1(0x9C210C90, 1200);
-	setClipRect(260, 260, 400, 368);
-	_vm->_soundMan->addSound(0x08526C36, 0xDC2769B0);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene2609Water::handleMessage);
-	if (getGlobalVar(V_WATER_RUNNING))
-		sendMessage(this, 0x2002, 0);
-}
-
-AsScene2609Water::~AsScene2609Water() {
-	_vm->_soundMan->deleteSoundGroup(0x08526C36);
-}
-
-uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2001:
-		stopAnimation();
-		setVisible(false);
-		_vm->_soundMan->stopSound(0xDC2769B0);
-		break;
-	case 0x2002:
-		startAnimation(0x9C210C90, 0, -1);
-		setVisible(true);
-		_vm->_soundMan->playSoundLooping(0xDC2769B0);
-		break;
-	}
-	return messageResult;
-}
-
 Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _isBusy(false) {
 
diff --git a/engines/neverhood/modules/module2600.h b/engines/neverhood/modules/module2600.h
index d972e0f..99ec3a3 100644
--- a/engines/neverhood/modules/module2600.h
+++ b/engines/neverhood/modules/module2600.h
@@ -41,24 +41,6 @@ protected:
 	void updateScene();
 };
 
-class SsScene2609Button : public StaticSprite {
-public:
-	SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	int _countdown;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene2609Water : public AnimatedSprite {
-public:
-	AsScene2609Water(NeverhoodEngine *vm);
-	virtual ~AsScene2609Water();
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
 class Scene2609 : public Scene {
 public:
 	Scene2609(NeverhoodEngine *vm, Module *parentModule, int which);
diff --git a/engines/neverhood/modules/module2600_sprites.cpp b/engines/neverhood/modules/module2600_sprites.cpp
new file mode 100644
index 0000000..2c24b53
--- /dev/null
+++ b/engines/neverhood/modules/module2600_sprites.cpp
@@ -0,0 +1,115 @@
+/* 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/modules/module2600_sprites.h"
+
+namespace Neverhood {
+
+SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
+	: StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) {
+
+	SetUpdateHandler(&SsScene2609Button::update);
+	SetMessageHandler(&SsScene2609Button::handleMessage);
+
+	loadSprite(0x825A6923, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
+	if (!getGlobalVar(V_WATER_RUNNING))
+		setVisible(false);
+	loadSound(0, 0x10267160);
+	loadSound(1, 0x7027FD64);
+	loadSound(2, 0x44043000);
+	loadSound(3, 0x44045000);
+}
+
+void SsScene2609Button::update() {
+	updatePosition();
+	if (_countdown != 0 && (--_countdown == 0)) {
+		if (getGlobalVar(V_WATER_RUNNING)) {
+			setGlobalVar(V_WATER_RUNNING, 0);
+			sendMessage(_parentScene, 0x2001, 0);
+		} else {
+			setGlobalVar(V_WATER_RUNNING, 1);
+			sendMessage(_parentScene, 0x2002, 0);
+		}
+	}
+}
+
+uint32 SsScene2609Button::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown == 0) {
+			sendMessage(_parentScene, 0x2000, 0);
+			if (getGlobalVar(V_WATER_RUNNING)) {
+				setVisible(false);
+				playSound(3);
+				playSound(1);
+				_countdown = 12;
+			} else {
+				setVisible(true);
+				playSound(2);
+				playSound(0);
+				_countdown = 96;
+			}
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1000) {
+
+	_x = 240;
+	_y = 420;
+	setDoDeltaX(1);
+	createSurface1(0x9C210C90, 1200);
+	setClipRect(260, 260, 400, 368);
+	_vm->_soundMan->addSound(0x08526C36, 0xDC2769B0);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2609Water::handleMessage);
+	if (getGlobalVar(V_WATER_RUNNING))
+		sendMessage(this, 0x2002, 0);
+}
+
+AsScene2609Water::~AsScene2609Water() {
+	_vm->_soundMan->deleteSoundGroup(0x08526C36);
+}
+
+uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2001:
+		stopAnimation();
+		setVisible(false);
+		_vm->_soundMan->stopSound(0xDC2769B0);
+		break;
+	case 0x2002:
+		startAnimation(0x9C210C90, 0, -1);
+		setVisible(true);
+		_vm->_soundMan->playSoundLooping(0xDC2769B0);
+		break;
+	}
+	return messageResult;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/modules/module2600_sprites.h b/engines/neverhood/modules/module2600_sprites.h
new file mode 100644
index 0000000..c36e72c
--- /dev/null
+++ b/engines/neverhood/modules/module2600_sprites.h
@@ -0,0 +1,54 @@
+/* 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_MODULES_MODULE2600_SPRITES_H
+#define NEVERHOOD_MODULES_MODULE2600_SPRITES_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module2600
+
+class SsScene2609Button : public StaticSprite {
+public:
+	SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2609Water : public AnimatedSprite {
+public:
+	AsScene2609Water(NeverhoodEngine *vm);
+	virtual ~AsScene2609Water();
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULES_MODULE2600_SPRITES_H */






More information about the Scummvm-git-logs mailing list