[Scummvm-cvs-logs] scummvm master -> 1e87d135bedf9844e3e44a4261ffcb44aac67feb

bluegr bluegr at gmail.com
Sat Oct 5 20:32:58 CEST 2013


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

Summary:
bf96d305b5 NEVERHOOD: Split sprites from their scenes in modules 1300 and 1400
55a8e7a2de NEVERHOOD: Split sprites from their scenes in module 1200
1e87d135be FULLPIPE: Silence false positives about uninitialized variables in MSVC


Commit: bf96d305b59d1abbf59d3f03622bc025f494791f
    https://github.com/scummvm/scummvm/commit/bf96d305b59d1abbf59d3f03622bc025f494791f
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-10-05T11:30:48-07:00

Commit Message:
NEVERHOOD: Split sprites from their scenes in modules 1300 and 1400

Changed paths:
  A engines/neverhood/modules/module1300_sprites.cpp
  A engines/neverhood/modules/module1300_sprites.h
  A engines/neverhood/modules/module1400_sprites.cpp
  A engines/neverhood/modules/module1400_sprites.h
    engines/neverhood/module.mk
    engines/neverhood/modules/module1300.cpp
    engines/neverhood/modules/module1300.h
    engines/neverhood/modules/module1400.cpp
    engines/neverhood/modules/module1400.h



diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index cd0a9fa..7a36bc3 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -18,7 +18,9 @@ MODULE_OBJS = \
 	modules/module1100.o \
 	modules/module1200.o \
 	modules/module1300.o \
+	modules/module1300_sprites.o \
 	modules/module1400.o \
+	modules/module1400_sprites.o \
 	modules/module1500.o \
 	modules/module1600.o \
 	modules/module1600_sprites.o \
diff --git a/engines/neverhood/modules/module1300.cpp b/engines/neverhood/modules/module1300.cpp
index 88f5784..604f60d 100644
--- a/engines/neverhood/modules/module1300.cpp
+++ b/engines/neverhood/modules/module1300.cpp
@@ -20,10 +20,11 @@
  *
  */
 
-#include "neverhood/modules/module1300.h"
 #include "neverhood/modules/module1000.h"
 #include "neverhood/modules/module1200.h"
-#include "neverhood/modules/module1400.h"
+#include "neverhood/modules/module1300.h"
+#include "neverhood/modules/module1300_sprites.h"
+#include "neverhood/modules/module1400_sprites.h"
 #include "neverhood/modules/module2200_sprites.h"
 #include "neverhood/gamemodule.h"
 #include "neverhood/diskplayerscene.h"
@@ -311,113 +312,6 @@ void Module1300::updateScene() {
 	}
 }
 
-AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
-
-	_x = 320;
-	_y = 240;
-	createSurface1(0x88148150, 500);
-	if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
-		startAnimation(0x88148150, 0, -1);
-		_newStickFrameIndex = 0;
-	} else {
-		startAnimation(0x88148150, -1, -1);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-	}
-	loadSound(0, 0x68895082);
-	loadSound(1, 0x689BD0C1);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1302Bridge::handleMessage);
-}
-
-uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	case 0x4808:
-		stLowerBridge();
-		break;
-	case 0x4809:
-		stRaiseBridge();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1302Bridge::stLowerBridge() {
-	startAnimation(0x88148150, 0, -1);
-	playSound(1);
-	NextState(&AsScene1302Bridge::cbLowerBridgeEvent);
-}
-
-void AsScene1302Bridge::stRaiseBridge() {
-	startAnimation(0x88148150, 7, -1);
-	_playBackwards = true;
-	_newStickFrameIndex = 0;
-	playSound(0);
-}
-
-void AsScene1302Bridge::cbLowerBridgeEvent() {
-	sendMessage(_parentScene, 0x2032, 0);
-	startAnimation(0x88148150, -1, -1);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-}
-
-SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
-	: StaticSprite(vm, 0x11122122, 200) {
-
-	_firstY = _y;
-	if (getGlobalVar(V_FLYTRAP_RING_FENCE))
-		_y += 152;
-	loadSound(0, 0x7A00400C);
-	loadSound(1, 0x78184098);
-	SetUpdateHandler(&SsScene1302Fence::update);
-	SetMessageHandler(&SsScene1302Fence::handleMessage);
-	SetSpriteUpdate(NULL);
-}
-
-void SsScene1302Fence::update() {
-	handleSpriteUpdate();
-	updatePosition();
-}
-
-uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x4808:
-		playSound(0);
-		SetMessageHandler(NULL);
-		SetSpriteUpdate(&SsScene1302Fence::suMoveDown);
-		break;
-	case 0x4809:
-		playSound(1);
-		SetMessageHandler(NULL);
-		SetSpriteUpdate(&SsScene1302Fence::suMoveUp);
-		break;
-	}
-	return messageResult;
-}
-
-void SsScene1302Fence::suMoveDown() {
-	if (_y < _firstY + 152)
-		_y += 8;
-	else {
-		SetMessageHandler(&SsScene1302Fence::handleMessage);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-void SsScene1302Fence::suMoveUp() {
-	if (_y > _firstY)
-		_y -= 8;
-	else {
-		SetMessageHandler(&SsScene1302Fence::handleMessage);
-		SetSpriteUpdate(NULL);
-	}
-}
-
 Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule) {
 
@@ -581,54 +475,6 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
-AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
-
-	createSurface(200, 128, 315);
-	_x = 289;
-	_y = 390;
-	startAnimation(0x800278D2, 0, -1);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1303Balloon::handleMessage);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
-uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		sendMessage(_parentScene, 0x4826, 0);
-		messageResult = 1;
-		break;
-	case 0x2000:
-		stPopBalloon();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x020B0003)
-			playSound(0, 0x742B0055);
-		break;
-	case 0x3002:
-		playSound(0, 0x470007EE);
-		stopAnimation();
-		setVisible(false);
-		SetMessageHandler(NULL);
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1303Balloon::stPopBalloon() {
-	startAnimation(0xAC004CD0, 0, -1);
-	SetMessageHandler(&AsScene1303Balloon::hmBalloonPopped);
-}
-
 Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule), _asBalloon(NULL) {
 
@@ -668,29 +514,6 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-AsScene1304Needle::AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y)
-	: AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) {
-
-	// NOTE: Skipped check if Klaymen already has the needle since that's done in the scene itself
-	SetMessageHandler(&AsScene1304Needle::handleMessage);
-}
-
-uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		sendMessage(_parentScene, 0x4826, 0);
-		messageResult = 1;
-		break;
-	case 0x4806:
-		setGlobalVar(V_HAS_NEEDLE, 1);
-		setVisible(false);
-		SetMessageHandler(NULL);
-		break;
-	}
-	return messageResult;
-}
-
 Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _asNeedle(NULL) {
 
@@ -781,91 +604,6 @@ uint32 Scene1305::handleMessage(int messageNum, const MessageParam &param, Entit
 	return Scene::handleMessage(messageNum, param, sender);
 }
 
-AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _asElevatorDoor(asElevatorDoor), _isUp(false), _isDown(true),
-	_countdown(0) {
-
-	_x = 320;
-	_y = 240;
-	createSurface1(0x043B0270, 100);
-	startAnimation(0x043B0270, 0, -1);
-	_newStickFrameIndex = 0;
-	loadSound(0, 0x1C100E83);
-	loadSound(1, 0x1C08CEC5);
-	loadSound(2, 0x5D011E87);
-	SetMessageHandler(&AsScene1306Elevator::handleMessage);
-}
-
-void AsScene1306Elevator::update() {
-	if (_isUp && _countdown != 0 && (--_countdown == 0))
-		stGoingDown();
-	AnimatedSprite::update();
-	if (_currFrameIndex == 7 && _asElevatorDoor->getVisible()) {
-		playSound(1);
-		_asElevatorDoor->setVisible(false);
-	}
-}
-
-void AsScene1306Elevator::upGoingDown() {
-	AnimatedSprite::update();
-	if (_currFrameIndex == 5)
-		_asElevatorDoor->setVisible(true);
-}
-
-uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2001:
-		if (_isUp)
-			_countdown = 144;
-		messageResult = _isUp ? 1 : 0;
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	case 0x4808:
-		if (_isDown)
-			stGoingUp();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1306Elevator::stGoingUp() {
-	setVisible(true);
-	_isDown = false;
-	startAnimation(0x043B0270, 0, -1);
-	playSound(0);
-	SetUpdateHandler(&AsScene1306Elevator::update);
-	NextState(&AsScene1306Elevator::cbGoingUpEvent);
-}
-
-void AsScene1306Elevator::cbGoingUpEvent() {
-	sendMessage(_parentScene, 0x4808, 0);
-	_isUp = true;
-	_countdown = 144;
-	stopAnimation();
-	setVisible(false);
-	SetUpdateHandler(&AsScene1306Elevator::update);
-}
-
-void AsScene1306Elevator::stGoingDown() {
-	_isUp = false;
-	setVisible(true);
-	startAnimation(0x043B0270, -1, -1);
-	_playBackwards = true;
-	playSound(1);
-	SetUpdateHandler(&AsScene1306Elevator::upGoingDown);
-	NextState(&AsScene1306Elevator::cbGoingDownEvent);
-}
-
-void AsScene1306Elevator::cbGoingDownEvent() {
-	_isDown = true;
-	sendMessage(_parentScene, 0x4809, 0);
-	stopAnimation();
-	SetUpdateHandler(&AsScene1306Elevator::update);
-}
-
 Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule) {
 
@@ -1039,188 +777,6 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam &param,
 	return 0;
 }
 
-static const uint32 kAsScene1307KeyResourceList1[] = {
-	0x0438069C, 0x45B0023C, 0x05700217
-};
-
-static const uint32 kAsScene1307KeyResourceList2[] = {
-	0x04441334, 0x061433F0, 0x06019390
-};
-
-static const uint32 kAsScene1307KeyResourceList3[] = {
-	0x11A80030, 0x178812B1, 0x1488121C
-};
-
-static const uint32 *kAsScene1307KeyResourceLists[] = {
-	kAsScene1307KeyResourceList1,
-	kAsScene1307KeyResourceList2,
-	kAsScene1307KeyResourceList3
-};
-
-static const int kAsScene1307KeySurfacePriorities[] = {
-	700, 500, 300, 100
-};
-
-const uint kAsScene1307KeyPointsCount = 12;
-
-static const NPoint kAsScene1307KeyPoints[] = {
-	{-2,  0}, {-5,  0}, { 5,  0},
-	{12,  0}, {17,  0}, {25,  0},
-	{16, -2}, {10, -6}, { 0, -7},
-	{-7, -3}, {-3,  4}, { 2,  2}
-};
-
-const uint kAsScene1307KeyFrameIndicesCount = 20;
-
-static const int16 kAsScene1307KeyFrameIndices[] = {
-	 1,  4,  8, 11, 15, 16, 17, 17, 17, 16,
-	15, 14, 12, 10,  9,  7,  5,  3,  2,  1
-};
-
-const int kAsScene1307KeyDivValue = 200;
-const int16 kAsScene1307KeyXDelta = 70;
-const int16 kAsScene1307KeyYDelta = -12;
-
-AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _keyIndex(keyIndex), _clipRects(clipRects),
-	_isClickable(true) {
-
-	NPoint pt;
-	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex];
-
-	_dataResource.load(0x22102142);
-	_pointList = _dataResource.getPointArray(0xAC849240);
-	pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)];
-	_x = pt.x;
-	_y = pt.y;
-	createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4], 190, 148);
-	startAnimation(fileHashes[0], 0, -1);
-	loadSound(0, 0xDC4A1280);
-	loadSound(1, 0xCC021233);
-	loadSound(2, 0xC4C23844);
-	loadSound(3, 0xC4523208);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1307Key::handleMessage);
-}
-
-uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		if (_isClickable) {
-			sendMessage(_parentScene, 0x4826, 0);
-			stRemoveKey();
-			messageResult = 1;
-		}
-		break;
-	case 0x2000:
-		_isClickable = param.asInteger() != 0;
-		break;
-	case 0x2001:
-		setSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex, param.asInteger());
-		stMoveKey();
-		break;
-	case 0x2003:
-		playSound(3);
-		stUnlock();
-		break;
-	case 0x2004:
-		playSound(2);
-		stInsert();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1307Key::suRemoveKey() {
-	if (_pointIndex < kAsScene1307KeyPointsCount) {
-		_x += kAsScene1307KeyPoints[_pointIndex].x;
-		_y += kAsScene1307KeyPoints[_pointIndex].y;
-		updateBounds();
-		_pointIndex++;
-	} else {
-		SetSpriteUpdate(NULL);
-	}
-}
-
-void AsScene1307Key::suInsertKey() {
-	if (_pointIndex < kAsScene1307KeyPointsCount) {
-		_x -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].x;
-		_y -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].y;
-		updateBounds();
-		_pointIndex++;
-		if (_pointIndex == 7)
-			playSound(0);
-	} else {
-		SetSpriteUpdate(NULL);
-		sendMessage(_parentScene, 0x2002, 0);
-	}
-}
-
-void AsScene1307Key::suMoveKey() {
-	if (_pointIndex < kAsScene1307KeyFrameIndicesCount) {
-		_frameIndex += kAsScene1307KeyFrameIndices[_pointIndex];
-		_x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue;
-		_y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue;
-		updateBounds();
-		_pointIndex++;
-	} else {
-		NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)];
-		_x = pt.x + kAsScene1307KeyXDelta;
-		_y = pt.y + kAsScene1307KeyYDelta;
-		stInsertKey();
-	}
-}
-
-void AsScene1307Key::stRemoveKey() {
-	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex];
-	_pointIndex = 0;
-	startAnimation(fileHashes[0], 0, -1);
-	playSound(1);
-	SetSpriteUpdate(&AsScene1307Key::suRemoveKey);
-}
-
-void AsScene1307Key::stInsertKey() {
-	_pointIndex = 0;
-	sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]);
-	setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-	SetSpriteUpdate(&AsScene1307Key::suInsertKey);
-}
-
-void AsScene1307Key::stMoveKey() {
-	NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)];
-	int16 newX = pt.x + kAsScene1307KeyXDelta;
-	int16 newY = pt.y + kAsScene1307KeyYDelta;
-	sendMessage(_parentScene, 0x1022, 1000);
-	setClipRect(0, 0, 640, 480);
-	_prevX = _x;
-	_prevY = _y;
-	if (newX == _x && newY == _y) {
-		stInsertKey();
-	} else {
-		const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex];
-		_pointIndex = 0;
-		_frameIndex = 0;
-		_deltaX = newX - _x;
-		_deltaY = newY - _y;
-		startAnimation(fileHashes[0], 0, -1);
-		SetSpriteUpdate(&AsScene1307Key::suMoveKey);
-	}
-}
-
-void AsScene1307Key::stUnlock() {
-	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex];
-	startAnimation(fileHashes[1], 0, -1);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-}
-
-void AsScene1307Key::stInsert() {
-	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex];
-	startAnimation(fileHashes[2], 0, -1);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-}
-
 Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule), _countdown(0), _asCurrKey(NULL),
 	_isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) {
@@ -1360,164 +916,6 @@ static const uint32 kScene1308NumberFileHashes[] = {
 	0x00306322
 };
 
-AsScene1308JaggyDoor::AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _parentScene(parentScene) {
-
-	setVisible(false);
-	stopAnimation();
-	SetMessageHandler(&AsScene1308JaggyDoor::handleMessage);
-}
-
-uint32 AsScene1308JaggyDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	case 0x4808:
-		stOpenDoor();
-		break;
-	case 0x4809:
-		stCloseDoor();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1308JaggyDoor::stOpenDoor() {
-	startAnimation(0xBA0AE050, 0, -1);
-	setVisible(true);
-	playSound(0, calcHash("fxDoorOpen38"));
-	NextState(&AsScene1308JaggyDoor::stOpenDoorDone);
-}
-
-void AsScene1308JaggyDoor::stOpenDoorDone() {
-	sendMessage(_parentScene, 0x2000, 0);
-	stopAnimation();
-	setVisible(false);
-}
-
-void AsScene1308JaggyDoor::stCloseDoor() {
-	startAnimation(0xBA0AE050, -1, -1);
-	_playBackwards = true;
-	setVisible(true);
-	playSound(0, calcHash("fxDoorClose38"));
-	NextState(&AsScene1308JaggyDoor::stCloseDoorDone);
-}
-
-void AsScene1308JaggyDoor::stCloseDoorDone() {
-	sendMessage(_parentScene, 0x2001, 0);
-	stopAnimation();
-}
-
-AsScene1308KeyboardDoor::AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _parentScene(parentScene) {
-
-	playSound(0, 0x51456049);
-	SetMessageHandler(&AsScene1308KeyboardDoor::handleMessage);
-	NextState(&AsScene1308KeyboardDoor::stFallingKeys);
-}
-
-uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1308KeyboardDoor::stFallingKeys() {
-	startAnimation(0x6238B191, 0, -1);
-	_x = 580;
-	_y = 383;
-	NextState(&AsScene1308KeyboardDoor::stFallingKeysDone);
-}
-
-void AsScene1308KeyboardDoor::stFallingKeysDone() {
-	sendMessage(_parentScene, 0x2004, 0);
-	stopAnimation();
-	setVisible(false);
-}
-
-AsScene1308LightWallSymbols::AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) {
-
-	setVisible(false);
-	stopAnimation();
-	Entity::_priority = 1200;
-	SetMessageHandler(&AsScene1308LightWallSymbols::handleMessage);
-}
-
-uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2002:
-		stFadeIn();
-		break;
-	case 0x2003:
-		stFadeOut();
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1308LightWallSymbols::stFadeIn() {
-	startAnimation(0x80180A10, 0, -1);
-	setVisible(true);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-}
-
-void AsScene1308LightWallSymbols::stFadeOut() {
-	startAnimation(0x80180A10, -1, -1);
-	_playBackwards = true;
-	NextState(&AsScene1308LightWallSymbols::stFadeOutDone);
-}
-
-void AsScene1308LightWallSymbols::stFadeOutDone() {
-	sendMessage(_parentScene, 0x2003, 0);
-	stopAnimation();
-	setVisible(false);
-}
-
-SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index)
-	: StaticSprite(vm, fileHash, 100) {
-
-	setVisible(false);
-	_x = _spriteResource.getPosition().x + index * 20;
-	updatePosition();
-}
-
-AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1100) {
-
-	_x = 286;
-	_y = 429;
-	createSurface1(0xA282C472, 100);
-	startAnimation(0xA282C472, 0, -1);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1308Mouse::handleMessage);
-}
-
-uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x66382026)
-			playSound(0, 0x0CD84468);
-		else if (param.asInteger() == 0x6E28061C)
-			playSound(0, 0x78C8402C);
-		else if (param.asInteger() == 0x462F0410)
-			playSound(0, 0x60984E28);
-		break;
-	}
-	return messageResult;
-}
-
 Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _isProjecting(false), _asProjector(NULL) {
 
diff --git a/engines/neverhood/modules/module1300.h b/engines/neverhood/modules/module1300.h
index 501f763..2f59ff1 100644
--- a/engines/neverhood/modules/module1300.h
+++ b/engines/neverhood/modules/module1300.h
@@ -30,8 +30,6 @@
 
 namespace Neverhood {
 
-// Module1300
-
 class Module1300 : public Module {
 public:
 	Module1300(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -43,28 +41,6 @@ protected:
 	void updateScene();
 };
 
-class AsScene1302Bridge : public AnimatedSprite {
-public:
-	AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stLowerBridge();
-	void stRaiseBridge();
-	void cbLowerBridgeEvent();
-};
-
-class SsScene1302Fence : public StaticSprite {
-public:
-	SsScene1302Fence(NeverhoodEngine *vm);
-protected:
-	int16 _firstY;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void suMoveDown();
-	void suMoveUp();
-};
-
 class Scene1302 : public Scene {
 public:
 	Scene1302(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -84,16 +60,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class AsScene1303Balloon : public AnimatedSprite {
-public:
-	AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmBalloonPopped(int messageNum, const MessageParam &param, Entity *sender);
-	void stPopBalloon();
-};
-
 class Scene1303 : public Scene {
 public:
 	Scene1303(NeverhoodEngine *vm, Module *parentModule);
@@ -103,14 +69,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class AsScene1304Needle : public AnimatedSprite {
-public:
-	AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
 class Scene1304 : public Scene {
 public:
 	Scene1304(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -128,24 +86,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class AsScene1306Elevator : public AnimatedSprite {
-public:
-	AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor);
-protected:
-	Scene *_parentScene;
-	AnimatedSprite *_asElevatorDoor;
-	bool _isUp;
-	bool _isDown;
-	int _countdown;
-	void update();
-	void upGoingDown();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stGoingUp();
-	void cbGoingUpEvent();
-	void stGoingDown();
-	void cbGoingDownEvent();
-};
-
 class Scene1306 : public Scene {
 public:
 	Scene1306(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -161,30 +101,6 @@ protected:
 	uint32 handleMessage416EB0(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class AsScene1307Key : public AnimatedSprite {
-public:
-	AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects);
-protected:
-	Scene *_parentScene;
-	NPointArray *_pointList;
-	uint _pointIndex;
-	int _frameIndex;
-	uint _keyIndex;
-	NRect *_clipRects;
-	bool _isClickable;
-	int16 _prevX, _prevY;
-	int16 _deltaX, _deltaY;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void suRemoveKey();
-	void suInsertKey();
-	void suMoveKey();
-	void stRemoveKey();
-	void stInsertKey();
-	void stMoveKey();
-	void stUnlock();
-	void stInsert();
-};
-
 class Scene1307 : public Scene {
 public:
 	Scene1307(NeverhoodEngine *vm, Module *parentModule);
@@ -202,51 +118,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class AsScene1308JaggyDoor : public AnimatedSprite {
-public:
-	AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stOpenDoor();
-	void stOpenDoorDone();
-	void stCloseDoor();
-	void stCloseDoorDone();
-};
-
-class AsScene1308KeyboardDoor : public AnimatedSprite {
-public:
-	AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stFallingKeys();
-	void stFallingKeysDone();
-};
-
-class AsScene1308LightWallSymbols : public AnimatedSprite {
-public:
-	AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stFadeIn();
-	void stFadeOut();
-	void stFadeOutDone();
-};
-
-class SsScene1308Number : public StaticSprite {
-public:
-	SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index);
-};
-
-class AsScene1308Mouse : public AnimatedSprite {
-public:
-	AsScene1308Mouse(NeverhoodEngine *vm);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
 class Scene1308 : public Scene {
 public:
 	Scene1308(NeverhoodEngine *vm, Module *parentModule, int which);
diff --git a/engines/neverhood/modules/module1300_sprites.cpp b/engines/neverhood/modules/module1300_sprites.cpp
new file mode 100644
index 0000000..1ddee34
--- /dev/null
+++ b/engines/neverhood/modules/module1300_sprites.cpp
@@ -0,0 +1,630 @@
+/* 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/module1300_sprites.h"
+
+namespace Neverhood {
+
+AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
+
+	_x = 320;
+	_y = 240;
+	createSurface1(0x88148150, 500);
+	if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
+		startAnimation(0x88148150, 0, -1);
+		_newStickFrameIndex = 0;
+	} else {
+		startAnimation(0x88148150, -1, -1);
+		_newStickFrameIndex = STICK_LAST_FRAME;
+	}
+	loadSound(0, 0x68895082);
+	loadSound(1, 0x689BD0C1);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1302Bridge::handleMessage);
+}
+
+uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	case 0x4808:
+		stLowerBridge();
+		break;
+	case 0x4809:
+		stRaiseBridge();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1302Bridge::stLowerBridge() {
+	startAnimation(0x88148150, 0, -1);
+	playSound(1);
+	NextState(&AsScene1302Bridge::cbLowerBridgeEvent);
+}
+
+void AsScene1302Bridge::stRaiseBridge() {
+	startAnimation(0x88148150, 7, -1);
+	_playBackwards = true;
+	_newStickFrameIndex = 0;
+	playSound(0);
+}
+
+void AsScene1302Bridge::cbLowerBridgeEvent() {
+	sendMessage(_parentScene, 0x2032, 0);
+	startAnimation(0x88148150, -1, -1);
+	_newStickFrameIndex = STICK_LAST_FRAME;
+}
+
+SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
+	: StaticSprite(vm, 0x11122122, 200) {
+
+	_firstY = _y;
+	if (getGlobalVar(V_FLYTRAP_RING_FENCE))
+		_y += 152;
+	loadSound(0, 0x7A00400C);
+	loadSound(1, 0x78184098);
+	SetUpdateHandler(&SsScene1302Fence::update);
+	SetMessageHandler(&SsScene1302Fence::handleMessage);
+	SetSpriteUpdate(NULL);
+}
+
+void SsScene1302Fence::update() {
+	handleSpriteUpdate();
+	updatePosition();
+}
+
+uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4808:
+		playSound(0);
+		SetMessageHandler(NULL);
+		SetSpriteUpdate(&SsScene1302Fence::suMoveDown);
+		break;
+	case 0x4809:
+		playSound(1);
+		SetMessageHandler(NULL);
+		SetSpriteUpdate(&SsScene1302Fence::suMoveUp);
+		break;
+	}
+	return messageResult;
+}
+
+void SsScene1302Fence::suMoveDown() {
+	if (_y < _firstY + 152)
+		_y += 8;
+	else {
+		SetMessageHandler(&SsScene1302Fence::handleMessage);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+void SsScene1302Fence::suMoveUp() {
+	if (_y > _firstY)
+		_y -= 8;
+	else {
+		SetMessageHandler(&SsScene1302Fence::handleMessage);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
+
+	createSurface(200, 128, 315);
+	_x = 289;
+	_y = 390;
+	startAnimation(0x800278D2, 0, -1);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1303Balloon::handleMessage);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
+uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		sendMessage(_parentScene, 0x4826, 0);
+		messageResult = 1;
+		break;
+	case 0x2000:
+		stPopBalloon();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x020B0003)
+			playSound(0, 0x742B0055);
+		break;
+	case 0x3002:
+		playSound(0, 0x470007EE);
+		stopAnimation();
+		setVisible(false);
+		SetMessageHandler(NULL);
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1303Balloon::stPopBalloon() {
+	startAnimation(0xAC004CD0, 0, -1);
+	SetMessageHandler(&AsScene1303Balloon::hmBalloonPopped);
+}
+
+AsScene1304Needle::AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y)
+	: AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) {
+
+	// NOTE: Skipped check if Klaymen already has the needle since that's done in the scene itself
+	SetMessageHandler(&AsScene1304Needle::handleMessage);
+}
+
+uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		sendMessage(_parentScene, 0x4826, 0);
+		messageResult = 1;
+		break;
+	case 0x4806:
+		setGlobalVar(V_HAS_NEEDLE, 1);
+		setVisible(false);
+		SetMessageHandler(NULL);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _asElevatorDoor(asElevatorDoor), _isUp(false), _isDown(true),
+	_countdown(0) {
+
+	_x = 320;
+	_y = 240;
+	createSurface1(0x043B0270, 100);
+	startAnimation(0x043B0270, 0, -1);
+	_newStickFrameIndex = 0;
+	loadSound(0, 0x1C100E83);
+	loadSound(1, 0x1C08CEC5);
+	loadSound(2, 0x5D011E87);
+	SetMessageHandler(&AsScene1306Elevator::handleMessage);
+}
+
+void AsScene1306Elevator::update() {
+	if (_isUp && _countdown != 0 && (--_countdown == 0))
+		stGoingDown();
+	AnimatedSprite::update();
+	if (_currFrameIndex == 7 && _asElevatorDoor->getVisible()) {
+		playSound(1);
+		_asElevatorDoor->setVisible(false);
+	}
+}
+
+void AsScene1306Elevator::upGoingDown() {
+	AnimatedSprite::update();
+	if (_currFrameIndex == 5)
+		_asElevatorDoor->setVisible(true);
+}
+
+uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2001:
+		if (_isUp)
+			_countdown = 144;
+		messageResult = _isUp ? 1 : 0;
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	case 0x4808:
+		if (_isDown)
+			stGoingUp();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1306Elevator::stGoingUp() {
+	setVisible(true);
+	_isDown = false;
+	startAnimation(0x043B0270, 0, -1);
+	playSound(0);
+	SetUpdateHandler(&AsScene1306Elevator::update);
+	NextState(&AsScene1306Elevator::cbGoingUpEvent);
+}
+
+void AsScene1306Elevator::cbGoingUpEvent() {
+	sendMessage(_parentScene, 0x4808, 0);
+	_isUp = true;
+	_countdown = 144;
+	stopAnimation();
+	setVisible(false);
+	SetUpdateHandler(&AsScene1306Elevator::update);
+}
+
+void AsScene1306Elevator::stGoingDown() {
+	_isUp = false;
+	setVisible(true);
+	startAnimation(0x043B0270, -1, -1);
+	_playBackwards = true;
+	playSound(1);
+	SetUpdateHandler(&AsScene1306Elevator::upGoingDown);
+	NextState(&AsScene1306Elevator::cbGoingDownEvent);
+}
+
+void AsScene1306Elevator::cbGoingDownEvent() {
+	_isDown = true;
+	sendMessage(_parentScene, 0x4809, 0);
+	stopAnimation();
+	SetUpdateHandler(&AsScene1306Elevator::update);
+}
+
+static const uint32 kAsScene1307KeyResourceList1[] = {
+	0x0438069C, 0x45B0023C, 0x05700217
+};
+
+static const uint32 kAsScene1307KeyResourceList2[] = {
+	0x04441334, 0x061433F0, 0x06019390
+};
+
+static const uint32 kAsScene1307KeyResourceList3[] = {
+	0x11A80030, 0x178812B1, 0x1488121C
+};
+
+static const uint32 *kAsScene1307KeyResourceLists[] = {
+	kAsScene1307KeyResourceList1,
+	kAsScene1307KeyResourceList2,
+	kAsScene1307KeyResourceList3
+};
+
+static const int kAsScene1307KeySurfacePriorities[] = {
+	700, 500, 300, 100
+};
+
+const uint kAsScene1307KeyPointsCount = 12;
+
+static const NPoint kAsScene1307KeyPoints[] = {
+	{-2,  0}, {-5,  0}, { 5,  0},
+	{12,  0}, {17,  0}, {25,  0},
+	{16, -2}, {10, -6}, { 0, -7},
+	{-7, -3}, {-3,  4}, { 2,  2}
+};
+
+const uint kAsScene1307KeyFrameIndicesCount = 20;
+
+static const int16 kAsScene1307KeyFrameIndices[] = {
+	 1,  4,  8, 11, 15, 16, 17, 17, 17, 16,
+	15, 14, 12, 10,  9,  7,  5,  3,  2,  1
+};
+
+const int kAsScene1307KeyDivValue = 200;
+const int16 kAsScene1307KeyXDelta = 70;
+const int16 kAsScene1307KeyYDelta = -12;
+
+AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _keyIndex(keyIndex), _clipRects(clipRects),
+	_isClickable(true) {
+
+	NPoint pt;
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex];
+
+	_dataResource.load(0x22102142);
+	_pointList = _dataResource.getPointArray(0xAC849240);
+	pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)];
+	_x = pt.x;
+	_y = pt.y;
+	createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4], 190, 148);
+	startAnimation(fileHashes[0], 0, -1);
+	loadSound(0, 0xDC4A1280);
+	loadSound(1, 0xCC021233);
+	loadSound(2, 0xC4C23844);
+	loadSound(3, 0xC4523208);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1307Key::handleMessage);
+}
+
+uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_isClickable) {
+			sendMessage(_parentScene, 0x4826, 0);
+			stRemoveKey();
+			messageResult = 1;
+		}
+		break;
+	case 0x2000:
+		_isClickable = param.asInteger() != 0;
+		break;
+	case 0x2001:
+		setSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex, param.asInteger());
+		stMoveKey();
+		break;
+	case 0x2003:
+		playSound(3);
+		stUnlock();
+		break;
+	case 0x2004:
+		playSound(2);
+		stInsert();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1307Key::suRemoveKey() {
+	if (_pointIndex < kAsScene1307KeyPointsCount) {
+		_x += kAsScene1307KeyPoints[_pointIndex].x;
+		_y += kAsScene1307KeyPoints[_pointIndex].y;
+		updateBounds();
+		_pointIndex++;
+	} else {
+		SetSpriteUpdate(NULL);
+	}
+}
+
+void AsScene1307Key::suInsertKey() {
+	if (_pointIndex < kAsScene1307KeyPointsCount) {
+		_x -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].x;
+		_y -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].y;
+		updateBounds();
+		_pointIndex++;
+		if (_pointIndex == 7)
+			playSound(0);
+	} else {
+		SetSpriteUpdate(NULL);
+		sendMessage(_parentScene, 0x2002, 0);
+	}
+}
+
+void AsScene1307Key::suMoveKey() {
+	if (_pointIndex < kAsScene1307KeyFrameIndicesCount) {
+		_frameIndex += kAsScene1307KeyFrameIndices[_pointIndex];
+		_x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue;
+		_y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue;
+		updateBounds();
+		_pointIndex++;
+	} else {
+		NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)];
+		_x = pt.x + kAsScene1307KeyXDelta;
+		_y = pt.y + kAsScene1307KeyYDelta;
+		stInsertKey();
+	}
+}
+
+void AsScene1307Key::stRemoveKey() {
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex];
+	_pointIndex = 0;
+	startAnimation(fileHashes[0], 0, -1);
+	playSound(1);
+	SetSpriteUpdate(&AsScene1307Key::suRemoveKey);
+}
+
+void AsScene1307Key::stInsertKey() {
+	_pointIndex = 0;
+	sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]);
+	setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]);
+	_newStickFrameIndex = STICK_LAST_FRAME;
+	SetSpriteUpdate(&AsScene1307Key::suInsertKey);
+}
+
+void AsScene1307Key::stMoveKey() {
+	NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)];
+	int16 newX = pt.x + kAsScene1307KeyXDelta;
+	int16 newY = pt.y + kAsScene1307KeyYDelta;
+	sendMessage(_parentScene, 0x1022, 1000);
+	setClipRect(0, 0, 640, 480);
+	_prevX = _x;
+	_prevY = _y;
+	if (newX == _x && newY == _y) {
+		stInsertKey();
+	} else {
+		const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex];
+		_pointIndex = 0;
+		_frameIndex = 0;
+		_deltaX = newX - _x;
+		_deltaY = newY - _y;
+		startAnimation(fileHashes[0], 0, -1);
+		SetSpriteUpdate(&AsScene1307Key::suMoveKey);
+	}
+}
+
+void AsScene1307Key::stUnlock() {
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex];
+	startAnimation(fileHashes[1], 0, -1);
+	_newStickFrameIndex = STICK_LAST_FRAME;
+}
+
+void AsScene1307Key::stInsert() {
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex];
+	startAnimation(fileHashes[2], 0, -1);
+	_newStickFrameIndex = STICK_LAST_FRAME;
+}
+
+AsScene1308JaggyDoor::AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _parentScene(parentScene) {
+
+	setVisible(false);
+	stopAnimation();
+	SetMessageHandler(&AsScene1308JaggyDoor::handleMessage);
+}
+
+uint32 AsScene1308JaggyDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	case 0x4808:
+		stOpenDoor();
+		break;
+	case 0x4809:
+		stCloseDoor();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1308JaggyDoor::stOpenDoor() {
+	startAnimation(0xBA0AE050, 0, -1);
+	setVisible(true);
+	playSound(0, calcHash("fxDoorOpen38"));
+	NextState(&AsScene1308JaggyDoor::stOpenDoorDone);
+}
+
+void AsScene1308JaggyDoor::stOpenDoorDone() {
+	sendMessage(_parentScene, 0x2000, 0);
+	stopAnimation();
+	setVisible(false);
+}
+
+void AsScene1308JaggyDoor::stCloseDoor() {
+	startAnimation(0xBA0AE050, -1, -1);
+	_playBackwards = true;
+	setVisible(true);
+	playSound(0, calcHash("fxDoorClose38"));
+	NextState(&AsScene1308JaggyDoor::stCloseDoorDone);
+}
+
+void AsScene1308JaggyDoor::stCloseDoorDone() {
+	sendMessage(_parentScene, 0x2001, 0);
+	stopAnimation();
+}
+
+AsScene1308KeyboardDoor::AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _parentScene(parentScene) {
+
+	playSound(0, 0x51456049);
+	SetMessageHandler(&AsScene1308KeyboardDoor::handleMessage);
+	NextState(&AsScene1308KeyboardDoor::stFallingKeys);
+}
+
+uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1308KeyboardDoor::stFallingKeys() {
+	startAnimation(0x6238B191, 0, -1);
+	_x = 580;
+	_y = 383;
+	NextState(&AsScene1308KeyboardDoor::stFallingKeysDone);
+}
+
+void AsScene1308KeyboardDoor::stFallingKeysDone() {
+	sendMessage(_parentScene, 0x2004, 0);
+	stopAnimation();
+	setVisible(false);
+}
+
+AsScene1308LightWallSymbols::AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) {
+
+	setVisible(false);
+	stopAnimation();
+	Entity::_priority = 1200;
+	SetMessageHandler(&AsScene1308LightWallSymbols::handleMessage);
+}
+
+uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2002:
+		stFadeIn();
+		break;
+	case 0x2003:
+		stFadeOut();
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1308LightWallSymbols::stFadeIn() {
+	startAnimation(0x80180A10, 0, -1);
+	setVisible(true);
+	_newStickFrameIndex = STICK_LAST_FRAME;
+}
+
+void AsScene1308LightWallSymbols::stFadeOut() {
+	startAnimation(0x80180A10, -1, -1);
+	_playBackwards = true;
+	NextState(&AsScene1308LightWallSymbols::stFadeOutDone);
+}
+
+void AsScene1308LightWallSymbols::stFadeOutDone() {
+	sendMessage(_parentScene, 0x2003, 0);
+	stopAnimation();
+	setVisible(false);
+}
+
+SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index)
+	: StaticSprite(vm, fileHash, 100) {
+
+	setVisible(false);
+	_x = _spriteResource.getPosition().x + index * 20;
+	updatePosition();
+}
+
+AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100) {
+
+	_x = 286;
+	_y = 429;
+	createSurface1(0xA282C472, 100);
+	startAnimation(0xA282C472, 0, -1);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1308Mouse::handleMessage);
+}
+
+uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x66382026)
+			playSound(0, 0x0CD84468);
+		else if (param.asInteger() == 0x6E28061C)
+			playSound(0, 0x78C8402C);
+		else if (param.asInteger() == 0x462F0410)
+			playSound(0, 0x60984E28);
+		break;
+	}
+	return messageResult;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/modules/module1300_sprites.h b/engines/neverhood/modules/module1300_sprites.h
new file mode 100644
index 0000000..3177555
--- /dev/null
+++ b/engines/neverhood/modules/module1300_sprites.h
@@ -0,0 +1,162 @@
+/* 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_MODULE1300_SPRITES_H
+#define NEVERHOOD_MODULES_MODULE1300_SPRITES_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+#include "neverhood/smackerplayer.h"
+
+namespace Neverhood {
+
+class AsScene1302Bridge : public AnimatedSprite {
+public:
+	AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stLowerBridge();
+	void stRaiseBridge();
+	void cbLowerBridgeEvent();
+};
+
+class SsScene1302Fence : public StaticSprite {
+public:
+	SsScene1302Fence(NeverhoodEngine *vm);
+protected:
+	int16 _firstY;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void suMoveDown();
+	void suMoveUp();
+};
+
+class AsScene1303Balloon : public AnimatedSprite {
+public:
+	AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmBalloonPopped(int messageNum, const MessageParam &param, Entity *sender);
+	void stPopBalloon();
+};
+
+class AsScene1304Needle : public AnimatedSprite {
+public:
+	AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene1306Elevator : public AnimatedSprite {
+public:
+	AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor);
+protected:
+	Scene *_parentScene;
+	AnimatedSprite *_asElevatorDoor;
+	bool _isUp;
+	bool _isDown;
+	int _countdown;
+	void update();
+	void upGoingDown();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stGoingUp();
+	void cbGoingUpEvent();
+	void stGoingDown();
+	void cbGoingDownEvent();
+};
+
+class AsScene1307Key : public AnimatedSprite {
+public:
+	AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects);
+protected:
+	Scene *_parentScene;
+	NPointArray *_pointList;
+	uint _pointIndex;
+	int _frameIndex;
+	uint _keyIndex;
+	NRect *_clipRects;
+	bool _isClickable;
+	int16 _prevX, _prevY;
+	int16 _deltaX, _deltaY;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void suRemoveKey();
+	void suInsertKey();
+	void suMoveKey();
+	void stRemoveKey();
+	void stInsertKey();
+	void stMoveKey();
+	void stUnlock();
+	void stInsert();
+};
+
+class AsScene1308JaggyDoor : public AnimatedSprite {
+public:
+	AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stOpenDoor();
+	void stOpenDoorDone();
+	void stCloseDoor();
+	void stCloseDoorDone();
+};
+
+class AsScene1308KeyboardDoor : public AnimatedSprite {
+public:
+	AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stFallingKeys();
+	void stFallingKeysDone();
+};
+
+class AsScene1308LightWallSymbols : public AnimatedSprite {
+public:
+	AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stFadeIn();
+	void stFadeOut();
+	void stFadeOutDone();
+};
+
+class SsScene1308Number : public StaticSprite {
+public:
+	SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index);
+};
+
+class AsScene1308Mouse : public AnimatedSprite {
+public:
+	AsScene1308Mouse(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULES_MODULE1300_SPRITES_H */
diff --git a/engines/neverhood/modules/module1400.cpp b/engines/neverhood/modules/module1400.cpp
index 7244d3c..655aa15 100644
--- a/engines/neverhood/modules/module1400.cpp
+++ b/engines/neverhood/modules/module1400.cpp
@@ -20,12 +20,14 @@
  *
  */
 
-#include "neverhood/modules/module1400.h"
+#include "neverhood/diskplayerscene.h"
+#include "neverhood/gamemodule.h"
 #include "neverhood/modules/module1000.h"
+#include "neverhood/modules/module1200.h"
+#include "neverhood/modules/module1400.h"
+#include "neverhood/modules/module1400_sprites.h"
 #include "neverhood/modules/module2100_sprites.h"
 #include "neverhood/modules/module2200_sprites.h"
-#include "neverhood/diskplayerscene.h"
-#include "neverhood/gamemodule.h"
 
 namespace Neverhood {
 
@@ -135,497 +137,6 @@ void Module1400::updateScene() {
 	}
 }
 
-// Scene1401
-
-AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1100), _countdown1(0), _countdown2(0) {
-
-	createSurface(900, 152, 147);
-	_x = 454;
-	_y = 217;
-	startAnimation(0x4C210500, 0, -1);
-	SetUpdateHandler(&AsScene1401Pipe::update);
-	SetMessageHandler(&AsScene1401Pipe::handleMessage);
-}
-
-AsScene1401Pipe::~AsScene1401Pipe() {
-	_vm->_soundMan->deleteSoundGroup(0x01104C08);
-}
-
-void AsScene1401Pipe::update() {
-	AnimatedSprite::update();
-	if (_countdown1 != 0 && (--_countdown1 == 0))
-		stDoneSucking();
-	if (_countdown2 != 0 && (--_countdown2 == 0)) {
-		_vm->_soundMan->addSound(0x01104C08, 0x4A116437);
-		_vm->_soundMan->playSoundLooping(0x4A116437);
-	}
-}
-
-void AsScene1401Pipe::upSuckInProjector() {
-	AnimatedSprite::update();
-	if (_countdown1 != 0)
-		_countdown1--;
-}
-
-uint32 AsScene1401Pipe::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x0A8A1490)
-			playSound(1, 0x6AB6666F);
-		break;
-	case 0x2000:
-		_countdown1 = 70;
-		_countdown2 = 8;
-		stStartSucking();
-		break;
-	case 0x483A:
-		stSuckInProjector();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1401Pipe::hmSuckInProjector(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		if (_countdown1 != 0)
-			stStartSucking();
-		else
-			stDoneSucking();
-		SetMessageHandler(&AsScene1401Pipe::handleMessage);
-		SetUpdateHandler(&AsScene1401Pipe::update);
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1401Pipe::stStartSucking() {
-	startAnimation(0x4C240100, 0, -1);
-	playSound(0, 0x4A30063F);
-}
-
-void AsScene1401Pipe::stDoneSucking() {
-	_vm->_soundMan->deleteSound(0x4A116437);
-	playSound(0, 0x4A120435);
-	startAnimation(0x4C210500, 0, -1);
-}
-
-void AsScene1401Pipe::stSuckInProjector() {
-	startAnimation(0x6C210810, 0, -1);
-	SetUpdateHandler(&AsScene1401Pipe::upSuckInProjector);
-	SetMessageHandler(&AsScene1401Pipe::hmSuckInProjector);
-}
-
-AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1100) {
-
-	createSurface(100, 71, 41);
-	_x = 478;
-	_y = 433;
-	startAnimation(0xA282C472, 0, -1);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1401Mouse::handleMessage);
-}
-
-uint32 AsScene1401Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x66382026)
-			playSound(0, 0x0CD84468);
-		else if (param.asInteger() == 0x6E28061C)
-			playSound(0, 0x78C8402C);
-		else if (param.asInteger() == 0x462F0410)
-			playSound(0, 0x60984E28);
-		break;
-	case 0x4839:
-		stSuckedIn();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1401Mouse::suSuckedIn() {
-	AnimatedSprite::updateDeltaXY();
-	if (_collisionBounds.y1 <= 150) {
-		playSound(0, 0x0E32247F);
-		stopAnimation();
-		setVisible(false);
-		SetMessageHandler(NULL);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-void AsScene1401Mouse::stSuckedIn() {
-	startAnimation(0x34880040, 0, -1);
-	SetSpriteUpdate(&AsScene1401Mouse::suSuckedIn);
-}
-
-AsScene1401Cheese::AsScene1401Cheese(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1100) {
-
-	createSurface(200, 152, 147);
-	_x = 427;
-	_y = 433;
-	startAnimation(0x461A1490, 0, -1);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1401Cheese::handleMessage);
-}
-
-uint32 AsScene1401Cheese::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x4839:
-		stSuckedIn();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1401Cheese::suSuckedIn() {
-	AnimatedSprite::updateDeltaXY();
-	if (_collisionBounds.y1 <= 150) {
-		playSound(0, 0x18020439);
-		stopAnimation();
-		setVisible(false);
-		SetMessageHandler(NULL);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-void AsScene1401Cheese::stSuckedIn() {
-	startAnimation(0x103B8020, 0, -1);
-	SetSpriteUpdate(&AsScene1401Cheese::suSuckedIn);
-}
-
-AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen)
-	: AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown(0), _isOpen(isOpen) {
-
-	_x = 320;
-	_y = 240;
-	createSurface1(0x04551900, 100);
-	if (isOpen) {
-		startAnimation(0x04551900, -1, -1);
-		_countdown = 48;
-	} else {
-		stopAnimation();
-		setVisible(false);
-	}
-	_newStickFrameIndex = STICK_LAST_FRAME;
-	SetUpdateHandler(&AsScene1401BackDoor::update);
-	SetMessageHandler(&AsScene1401BackDoor::handleMessage);
-}
-
-void AsScene1401BackDoor::update() {
-	if (_countdown != 0 && (--_countdown == 0))
-		stCloseDoor();
-	AnimatedSprite::update();
-}
-
-
-uint32 AsScene1401BackDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2001:
-		if (_isOpen)
-			_countdown = 168;
-		messageResult = _isOpen ? 1 : 0;
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	case 0x4808:
-		_countdown = 168;
-		if (!_isOpen)
-			stOpenDoor();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1401BackDoor::stOpenDoor() {
-	_isOpen = true;
-	setVisible(true);
-	startAnimation(0x04551900, 0, -1);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-	playSound(0, calcHash("fxDoorOpen24"));
-}
-
-void AsScene1401BackDoor::stCloseDoor() {
-	_isOpen = false;
-	setVisible(true);
-	startAnimation(0x04551900, -1, -1);
-	playSound(0, calcHash("fxDoorClose24"));
-	_playBackwards = true;
-	NextState(&AsScene1401BackDoor::stCloseDoorDone);
-}
-
-void AsScene1401BackDoor::stCloseDoorDone() {
-	stopAnimation();
-	setVisible(false);
-}
-
-static const AsCommonProjectorItem kAsCommonProjectorItems[] = {
-	{{154, 453}, 4,  2,  0, 0, 1},
-	{{104, 391}, 4, -1, -1, 1, 1},
-	{{ 22, 447}, 6, -1, -1, 1, 1},
-	{{112, 406}, 2, -1, -1, 1, 0},
-	{{262, 433}, 1,  1,  0, 0, 0}
-};
-
-AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, Sprite *asPipe)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klaymen(klaymen), _asPipe(asPipe) {
-
-	_asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)];
-	createSurface(990, 101, 182);
-	startAnimation(0x10E3042B, 0, -1);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsCommonProjector::handleMessage);
-	_x = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x;
-	_lockedInSlot = true;
-	moveProjector();
-	setDoDeltaX(1);
-	if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex)
-		stStayLockedInSlot();
-	loadSound(2, 0xC8C2507C);
-}
-
-AsCommonProjector::~AsCommonProjector() {
-	_vm->_soundMan->deleteSoundGroup(0x05331081);
-}
-
-uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		sendMessage(_parentScene, 0x4826, 0);
-		messageResult = 1;
-		break;
-	case 0x4807:
-		setGlobalVar(V_PROJECTOR_SLOT, (_x - _asProjectorItem->point.x) / 108);
-		if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex)
-			stStartLockedInSlot();
-		else
-			stIdle();
-		break;
-	case 0x480B:
-		if (param.asInteger() != 1) {
-			if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount)
-				incGlobalVar(V_PROJECTOR_SLOT, 1);
-		} else if (getGlobalVar(V_PROJECTOR_SLOT) > 0)
-			incGlobalVar(V_PROJECTOR_SLOT, -1);
-		stMoving();
-		break;
-	case 0x480C:
-		// Check if the projector can be moved
-		if (param.asInteger() != 1)
-			messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0;
-		else
-			messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0;
-		break;
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 990);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1010);
-		break;
-	case 0x4839:
-		stStartSuckedIn();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		if (param.asPoint().x - _x >= 17 && param.asPoint().x - _x <= 56 &&
-			param.asPoint().y - _y >= -120 && param.asPoint().y - _y <= -82) {
-			sendMessage(_parentScene, 0x4826, 1);
-		} else
-			sendMessage(_parentScene, 0x4826, 0);
-		messageResult = 1;
-		break;
-	case 0x4807:
-		sendMessage(_parentScene, 0x4807, 0);
-		stStopProjecting();
-		break;
-	case 0x480B:
-		if (param.asInteger() != 1) {
-			if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount)
-				incGlobalVar(V_PROJECTOR_SLOT, 1);
-		} else if (getGlobalVar(V_PROJECTOR_SLOT) > 0)
-			incGlobalVar(V_PROJECTOR_SLOT, -1);
-		stTurnToFront();
-		break;
-	case 0x480C:
-		// Check if the projector can be moved
-		if (param.asInteger() != 1)
-			messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0;
-		else
-			messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0;
-		break;
-	case 0x480F:
-		stStartProjecting();
-		break;
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 990);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1010);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsCommonProjector::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-void AsCommonProjector::suMoving() {
-	if (_x <= _klaymen->getX())
-		_x = _klaymen->getX() - 100;
-	else
-		_x = _klaymen->getX() + 100;
-	moveProjector();
-	if (_beforeMoveX == _x) {
-		if (getGlobalVar(V_PROJECTOR_SLOT) == 0 && _asProjectorItem->leftBorderLeaves != 0) {
-			sendMessage(_parentScene, 0x1019, 0);
-			incGlobalVar(V_PROJECTOR_LOCATION, -1);
-			setGlobalVar(V_PROJECTOR_SLOT, kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)].maxSlotCount);
-		} else if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->maxSlotCount && _asProjectorItem->rightBorderLeaves != 0) {
-			sendMessage(_parentScene, 0x1019, 1);
-			incGlobalVar(V_PROJECTOR_LOCATION, +1);
-			setGlobalVar(V_PROJECTOR_SLOT, 0);
-		}
-	}
-	Sprite::updateBounds();
-}
-
-void AsCommonProjector::moveProjector() {
-
-	bool nowLockedInSlot = false;
-
-	_y = _asProjectorItem->point.y;
-
-	if (_asProjectorItem->index1 != -1) {
-		int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x;
-		if (elX - 20 < _x && elX + 20 > _x) {
-			nowLockedInSlot = true;
-			_y = _asProjectorItem->point.y + 10;
-		}
-	}
-
-	if (_asProjectorItem->lockSlotIndex != -1) {
-		int16 elX = _asProjectorItem->lockSlotIndex * 108 + _asProjectorItem->point.x;
-		if (elX - 20 < _x && elX + 20 > _x) {
-			nowLockedInSlot = true;
-			_y = _asProjectorItem->point.y + 10;
-		}
-	}
-
-	if (_lockedInSlot && !nowLockedInSlot)
-		_lockedInSlot = false;
-	else if (!_lockedInSlot && nowLockedInSlot) {
-		playSound(1, 0x5440E474);
-		_lockedInSlot = true;
-	}
-
-}
-
-void AsCommonProjector::stSuckedIn() {
-	AnimatedSprite::updateDeltaXY();
-	if (_collisionBounds.y1 <= 150) {
-		sendMessage(_asPipe, 0x483A, 0);
-		stopAnimation();
-		setVisible(false);
-		SetMessageHandler(&Sprite::handleMessage);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-void AsCommonProjector::stIdle() {
-	startAnimation(0x10E3042B, 0, -1);
-	SetMessageHandler(&AsCommonProjector::handleMessage);
-	SetSpriteUpdate(NULL);
-}
-
-void AsCommonProjector::stMoving() {
-	_beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x;
-	startAnimation(0x14A10137, 0, -1);
-	playSound(1, 0xEC008474);
-	SetMessageHandler(&AsCommonProjector::handleMessage);
-	SetSpriteUpdate(&AsCommonProjector::suMoving);
-}
-
-void AsCommonProjector::stStartLockedInSlot() {
-	startAnimation(0x80C32213, 0, -1);
-	SetMessageHandler(&AsCommonProjector::hmAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&AsCommonProjector::stStayLockedInSlot);
-}
-
-void AsCommonProjector::stStayLockedInSlot() {
-	startAnimation(0xD23B207F, 0, -1);
-	SetMessageHandler(&AsCommonProjector::hmLockedInSlot);
-	SetSpriteUpdate(NULL);
-}
-
-void AsCommonProjector::stStartProjecting() {
-	startAnimation(0x50A80517, 0, -1);
-	setGlobalVar(V_PROJECTOR_ACTIVE, 1);
-	playSound(0, 0xCC4A8456);
-	_vm->_soundMan->addSound(0x05331081, 0xCE428854);
-	_vm->_soundMan->playSoundLooping(0xCE428854);
-	SetMessageHandler(&AsCommonProjector::hmAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&AsCommonProjector::stLockedInSlot);
-}
-
-void AsCommonProjector::stLockedInSlot() {
-	sendMessage(_parentScene, 0x480F, 0);
-	startAnimation(0xD833207F, 0, -1);
-	SetMessageHandler(&AsCommonProjector::hmLockedInSlot);
-	SetSpriteUpdate(NULL);
-}
-
-void AsCommonProjector::stStopProjecting() {
-	startAnimation(0x50A94417, 0, -1);
-	setGlobalVar(V_PROJECTOR_ACTIVE, 0);
-	playSound(0, 0xCC4A8456);
-	_vm->_soundMan->deleteSound(0xCE428854);
-	SetMessageHandler(&AsCommonProjector::hmAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&AsCommonProjector::stStayLockedInSlot);
-}
-
-void AsCommonProjector::stTurnToFront() {
-	_beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x;
-	startAnimation(0x22CB4A33, 0, -1);
-	SetMessageHandler(&AsCommonProjector::hmAnimation);
-	SetSpriteUpdate(&AsCommonProjector::suMoving);
-	NextState(&AsCommonProjector::stMoving);
-}
-
-void AsCommonProjector::stStartSuckedIn() {
-	setGlobalVar(V_PROJECTOR_LOCATION, 4);
-	setGlobalVar(V_PROJECTOR_SLOT, 0);
-	startAnimation(0x708D4712, 0, -1);
-	playSound(2);
-	SetMessageHandler(&Sprite::handleMessage);
-	SetSpriteUpdate(&AsCommonProjector::stSuckedIn);
-}
-
 Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _projectorBorderFlag(false), _ssFloorButton(NULL), _asProjector(NULL),
 	_asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL),
@@ -768,77 +279,6 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-// Scene1402
-
-SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority)
-	: StaticSprite(vm, fileHash, surfacePriority) {
-
-	SetFilterY(&Sprite::defFilterY);
-	SetUpdateHandler(&StaticSprite::updatePosition);
-}
-
-AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
-
-	createSurface(900, 347, 230);
-
-	SetFilterY(&Sprite::defFilterY);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1402PuzzleBox::handleMessage);
-	_x = 279;
-	_y = 270;
-	if (status == 2) {
-		// Puzzle box after the puzzle was solved
-		startAnimation(0x20060259, 0, -1);
-		playSound(0, 0x419014AC);
-		loadSound(1, 0x61901C29);
-		NextState(&AsScene1402PuzzleBox::stMoveDownSolvedDone);
-	} else if (status == 1) {
-		// Puzzle box appears
-		startAnimation(0x210A0213, 0, -1);
-		playSound(0, 0x41809C6C);
-		NextState(&AsScene1402PuzzleBox::stMoveUpDone);
-	} else {
-		// Puzzle box is here
-		startAnimation(0x20060259, -1, -1);
-		loadSound(1, 0x61901C29);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-	}
-}
-
-uint32 AsScene1402PuzzleBox::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2002:
-		playSound(1);
-		startAnimation(0x20060259, -1, -1);
-		_playBackwards = true;
-		NextState(&AsScene1402PuzzleBox::stMoveDownDone);
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1402PuzzleBox::stMoveUpDone() {
-	sendMessage(_parentScene, 0x2000, 0);
-	stopAnimation();
-	setVisible(false);
-}
-
-void AsScene1402PuzzleBox::stMoveDownDone() {
-	sendMessage(_parentScene, 0x2001, 0);
-	stopAnimation();
-	setVisible(false);
-}
-
-void AsScene1402PuzzleBox::stMoveDownSolvedDone() {
-	sendMessage(_parentScene, 0x2003, 0);
-	stopAnimation();
-}
-
 Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _isShaking(false), _asPuzzleBox(NULL), _asProjector(NULL) {
 
@@ -988,237 +428,6 @@ void Scene1402::stopShaking() {
 	_isShaking = false;
 }
 
-// Scene1407
-
-static const int16 kScene1407MouseFloorY[] = {
-	106, 150, 191, 230, 267, 308, 350, 395
-};
-
-static const struct {
-	int16 x;
-	int16 floorIndex;
-	int16 sectionIndex;
-	int16 nextHoleIndex;
-} kScene1407MouseHoles[] = {
-	{125, 0,  0,  7},
-	{452, 7, 21,  0},
-	{337, 4, 11,  4},
-	{286, 6, 17,  6},
-	{348, 6, 17, 39},
-	{536, 6, 18, 42},
-	{111, 1,  3, 18},
-	{203, 1,  3, 38},
-	{270, 1,  3,  9},
-	{197, 5, 14,  3},
-	{252, 5, 14, 35},
-	{297, 5, 14,  7},
-	{359, 5, 14,  8},
-	{422, 4, 12, 26},
-	{467, 4, 12,  2},
-	{539, 4, 12, 40},
-	{111, 5, 13, 17},
-	{211, 0,  1, 20},
-	{258, 0,  1, 11},
-	{322, 0,  1, 16},
-	{ 99, 6, 16, 31},
-	{142, 6, 16, 27},
-	{194, 6, 16, 12},
-	{205, 2,  6, 45},
-	{264, 2,  6, 10},
-	{ 98, 4, 10,  2},
-	{152, 4, 10, 37},
-	{199, 4, 10, 13},
-	{258, 4, 10, 16},
-	{100, 7, 19, 43},
-	{168, 7, 19, 23},
-	{123, 3,  8, 14},
-	{181, 3,  8, 39},
-	{230, 3,  8, 28},
-	{292, 3,  8, 22},
-	{358, 3,  8, 36},
-	{505, 3,  9, 44},
-	{400, 2,  7, 34},
-	{454, 2,  7, 32},
-	{532, 2,  7, 46},
-	{484, 5, 15, 25},
-	{529, 5, 15, 30},
-	{251, 7, 20, 48},
-	{303, 7, 20, 21},
-	{360, 7, 20, 33},
-	{503, 0,  2,  5},
-	{459, 1,  4, 19},
-	{530, 1,  4, 42},
-	{111, 2,  5, 47},
-	{442, 6, 18,  1}
-};
-
-static const struct {
-	int16 x1, x2;
-	int16 goodHoleIndex;
-} kScene1407MouseSections[] = {
-	{100, 149,  0},
-	{182, 351, 17},
-	{430, 524, 45},
-	{ 89, 293,  7},
-	{407, 555, 47},
-	{ 89, 132, 48},
-	{178, 303, 23},
-	{367, 551, 38},
-	{105, 398, 31},
-	{480, 537, 36},
-	{ 84, 275, 27},
-	{318, 359,  2},
-	{402, 560, 15},
-	{ 91, 132, 16},
-	{179, 400, 10},
-	{461, 552, 41},
-	{ 86, 218, 21},
-	{267, 376,  4},
-	{420, 560, 49},
-	{ 77, 188, 30},
-	{237, 394, 44},
-	{438, 515,  5}
-};
-
-AsScene1407Mouse::AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _currSectionIndex(0) {
-
-	createSurface(100, 117, 45);
-	_x = 108;
-	_y = 106;
-	stIdleLookAtGoodHole();
-	SetUpdateHandler(&AnimatedSprite::update);
-}
-
-void AsScene1407Mouse::suWalkTo() {
-	int16 xdelta = _walkDestX - _x;
-	if (xdelta > _deltaX)
-		xdelta = _deltaX;
-	else if (xdelta < -_deltaX)
-		xdelta = -_deltaX;
-	_deltaX = 0;
-	if (_walkDestX == _x)
-		sendMessage(this, 0x1019, 0);
-	else {
-		_x += xdelta;
-		updateBounds();
-	}
-}
-
-void AsScene1407Mouse::upGoThroughHole() {
-	if (_countdown != 0 && (--_countdown == 0)) {
-		SetUpdateHandler(&AnimatedSprite::update);
-		gotoNextState();
-	}
-	AnimatedSprite::update();
-}
-
-uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		{
-			int16 mouseX = param.asPoint().x;
-			int16 mouseY = param.asPoint().y;
-			int holeIndex;
-			for (holeIndex = 0; holeIndex < 50; holeIndex++) {
-				int16 holeX = kScene1407MouseHoles[holeIndex].x;
-				int16 holeY = kScene1407MouseFloorY[kScene1407MouseHoles[holeIndex].floorIndex];
-				if (mouseX >= holeX - 14 && mouseX <= holeX + 14 && mouseY >= holeY - 36 && mouseY <= holeY)
-					break;
-			}
-			if (holeIndex < 50 && kScene1407MouseHoles[holeIndex].sectionIndex == _currSectionIndex) {
-				_nextHoleIndex = kScene1407MouseHoles[holeIndex].nextHoleIndex;
-				_walkDestX = kScene1407MouseHoles[holeIndex].x;
-				stWalkToHole();
-			} else {
-				if (mouseX < kScene1407MouseSections[_currSectionIndex].x1)
-					_walkDestX = kScene1407MouseSections[_currSectionIndex].x1;
-				else if (mouseX > kScene1407MouseSections[_currSectionIndex].x2)
-					_walkDestX = kScene1407MouseSections[_currSectionIndex].x2;
-				else
-					_walkDestX = mouseX;
-				stWalkToDest();
-			}
-		}
-		break;
-	case 0x1019:
-		gotoNextState();
-		break;
-	case 0x2001:
-		{
-			// Reset the position
-			// Find the nearest hole and go through it, and exit at the first hole
-			int16 distance = 640;
-			int matchIndex = 50;
-			for (int index = 0; index < 50; index++)
-				if (kScene1407MouseHoles[index].sectionIndex == _currSectionIndex &&
-					ABS(kScene1407MouseHoles[index].x - _x) < distance) {
-					matchIndex = index;
-					distance = ABS(kScene1407MouseHoles[index].x - _x);
-				}
-			if (matchIndex < 50) {
-				_nextHoleIndex = 0;
-				_walkDestX = kScene1407MouseHoles[matchIndex].x;
-				stWalkToHole();
-			}
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1407Mouse::stIdleLookAtGoodHole() {
-	setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0);
-	startAnimation(0x72215194, 0, -1);
-	SetMessageHandler(&AsScene1407Mouse::handleMessage);
-	SetSpriteUpdate(NULL);
-}
-
-void AsScene1407Mouse::stWalkToDest() {
-	if (_walkDestX != _x) {
-		setDoDeltaX(_walkDestX < _x ? 1 : 0);
-		startAnimation(0x22291510, 0, -1);
-		SetMessageHandler(&AsScene1407Mouse::handleMessage);
-		SetSpriteUpdate(&AsScene1407Mouse::suWalkTo);
-		NextState(&AsScene1407Mouse::stIdleLookAtGoodHole);
-	}
-}
-
-void AsScene1407Mouse::stWalkToHole() {
-	setDoDeltaX(_walkDestX < _x ? 1 : 0);
-	startAnimation(0x22291510, 0, -1);
-	SetMessageHandler(&AsScene1407Mouse::handleMessage);
-	SetSpriteUpdate(&AsScene1407Mouse::suWalkTo);
-	NextState(&AsScene1407Mouse::stGoThroughHole);
-}
-
-void AsScene1407Mouse::stGoThroughHole() {
-	startAnimation(0x72215194, 0, -1);
-	setVisible(false);
-	_countdown = 12;
-	SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole);
-	SetMessageHandler(NULL);
-	SetSpriteUpdate(NULL);
-	NextState(&AsScene1407Mouse::stArriveAtHole);
-}
-
-void AsScene1407Mouse::stArriveAtHole() {
-	_currSectionIndex = kScene1407MouseHoles[_nextHoleIndex].sectionIndex;
-	_x = kScene1407MouseHoles[_nextHoleIndex].x;
-	_y = kScene1407MouseFloorY[kScene1407MouseHoles[_nextHoleIndex].floorIndex];
-	if (_nextHoleIndex == 1) {
-		sendMessage(_parentScene, 0x2000, 0);
-		_walkDestX = 512;
-		stWalkToDest();
-		setVisible(true);
-	} else {
-		_walkDestX = _x + 14;
-		stWalkToDest();
-		setVisible(true);
-	}
-}
-
 Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule), _puzzleSolvedCountdown(0),	_resetButtonCountdown(0) {
 
@@ -1275,8 +484,6 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-// Scene1403
-
 Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _asProjector(NULL), _isProjecting(false) {
 
@@ -1379,8 +586,6 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-// Scene1404
-
 Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _asProjector(NULL), _asKey(NULL) {
 
@@ -1480,77 +685,6 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-// Scene1405
-
-static const NPoint kAsScene1405TileItemPositions[] = {
-	{100,  80}, {162,  78}, {222,  76}, {292,  76},
-	{356,  82}, {422,  84}, {488,  86}, {550,  90},
-	{102, 134}, {164, 132}, {224, 136},	{294, 136},
-	{360, 136},	{422, 138},	{484, 144},	{548, 146},
-	{ 98, 196},	{160, 200},	{228, 200},	{294, 202},
-	{360, 198},	{424, 200},	{482, 202},	{548, 206},
-	{ 98, 260},	{160, 264},	{226, 260},	{296, 262},
-	{358, 260},	{424, 262},	{486, 264},	{550, 266},
-	{ 94, 322},	{160, 316},	{226, 316},	{296, 320},
-	{358, 322},	{422, 324},	{488, 322},	{550, 322},
-	{ 98, 380},	{160, 376},	{226, 376},	{294, 378},
-	{356, 380},	{420, 380},	{490, 378},	{552, 376}
-};
-
-AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _tileIndex(tileIndex), _countdown(0), _isShowing(false) {
-
-	loadSound(0, 0x05308101);
-	setSoundPan(0, (tileIndex % 8 * 4 + 4) * 25 / 8);
-	_x = kAsScene1405TileItemPositions[_tileIndex].x;
-	_y = kAsScene1405TileItemPositions[_tileIndex].y;
-	createSurface1(0x844B805C, 1100);
-	setVisible(false);
-	if (getSubVar(VA_IS_TILE_MATCH, _tileIndex))
-		_countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1;
-	startAnimation(0x844B805C, getSubVar(VA_TILE_SYMBOLS, _tileIndex), -1);
-	_newStickFrameIndex = (int16)getSubVar(VA_TILE_SYMBOLS, _tileIndex);
-	SetUpdateHandler(&AsScene1405Tile::update);
-	SetMessageHandler(&AsScene1405Tile::handleMessage);
-}
-
-void AsScene1405Tile::update() {
-	updateAnim();
-	updatePosition();
-	if (_countdown != 0 && (--_countdown == 0))
-		show();
-}
-
-uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		if (getSubVar(VA_IS_TILE_MATCH, _tileIndex) == 0 && _parentScene->getCountdown() == 0) {
-			show();
-			sendMessage(_parentScene, 0x2000, _tileIndex);
-		}
-		messageResult = 1;
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1405Tile::show() {
-	if (!_isShowing) {
-		_isShowing = true;
-		playSound(0);
-		setVisible(true);
-	}
-}
-
-void AsScene1405Tile::hide() {
-	if (_isShowing) {
-		_isShowing = false;
-		playSound(0);
-		setVisible(false);
-	}
-}
-
 Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule), _selectFirstTile(true), _tilesLeft(48), _countdown(0) {
 
diff --git a/engines/neverhood/modules/module1400.h b/engines/neverhood/modules/module1400.h
index 9a592c2..53ad712 100644
--- a/engines/neverhood/modules/module1400.h
+++ b/engines/neverhood/modules/module1400.h
@@ -26,7 +26,6 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
-#include "neverhood/modules/module1200.h"
 
 namespace Neverhood {
 
@@ -40,92 +39,9 @@ protected:
 	void updateScene();
 };
 
-// Scene1401
-
-class AsScene1401Pipe : public AnimatedSprite {
-public:
-	AsScene1401Pipe(NeverhoodEngine *vm);
-	virtual ~AsScene1401Pipe();
-protected:
-	int _countdown1;
-	int _countdown2;
-	void update();
-	void upSuckInProjector();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmSuckInProjector(int messageNum, const MessageParam &param, Entity *sender);
-	void stStartSucking();
-	void stDoneSucking();
-	void stSuckInProjector();
-};
-
-class AsScene1401Mouse : public AnimatedSprite {
-public:
-	AsScene1401Mouse(NeverhoodEngine *vm);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void suSuckedIn();
-	void stSuckedIn();
-};
-
-class AsScene1401Cheese : public AnimatedSprite {
-public:
-	AsScene1401Cheese(NeverhoodEngine *vm);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void suSuckedIn();
-	void stSuckedIn();
-};
-
-class AsScene1401BackDoor : public AnimatedSprite {
-public:
-	AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen);
-protected:
-	Sprite *_klaymen;
-	int _countdown;
-	bool _isOpen;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stOpenDoor();
-	void stCloseDoor();
-	void stCloseDoorDone();
-};
-
-struct AsCommonProjectorItem {
-	NPoint point;
-	int8 maxSlotCount;
-	int8 lockSlotIndex;
-	int8 index1;
-	int8 leftBorderLeaves;
-	int8 rightBorderLeaves;
-};
-
-class AsCommonProjector : public AnimatedSprite {
-public:
-	AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, Sprite *asPipe);
-	virtual ~AsCommonProjector();
-protected:
-	Scene *_parentScene;
-	Sprite *_klaymen;
-	Sprite *_asPipe;
-	const AsCommonProjectorItem *_asProjectorItem;
-	int16 _beforeMoveX;
-	bool _lockedInSlot;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmLockedInSlot(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmAnimation(int messageNum, const MessageParam &param, Entity *sender);
-	void suMoving();
-	void moveProjector();
-	void stSuckedIn();
-	void stIdle();
-	void stMoving();
-	void stStartLockedInSlot();
-	void stStayLockedInSlot();
-	void stStartProjecting();
-	void stLockedInSlot();
-	void stStopProjecting();
-	void stTurnToFront();
-	void stStartSuckedIn();
-};
+class AsCommonProjector;
+class AsScene1201Tape;
+class AsScene1405Tile;
 
 class Scene1401 : public Scene {
 public:
@@ -146,24 +62,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-// Scene1402
-
-class SsScene1402BridgePart : public StaticSprite {
-public:
-	SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority);
-};
-
-class AsScene1402PuzzleBox : public AnimatedSprite {
-public:
-	AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stMoveUpDone();
-	void stMoveDownDone();
-	void stMoveDownSolvedDone();
-};
-
 class Scene1402 : public Scene {
 public:
 	Scene1402(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -180,27 +78,6 @@ protected:
 	void stopShaking();
 };
 
-// Scene1407
-
-class AsScene1407Mouse : public AnimatedSprite {
-public:
-	AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	int16 _walkDestX;
-	int16 _currSectionIndex;
-	int16 _nextHoleIndex;
-	int _countdown;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void suWalkTo();
-	void upGoThroughHole();
-	void stIdleLookAtGoodHole();
-	void stWalkToDest();
-	void stWalkToHole();
-	void stGoThroughHole();
-	void stArriveAtHole();
-};
-
 class Scene1407 : public Scene {
 public:
 	Scene1407(NeverhoodEngine *vm, Module *parentModule);
@@ -213,8 +90,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-// Scene1403
-
 class Scene1403 : public Scene {
 public:
 	Scene1403(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -229,8 +104,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-// Scene1404
-
 class Scene1404 : public Scene {
 public:
 	Scene1404(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -243,24 +116,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-// Scene1405
-
-class Scene1405;
-
-class AsScene1405Tile : public AnimatedSprite {
-public:
-	AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex);
-	void show();
-	void hide();
-protected:
-	Scene1405 *_parentScene;
-	bool _isShowing;
-	uint32 _tileIndex;
-	int _countdown;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
 class Scene1405 : public Scene {
 public:
 	Scene1405(NeverhoodEngine *vm, Module *parentModule);
diff --git a/engines/neverhood/modules/module1400_sprites.cpp b/engines/neverhood/modules/module1400_sprites.cpp
new file mode 100644
index 0000000..aba9bc8
--- /dev/null
+++ b/engines/neverhood/modules/module1400_sprites.cpp
@@ -0,0 +1,885 @@
+/* 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/module1400_sprites.h"
+#include "neverhood/modules/module1400.h"
+#include "neverhood/gamemodule.h"
+
+namespace Neverhood {
+
+AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100), _countdown1(0), _countdown2(0) {
+
+	createSurface(900, 152, 147);
+	_x = 454;
+	_y = 217;
+	startAnimation(0x4C210500, 0, -1);
+	SetUpdateHandler(&AsScene1401Pipe::update);
+	SetMessageHandler(&AsScene1401Pipe::handleMessage);
+}
+
+AsScene1401Pipe::~AsScene1401Pipe() {
+	_vm->_soundMan->deleteSoundGroup(0x01104C08);
+}
+
+void AsScene1401Pipe::update() {
+	AnimatedSprite::update();
+	if (_countdown1 != 0 && (--_countdown1 == 0))
+		stDoneSucking();
+	if (_countdown2 != 0 && (--_countdown2 == 0)) {
+		_vm->_soundMan->addSound(0x01104C08, 0x4A116437);
+		_vm->_soundMan->playSoundLooping(0x4A116437);
+	}
+}
+
+void AsScene1401Pipe::upSuckInProjector() {
+	AnimatedSprite::update();
+	if (_countdown1 != 0)
+		_countdown1--;
+}
+
+uint32 AsScene1401Pipe::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x0A8A1490)
+			playSound(1, 0x6AB6666F);
+		break;
+	case 0x2000:
+		_countdown1 = 70;
+		_countdown2 = 8;
+		stStartSucking();
+		break;
+	case 0x483A:
+		stSuckInProjector();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1401Pipe::hmSuckInProjector(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		if (_countdown1 != 0)
+			stStartSucking();
+		else
+			stDoneSucking();
+		SetMessageHandler(&AsScene1401Pipe::handleMessage);
+		SetUpdateHandler(&AsScene1401Pipe::update);
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1401Pipe::stStartSucking() {
+	startAnimation(0x4C240100, 0, -1);
+	playSound(0, 0x4A30063F);
+}
+
+void AsScene1401Pipe::stDoneSucking() {
+	_vm->_soundMan->deleteSound(0x4A116437);
+	playSound(0, 0x4A120435);
+	startAnimation(0x4C210500, 0, -1);
+}
+
+void AsScene1401Pipe::stSuckInProjector() {
+	startAnimation(0x6C210810, 0, -1);
+	SetUpdateHandler(&AsScene1401Pipe::upSuckInProjector);
+	SetMessageHandler(&AsScene1401Pipe::hmSuckInProjector);
+}
+
+AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100) {
+
+	createSurface(100, 71, 41);
+	_x = 478;
+	_y = 433;
+	startAnimation(0xA282C472, 0, -1);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1401Mouse::handleMessage);
+}
+
+uint32 AsScene1401Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x66382026)
+			playSound(0, 0x0CD84468);
+		else if (param.asInteger() == 0x6E28061C)
+			playSound(0, 0x78C8402C);
+		else if (param.asInteger() == 0x462F0410)
+			playSound(0, 0x60984E28);
+		break;
+	case 0x4839:
+		stSuckedIn();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1401Mouse::suSuckedIn() {
+	AnimatedSprite::updateDeltaXY();
+	if (_collisionBounds.y1 <= 150) {
+		playSound(0, 0x0E32247F);
+		stopAnimation();
+		setVisible(false);
+		SetMessageHandler(NULL);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+void AsScene1401Mouse::stSuckedIn() {
+	startAnimation(0x34880040, 0, -1);
+	SetSpriteUpdate(&AsScene1401Mouse::suSuckedIn);
+}
+
+AsScene1401Cheese::AsScene1401Cheese(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100) {
+
+	createSurface(200, 152, 147);
+	_x = 427;
+	_y = 433;
+	startAnimation(0x461A1490, 0, -1);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1401Cheese::handleMessage);
+}
+
+uint32 AsScene1401Cheese::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4839:
+		stSuckedIn();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1401Cheese::suSuckedIn() {
+	AnimatedSprite::updateDeltaXY();
+	if (_collisionBounds.y1 <= 150) {
+		playSound(0, 0x18020439);
+		stopAnimation();
+		setVisible(false);
+		SetMessageHandler(NULL);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+void AsScene1401Cheese::stSuckedIn() {
+	startAnimation(0x103B8020, 0, -1);
+	SetSpriteUpdate(&AsScene1401Cheese::suSuckedIn);
+}
+
+AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen)
+	: AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown(0), _isOpen(isOpen) {
+
+	_x = 320;
+	_y = 240;
+	createSurface1(0x04551900, 100);
+	if (isOpen) {
+		startAnimation(0x04551900, -1, -1);
+		_countdown = 48;
+	} else {
+		stopAnimation();
+		setVisible(false);
+	}
+	_newStickFrameIndex = STICK_LAST_FRAME;
+	SetUpdateHandler(&AsScene1401BackDoor::update);
+	SetMessageHandler(&AsScene1401BackDoor::handleMessage);
+}
+
+void AsScene1401BackDoor::update() {
+	if (_countdown != 0 && (--_countdown == 0))
+		stCloseDoor();
+	AnimatedSprite::update();
+}
+
+
+uint32 AsScene1401BackDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2001:
+		if (_isOpen)
+			_countdown = 168;
+		messageResult = _isOpen ? 1 : 0;
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	case 0x4808:
+		_countdown = 168;
+		if (!_isOpen)
+			stOpenDoor();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1401BackDoor::stOpenDoor() {
+	_isOpen = true;
+	setVisible(true);
+	startAnimation(0x04551900, 0, -1);
+	_newStickFrameIndex = STICK_LAST_FRAME;
+	playSound(0, calcHash("fxDoorOpen24"));
+}
+
+void AsScene1401BackDoor::stCloseDoor() {
+	_isOpen = false;
+	setVisible(true);
+	startAnimation(0x04551900, -1, -1);
+	playSound(0, calcHash("fxDoorClose24"));
+	_playBackwards = true;
+	NextState(&AsScene1401BackDoor::stCloseDoorDone);
+}
+
+void AsScene1401BackDoor::stCloseDoorDone() {
+	stopAnimation();
+	setVisible(false);
+}
+
+static const AsCommonProjectorItem kAsCommonProjectorItems[] = {
+	{{154, 453}, 4,  2,  0, 0, 1},
+	{{104, 391}, 4, -1, -1, 1, 1},
+	{{ 22, 447}, 6, -1, -1, 1, 1},
+	{{112, 406}, 2, -1, -1, 1, 0},
+	{{262, 433}, 1,  1,  0, 0, 0}
+};
+
+AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, Sprite *asPipe)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klaymen(klaymen), _asPipe(asPipe) {
+
+	_asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)];
+	createSurface(990, 101, 182);
+	startAnimation(0x10E3042B, 0, -1);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsCommonProjector::handleMessage);
+	_x = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x;
+	_lockedInSlot = true;
+	moveProjector();
+	setDoDeltaX(1);
+	if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex)
+		stStayLockedInSlot();
+	loadSound(2, 0xC8C2507C);
+}
+
+AsCommonProjector::~AsCommonProjector() {
+	_vm->_soundMan->deleteSoundGroup(0x05331081);
+}
+
+uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		sendMessage(_parentScene, 0x4826, 0);
+		messageResult = 1;
+		break;
+	case 0x4807:
+		setGlobalVar(V_PROJECTOR_SLOT, (_x - _asProjectorItem->point.x) / 108);
+		if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex)
+			stStartLockedInSlot();
+		else
+			stIdle();
+		break;
+	case 0x480B:
+		if (param.asInteger() != 1) {
+			if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount)
+				incGlobalVar(V_PROJECTOR_SLOT, 1);
+		} else if (getGlobalVar(V_PROJECTOR_SLOT) > 0)
+			incGlobalVar(V_PROJECTOR_SLOT, -1);
+		stMoving();
+		break;
+	case 0x480C:
+		// Check if the projector can be moved
+		if (param.asInteger() != 1)
+			messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0;
+		else
+			messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0;
+		break;
+	case 0x482A:
+		sendMessage(_parentScene, 0x1022, 990);
+		break;
+	case 0x482B:
+		sendMessage(_parentScene, 0x1022, 1010);
+		break;
+	case 0x4839:
+		stStartSuckedIn();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (param.asPoint().x - _x >= 17 && param.asPoint().x - _x <= 56 &&
+			param.asPoint().y - _y >= -120 && param.asPoint().y - _y <= -82) {
+			sendMessage(_parentScene, 0x4826, 1);
+		} else
+			sendMessage(_parentScene, 0x4826, 0);
+		messageResult = 1;
+		break;
+	case 0x4807:
+		sendMessage(_parentScene, 0x4807, 0);
+		stStopProjecting();
+		break;
+	case 0x480B:
+		if (param.asInteger() != 1) {
+			if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount)
+				incGlobalVar(V_PROJECTOR_SLOT, 1);
+		} else if (getGlobalVar(V_PROJECTOR_SLOT) > 0)
+			incGlobalVar(V_PROJECTOR_SLOT, -1);
+		stTurnToFront();
+		break;
+	case 0x480C:
+		// Check if the projector can be moved
+		if (param.asInteger() != 1)
+			messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0;
+		else
+			messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0;
+		break;
+	case 0x480F:
+		stStartProjecting();
+		break;
+	case 0x482A:
+		sendMessage(_parentScene, 0x1022, 990);
+		break;
+	case 0x482B:
+		sendMessage(_parentScene, 0x1022, 1010);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsCommonProjector::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void AsCommonProjector::suMoving() {
+	if (_x <= _klaymen->getX())
+		_x = _klaymen->getX() - 100;
+	else
+		_x = _klaymen->getX() + 100;
+	moveProjector();
+	if (_beforeMoveX == _x) {
+		if (getGlobalVar(V_PROJECTOR_SLOT) == 0 && _asProjectorItem->leftBorderLeaves != 0) {
+			sendMessage(_parentScene, 0x1019, 0);
+			incGlobalVar(V_PROJECTOR_LOCATION, -1);
+			setGlobalVar(V_PROJECTOR_SLOT, kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)].maxSlotCount);
+		} else if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->maxSlotCount && _asProjectorItem->rightBorderLeaves != 0) {
+			sendMessage(_parentScene, 0x1019, 1);
+			incGlobalVar(V_PROJECTOR_LOCATION, +1);
+			setGlobalVar(V_PROJECTOR_SLOT, 0);
+		}
+	}
+	Sprite::updateBounds();
+}
+
+void AsCommonProjector::moveProjector() {
+
+	bool nowLockedInSlot = false;
+
+	_y = _asProjectorItem->point.y;
+
+	if (_asProjectorItem->index1 != -1) {
+		int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x;
+		if (elX - 20 < _x && elX + 20 > _x) {
+			nowLockedInSlot = true;
+			_y = _asProjectorItem->point.y + 10;
+		}
+	}
+
+	if (_asProjectorItem->lockSlotIndex != -1) {
+		int16 elX = _asProjectorItem->lockSlotIndex * 108 + _asProjectorItem->point.x;
+		if (elX - 20 < _x && elX + 20 > _x) {
+			nowLockedInSlot = true;
+			_y = _asProjectorItem->point.y + 10;
+		}
+	}
+
+	if (_lockedInSlot && !nowLockedInSlot)
+		_lockedInSlot = false;
+	else if (!_lockedInSlot && nowLockedInSlot) {
+		playSound(1, 0x5440E474);
+		_lockedInSlot = true;
+	}
+
+}
+
+void AsCommonProjector::stSuckedIn() {
+	AnimatedSprite::updateDeltaXY();
+	if (_collisionBounds.y1 <= 150) {
+		sendMessage(_asPipe, 0x483A, 0);
+		stopAnimation();
+		setVisible(false);
+		SetMessageHandler(&Sprite::handleMessage);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+void AsCommonProjector::stIdle() {
+	startAnimation(0x10E3042B, 0, -1);
+	SetMessageHandler(&AsCommonProjector::handleMessage);
+	SetSpriteUpdate(NULL);
+}
+
+void AsCommonProjector::stMoving() {
+	_beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x;
+	startAnimation(0x14A10137, 0, -1);
+	playSound(1, 0xEC008474);
+	SetMessageHandler(&AsCommonProjector::handleMessage);
+	SetSpriteUpdate(&AsCommonProjector::suMoving);
+}
+
+void AsCommonProjector::stStartLockedInSlot() {
+	startAnimation(0x80C32213, 0, -1);
+	SetMessageHandler(&AsCommonProjector::hmAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&AsCommonProjector::stStayLockedInSlot);
+}
+
+void AsCommonProjector::stStayLockedInSlot() {
+	startAnimation(0xD23B207F, 0, -1);
+	SetMessageHandler(&AsCommonProjector::hmLockedInSlot);
+	SetSpriteUpdate(NULL);
+}
+
+void AsCommonProjector::stStartProjecting() {
+	startAnimation(0x50A80517, 0, -1);
+	setGlobalVar(V_PROJECTOR_ACTIVE, 1);
+	playSound(0, 0xCC4A8456);
+	_vm->_soundMan->addSound(0x05331081, 0xCE428854);
+	_vm->_soundMan->playSoundLooping(0xCE428854);
+	SetMessageHandler(&AsCommonProjector::hmAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&AsCommonProjector::stLockedInSlot);
+}
+
+void AsCommonProjector::stLockedInSlot() {
+	sendMessage(_parentScene, 0x480F, 0);
+	startAnimation(0xD833207F, 0, -1);
+	SetMessageHandler(&AsCommonProjector::hmLockedInSlot);
+	SetSpriteUpdate(NULL);
+}
+
+void AsCommonProjector::stStopProjecting() {
+	startAnimation(0x50A94417, 0, -1);
+	setGlobalVar(V_PROJECTOR_ACTIVE, 0);
+	playSound(0, 0xCC4A8456);
+	_vm->_soundMan->deleteSound(0xCE428854);
+	SetMessageHandler(&AsCommonProjector::hmAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&AsCommonProjector::stStayLockedInSlot);
+}
+
+void AsCommonProjector::stTurnToFront() {
+	_beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x;
+	startAnimation(0x22CB4A33, 0, -1);
+	SetMessageHandler(&AsCommonProjector::hmAnimation);
+	SetSpriteUpdate(&AsCommonProjector::suMoving);
+	NextState(&AsCommonProjector::stMoving);
+}
+
+void AsCommonProjector::stStartSuckedIn() {
+	setGlobalVar(V_PROJECTOR_LOCATION, 4);
+	setGlobalVar(V_PROJECTOR_SLOT, 0);
+	startAnimation(0x708D4712, 0, -1);
+	playSound(2);
+	SetMessageHandler(&Sprite::handleMessage);
+	SetSpriteUpdate(&AsCommonProjector::stSuckedIn);
+}
+
+SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority)
+	: StaticSprite(vm, fileHash, surfacePriority) {
+
+	SetFilterY(&Sprite::defFilterY);
+	SetUpdateHandler(&StaticSprite::updatePosition);
+}
+
+AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
+
+	createSurface(900, 347, 230);
+
+	SetFilterY(&Sprite::defFilterY);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1402PuzzleBox::handleMessage);
+	_x = 279;
+	_y = 270;
+	if (status == 2) {
+		// Puzzle box after the puzzle was solved
+		startAnimation(0x20060259, 0, -1);
+		playSound(0, 0x419014AC);
+		loadSound(1, 0x61901C29);
+		NextState(&AsScene1402PuzzleBox::stMoveDownSolvedDone);
+	} else if (status == 1) {
+		// Puzzle box appears
+		startAnimation(0x210A0213, 0, -1);
+		playSound(0, 0x41809C6C);
+		NextState(&AsScene1402PuzzleBox::stMoveUpDone);
+	} else {
+		// Puzzle box is here
+		startAnimation(0x20060259, -1, -1);
+		loadSound(1, 0x61901C29);
+		_newStickFrameIndex = STICK_LAST_FRAME;
+	}
+}
+
+uint32 AsScene1402PuzzleBox::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2002:
+		playSound(1);
+		startAnimation(0x20060259, -1, -1);
+		_playBackwards = true;
+		NextState(&AsScene1402PuzzleBox::stMoveDownDone);
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1402PuzzleBox::stMoveUpDone() {
+	sendMessage(_parentScene, 0x2000, 0);
+	stopAnimation();
+	setVisible(false);
+}
+
+void AsScene1402PuzzleBox::stMoveDownDone() {
+	sendMessage(_parentScene, 0x2001, 0);
+	stopAnimation();
+	setVisible(false);
+}
+
+void AsScene1402PuzzleBox::stMoveDownSolvedDone() {
+	sendMessage(_parentScene, 0x2003, 0);
+	stopAnimation();
+}
+
+static const int16 kScene1407MouseFloorY[] = {
+	106, 150, 191, 230, 267, 308, 350, 395
+};
+
+static const struct {
+	int16 x;
+	int16 floorIndex;
+	int16 sectionIndex;
+	int16 nextHoleIndex;
+} kScene1407MouseHoles[] = {
+	{125, 0,  0,  7},
+	{452, 7, 21,  0},
+	{337, 4, 11,  4},
+	{286, 6, 17,  6},
+	{348, 6, 17, 39},
+	{536, 6, 18, 42},
+	{111, 1,  3, 18},
+	{203, 1,  3, 38},
+	{270, 1,  3,  9},
+	{197, 5, 14,  3},
+	{252, 5, 14, 35},
+	{297, 5, 14,  7},
+	{359, 5, 14,  8},
+	{422, 4, 12, 26},
+	{467, 4, 12,  2},
+	{539, 4, 12, 40},
+	{111, 5, 13, 17},
+	{211, 0,  1, 20},
+	{258, 0,  1, 11},
+	{322, 0,  1, 16},
+	{ 99, 6, 16, 31},
+	{142, 6, 16, 27},
+	{194, 6, 16, 12},
+	{205, 2,  6, 45},
+	{264, 2,  6, 10},
+	{ 98, 4, 10,  2},
+	{152, 4, 10, 37},
+	{199, 4, 10, 13},
+	{258, 4, 10, 16},
+	{100, 7, 19, 43},
+	{168, 7, 19, 23},
+	{123, 3,  8, 14},
+	{181, 3,  8, 39},
+	{230, 3,  8, 28},
+	{292, 3,  8, 22},
+	{358, 3,  8, 36},
+	{505, 3,  9, 44},
+	{400, 2,  7, 34},
+	{454, 2,  7, 32},
+	{532, 2,  7, 46},
+	{484, 5, 15, 25},
+	{529, 5, 15, 30},
+	{251, 7, 20, 48},
+	{303, 7, 20, 21},
+	{360, 7, 20, 33},
+	{503, 0,  2,  5},
+	{459, 1,  4, 19},
+	{530, 1,  4, 42},
+	{111, 2,  5, 47},
+	{442, 6, 18,  1}
+};
+
+static const struct {
+	int16 x1, x2;
+	int16 goodHoleIndex;
+} kScene1407MouseSections[] = {
+	{100, 149,  0},
+	{182, 351, 17},
+	{430, 524, 45},
+	{ 89, 293,  7},
+	{407, 555, 47},
+	{ 89, 132, 48},
+	{178, 303, 23},
+	{367, 551, 38},
+	{105, 398, 31},
+	{480, 537, 36},
+	{ 84, 275, 27},
+	{318, 359,  2},
+	{402, 560, 15},
+	{ 91, 132, 16},
+	{179, 400, 10},
+	{461, 552, 41},
+	{ 86, 218, 21},
+	{267, 376,  4},
+	{420, 560, 49},
+	{ 77, 188, 30},
+	{237, 394, 44},
+	{438, 515,  5}
+};
+
+AsScene1407Mouse::AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _currSectionIndex(0) {
+
+	createSurface(100, 117, 45);
+	_x = 108;
+	_y = 106;
+	stIdleLookAtGoodHole();
+	SetUpdateHandler(&AnimatedSprite::update);
+}
+
+void AsScene1407Mouse::suWalkTo() {
+	int16 xdelta = _walkDestX - _x;
+	if (xdelta > _deltaX)
+		xdelta = _deltaX;
+	else if (xdelta < -_deltaX)
+		xdelta = -_deltaX;
+	_deltaX = 0;
+	if (_walkDestX == _x)
+		sendMessage(this, 0x1019, 0);
+	else {
+		_x += xdelta;
+		updateBounds();
+	}
+}
+
+void AsScene1407Mouse::upGoThroughHole() {
+	if (_countdown != 0 && (--_countdown == 0)) {
+		SetUpdateHandler(&AnimatedSprite::update);
+		gotoNextState();
+	}
+	AnimatedSprite::update();
+}
+
+uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		{
+			int16 mouseX = param.asPoint().x;
+			int16 mouseY = param.asPoint().y;
+			int holeIndex;
+			for (holeIndex = 0; holeIndex < 50; holeIndex++) {
+				int16 holeX = kScene1407MouseHoles[holeIndex].x;
+				int16 holeY = kScene1407MouseFloorY[kScene1407MouseHoles[holeIndex].floorIndex];
+				if (mouseX >= holeX - 14 && mouseX <= holeX + 14 && mouseY >= holeY - 36 && mouseY <= holeY)
+					break;
+			}
+			if (holeIndex < 50 && kScene1407MouseHoles[holeIndex].sectionIndex == _currSectionIndex) {
+				_nextHoleIndex = kScene1407MouseHoles[holeIndex].nextHoleIndex;
+				_walkDestX = kScene1407MouseHoles[holeIndex].x;
+				stWalkToHole();
+			} else {
+				if (mouseX < kScene1407MouseSections[_currSectionIndex].x1)
+					_walkDestX = kScene1407MouseSections[_currSectionIndex].x1;
+				else if (mouseX > kScene1407MouseSections[_currSectionIndex].x2)
+					_walkDestX = kScene1407MouseSections[_currSectionIndex].x2;
+				else
+					_walkDestX = mouseX;
+				stWalkToDest();
+			}
+		}
+		break;
+	case 0x1019:
+		gotoNextState();
+		break;
+	case 0x2001:
+		{
+			// Reset the position
+			// Find the nearest hole and go through it, and exit at the first hole
+			int16 distance = 640;
+			int matchIndex = 50;
+			for (int index = 0; index < 50; index++)
+				if (kScene1407MouseHoles[index].sectionIndex == _currSectionIndex &&
+					ABS(kScene1407MouseHoles[index].x - _x) < distance) {
+					matchIndex = index;
+					distance = ABS(kScene1407MouseHoles[index].x - _x);
+				}
+			if (matchIndex < 50) {
+				_nextHoleIndex = 0;
+				_walkDestX = kScene1407MouseHoles[matchIndex].x;
+				stWalkToHole();
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1407Mouse::stIdleLookAtGoodHole() {
+	setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0);
+	startAnimation(0x72215194, 0, -1);
+	SetMessageHandler(&AsScene1407Mouse::handleMessage);
+	SetSpriteUpdate(NULL);
+}
+
+void AsScene1407Mouse::stWalkToDest() {
+	if (_walkDestX != _x) {
+		setDoDeltaX(_walkDestX < _x ? 1 : 0);
+		startAnimation(0x22291510, 0, -1);
+		SetMessageHandler(&AsScene1407Mouse::handleMessage);
+		SetSpriteUpdate(&AsScene1407Mouse::suWalkTo);
+		NextState(&AsScene1407Mouse::stIdleLookAtGoodHole);
+	}
+}
+
+void AsScene1407Mouse::stWalkToHole() {
+	setDoDeltaX(_walkDestX < _x ? 1 : 0);
+	startAnimation(0x22291510, 0, -1);
+	SetMessageHandler(&AsScene1407Mouse::handleMessage);
+	SetSpriteUpdate(&AsScene1407Mouse::suWalkTo);
+	NextState(&AsScene1407Mouse::stGoThroughHole);
+}
+
+void AsScene1407Mouse::stGoThroughHole() {
+	startAnimation(0x72215194, 0, -1);
+	setVisible(false);
+	_countdown = 12;
+	SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole);
+	SetMessageHandler(NULL);
+	SetSpriteUpdate(NULL);
+	NextState(&AsScene1407Mouse::stArriveAtHole);
+}
+
+void AsScene1407Mouse::stArriveAtHole() {
+	_currSectionIndex = kScene1407MouseHoles[_nextHoleIndex].sectionIndex;
+	_x = kScene1407MouseHoles[_nextHoleIndex].x;
+	_y = kScene1407MouseFloorY[kScene1407MouseHoles[_nextHoleIndex].floorIndex];
+	if (_nextHoleIndex == 1) {
+		sendMessage(_parentScene, 0x2000, 0);
+		_walkDestX = 512;
+		stWalkToDest();
+		setVisible(true);
+	} else {
+		_walkDestX = _x + 14;
+		stWalkToDest();
+		setVisible(true);
+	}
+}
+
+static const NPoint kAsScene1405TileItemPositions[] = {
+	{100,  80}, {162,  78}, {222,  76}, {292,  76},
+	{356,  82}, {422,  84}, {488,  86}, {550,  90},
+	{102, 134}, {164, 132}, {224, 136},	{294, 136},
+	{360, 136},	{422, 138},	{484, 144},	{548, 146},
+	{ 98, 196},	{160, 200},	{228, 200},	{294, 202},
+	{360, 198},	{424, 200},	{482, 202},	{548, 206},
+	{ 98, 260},	{160, 264},	{226, 260},	{296, 262},
+	{358, 260},	{424, 262},	{486, 264},	{550, 266},
+	{ 94, 322},	{160, 316},	{226, 316},	{296, 320},
+	{358, 322},	{422, 324},	{488, 322},	{550, 322},
+	{ 98, 380},	{160, 376},	{226, 376},	{294, 378},
+	{356, 380},	{420, 380},	{490, 378},	{552, 376}
+};
+
+AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _tileIndex(tileIndex), _countdown(0), _isShowing(false) {
+
+	loadSound(0, 0x05308101);
+	setSoundPan(0, (tileIndex % 8 * 4 + 4) * 25 / 8);
+	_x = kAsScene1405TileItemPositions[_tileIndex].x;
+	_y = kAsScene1405TileItemPositions[_tileIndex].y;
+	createSurface1(0x844B805C, 1100);
+	setVisible(false);
+	if (getSubVar(VA_IS_TILE_MATCH, _tileIndex))
+		_countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1;
+	startAnimation(0x844B805C, getSubVar(VA_TILE_SYMBOLS, _tileIndex), -1);
+	_newStickFrameIndex = (int16)getSubVar(VA_TILE_SYMBOLS, _tileIndex);
+	SetUpdateHandler(&AsScene1405Tile::update);
+	SetMessageHandler(&AsScene1405Tile::handleMessage);
+}
+
+void AsScene1405Tile::update() {
+	updateAnim();
+	updatePosition();
+	if (_countdown != 0 && (--_countdown == 0))
+		show();
+}
+
+uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (getSubVar(VA_IS_TILE_MATCH, _tileIndex) == 0 && _parentScene->getCountdown() == 0) {
+			show();
+			sendMessage(_parentScene, 0x2000, _tileIndex);
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1405Tile::show() {
+	if (!_isShowing) {
+		_isShowing = true;
+		playSound(0);
+		setVisible(true);
+	}
+}
+
+void AsScene1405Tile::hide() {
+	if (_isShowing) {
+		_isShowing = false;
+		playSound(0);
+		setVisible(false);
+	}
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/modules/module1400_sprites.h b/engines/neverhood/modules/module1400_sprites.h
new file mode 100644
index 0000000..036267e
--- /dev/null
+++ b/engines/neverhood/modules/module1400_sprites.h
@@ -0,0 +1,170 @@
+/* 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_MODULE1400_SPRITES_H
+#define NEVERHOOD_MODULES_MODULE1400_SPRITES_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+class AsScene1401Pipe : public AnimatedSprite {
+public:
+	AsScene1401Pipe(NeverhoodEngine *vm);
+	virtual ~AsScene1401Pipe();
+protected:
+	int _countdown1;
+	int _countdown2;
+	void update();
+	void upSuckInProjector();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmSuckInProjector(int messageNum, const MessageParam &param, Entity *sender);
+	void stStartSucking();
+	void stDoneSucking();
+	void stSuckInProjector();
+};
+
+class AsScene1401Mouse : public AnimatedSprite {
+public:
+	AsScene1401Mouse(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void suSuckedIn();
+	void stSuckedIn();
+};
+
+class AsScene1401Cheese : public AnimatedSprite {
+public:
+	AsScene1401Cheese(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void suSuckedIn();
+	void stSuckedIn();
+};
+
+class AsScene1401BackDoor : public AnimatedSprite {
+public:
+	AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen);
+protected:
+	Sprite *_klaymen;
+	int _countdown;
+	bool _isOpen;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stOpenDoor();
+	void stCloseDoor();
+	void stCloseDoorDone();
+};
+
+struct AsCommonProjectorItem {
+	NPoint point;
+	int8 maxSlotCount;
+	int8 lockSlotIndex;
+	int8 index1;
+	int8 leftBorderLeaves;
+	int8 rightBorderLeaves;
+};
+
+class AsCommonProjector : public AnimatedSprite {
+public:
+	AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, Sprite *asPipe);
+	virtual ~AsCommonProjector();
+protected:
+	Scene *_parentScene;
+	Sprite *_klaymen;
+	Sprite *_asPipe;
+	const AsCommonProjectorItem *_asProjectorItem;
+	int16 _beforeMoveX;
+	bool _lockedInSlot;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmLockedInSlot(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmAnimation(int messageNum, const MessageParam &param, Entity *sender);
+	void suMoving();
+	void moveProjector();
+	void stSuckedIn();
+	void stIdle();
+	void stMoving();
+	void stStartLockedInSlot();
+	void stStayLockedInSlot();
+	void stStartProjecting();
+	void stLockedInSlot();
+	void stStopProjecting();
+	void stTurnToFront();
+	void stStartSuckedIn();
+};
+
+class SsScene1402BridgePart : public StaticSprite {
+public:
+	SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority);
+};
+
+class AsScene1402PuzzleBox : public AnimatedSprite {
+public:
+	AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stMoveUpDone();
+	void stMoveDownDone();
+	void stMoveDownSolvedDone();
+};
+
+class AsScene1407Mouse : public AnimatedSprite {
+public:
+	AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	int16 _walkDestX;
+	int16 _currSectionIndex;
+	int16 _nextHoleIndex;
+	int _countdown;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void suWalkTo();
+	void upGoThroughHole();
+	void stIdleLookAtGoodHole();
+	void stWalkToDest();
+	void stWalkToHole();
+	void stGoThroughHole();
+	void stArriveAtHole();
+};
+
+class Scene1405;
+
+class AsScene1405Tile : public AnimatedSprite {
+public:
+	AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex);
+	void show();
+	void hide();
+protected:
+	Scene1405 *_parentScene;
+	bool _isShowing;
+	uint32 _tileIndex;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULES_MODULE1400_SPRITES_H */


Commit: 55a8e7a2de166dc9db785049e53019a0a7c20df0
    https://github.com/scummvm/scummvm/commit/55a8e7a2de166dc9db785049e53019a0a7c20df0
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-10-05T11:30:48-07:00

Commit Message:
NEVERHOOD: Split sprites from their scenes in module 1200

Changed paths:
  A engines/neverhood/modules/module1200_sprites.cpp
  A engines/neverhood/modules/module1200_sprites.h
    engines/neverhood/module.mk
    engines/neverhood/modules/module1200.cpp
    engines/neverhood/modules/module1200.h
    engines/neverhood/modules/module1300.cpp
    engines/neverhood/modules/module1400.cpp
    engines/neverhood/modules/module1600.cpp
    engines/neverhood/modules/module2100.cpp
    engines/neverhood/modules/module2200.cpp
    engines/neverhood/modules/module2400.cpp
    engines/neverhood/modules/module2800.cpp



diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 7a36bc3..6f4b494 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -17,6 +17,7 @@ MODULE_OBJS = \
 	modules/module1000.o \
 	modules/module1100.o \
 	modules/module1200.o \
+	modules/module1200_sprites.o \
 	modules/module1300.o \
 	modules/module1300_sprites.o \
 	modules/module1400.o \
diff --git a/engines/neverhood/modules/module1200.cpp b/engines/neverhood/modules/module1200.cpp
index e776641..9755450 100644
--- a/engines/neverhood/modules/module1200.cpp
+++ b/engines/neverhood/modules/module1200.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/modules/module1200.h"
+#include "neverhood/modules/module1200_sprites.h"
 
 namespace Neverhood {
 
@@ -92,566 +93,10 @@ void Module1200::updateScene() {
 	}
 }
 
-// Scene1201
-
 static const uint32 kScene1201InitArray[] = {
 	1, 0, 2, 4, 5, 3, 6, 7, 8, 10, 9, 11, 13, 14, 12, 16, 17, 15
 };
 
-static const NPoint kScene1201PointArray[] = {
-	{218, 193}, {410, 225}, {368, 277},
-	{194, 227}, {366, 174}, {458, 224},
-	{242, 228}, {512, 228}, {458, 277},
-	{217, 233}, {458, 173}, {410, 276},
-	{203, 280}, {371, 226}, {508, 279},
-	{230, 273}, {410, 171}, {493, 174}
-};
-
-static const uint32 kScene1201TntFileHashList1[] = {
-	0x2098212D, 0x1600437E, 0x1600437E,
-	0x00A840E3, 0x1A1830F6, 0x1A1830F6,
-	0x00212062, 0x384010B6, 0x384010B6,
-	0x07A01080, 0xD80C2837, 0xD80C2837,
-	0x03A22092, 0xD8802CB6, 0xD8802CB6,
-	0x03A93831, 0xDA460476, 0xDA460476
-};
-
-static const uint32 kScene1201TntFileHashList2[] = {
-	0x3040C676, 0x10914448, 0x10914448,
-	0x3448A066, 0x1288C049, 0x1288C049,
-	0x78C0E026, 0x3098D05A, 0x3098D05A,
-	0x304890E6, 0x1284E048, 0x1284E048,
-	0xB140A1E6, 0x5088A068, 0x5088A068,
-	0x74C4C866, 0x3192C059, 0x3192C059
-};
-
-SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2)
-	: StaticSprite(vm, 900) {
-
-	int16 x = kScene1201PointArray[pointIndex].x;
-	int16 y = kScene1201PointArray[pointIndex].y;
-	if (x < 300)
-		loadSprite(kScene1201TntFileHashList1[elemIndex], kSLFDefDrawOffset | kSLFDefPosition, 50);
-	else
-		loadSprite(kScene1201TntFileHashList2[elemIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 50, x, y - 20);
-	setClipRect(0, 0, 640, clipY2);
-}
-
-AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash)
-	: AnimatedSprite(vm, fileHash, surfacePriority, x, y), _parentScene(parentScene), _nameHash(nameHash) {
-
-	if (!getSubVar(VA_HAS_TAPE, _nameHash) && !getSubVar(VA_IS_TAPE_INSERTED, _nameHash)) {
-		SetMessageHandler(&AsScene1201Tape::handleMessage);
-	} else {
-		setVisible(false);
-		SetMessageHandler(NULL);
-	}
-}
-
-uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		sendMessage(_parentScene, 0x4826, 0);
-		messageResult = 1;
-		break;
-	case 0x4806:
-		setSubVar(VA_HAS_TAPE, _nameHash, 1);
-		setVisible(false);
-		SetMessageHandler(NULL);
-		break;
-	}
-	return messageResult;
-}
-
-AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging)
-	: AnimatedSprite(vm, 1200) {
-
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1201TntManRope::handleMessage);
-	createSurface(10, 34, 149);
-	_x = 202;
-	_y = -32;
-	if (isDummyHanging) {
-		startAnimation(0x928F0C10, 15, -1);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-	} else {
-		startAnimation(0x928F0C10, 0, -1);
-		_newStickFrameIndex = 0;
-	}
-}
-
-uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x02060018)
-			playSound(0, 0x47900E06);
-		break;
-	case 0x2006:
-		startAnimation(0x928F0C10, 1, -1);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-		break;
-	}
-	return messageResult;
-}
-
-AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen)
-	: AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown(0) {
-
-	createSurface1(0xD088AC30, 100);
-	_x = 320;
-	_y = 240;
-	SetUpdateHandler(&AsScene1201RightDoor::update);
-	SetMessageHandler(&AsScene1201RightDoor::handleMessage);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-	if (isOpen) {
-		startAnimation(0xD088AC30, -1, -1);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-		_countdown = 25;
-	} else {
-		stopAnimation();
-		setVisible(false);
-	}
-}
-
-void AsScene1201RightDoor::update() {
-	if (_countdown != 0 && (--_countdown == 0))
-		stCloseDoor();
-	AnimatedSprite::update();
-}
-
-uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	case 0x4829:
-		stOpenDoor();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1201RightDoor::stOpenDoor() {
-	startAnimation(0xD088AC30, 0, -1);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-	setVisible(true);
-	playSound(0, calcHash("fxDoorOpen20"));
-}
-
-void AsScene1201RightDoor::stCloseDoor() {
-	startAnimation(0xD088AC30, -1, -1);
-	_playBackwards = true;
-	setVisible(true);
-	playSound(0, calcHash("fxDoorClose20"));
-	NextState(&AsScene1201RightDoor::stCloseDoorDone);
-}
-
-void AsScene1201RightDoor::stCloseDoorDone() {
-	stopAnimation();
-	setVisible(false);
-}
-
-AsScene1201KlaymenHead::AsScene1201KlaymenHead(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1200) {
-
-	createSurface(1200, 69, 98);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1201KlaymenHead::handleMessage);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	setVisible(false);
-}
-
-uint32 AsScene1201KlaymenHead::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2006:
-		_x = 436;
-		_y = 339;
-		startAnimation(0xA060C599, 0, -1);
-		setVisible(true);
-		break;
-	case 0x3002:
-		stopAnimation();
-		setVisible(false);
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isComingDown)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _asTntManRope(asTntManRope),
-	_isMoving(false) {
-
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1201TntMan::handleMessage);
-	createSurface(990, 106, 181);
-	_x = 201;
-	if (isComingDown) {
-		_y = 297;
-		stComingDown();
-	} else {
-		_y = 334;
-		stStanding();
-	}
-}
-
-AsScene1201TntMan::~AsScene1201TntMan() {
-	_vm->_soundMan->deleteSoundGroup(0x01D00560);
-}
-
-uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x092870C0)
-			sendMessage(_asTntManRope, 0x2006, 0);
-		else if (param.asInteger() == 0x11CA0144)
-			playSound(0, 0x51800A04);
-		break;
-	case 0x1011:
-		sendMessage(_parentScene, 0x2002, 0);
-		messageResult = 1;
-		break;
-	case 0x480B:
-		if (!_isMoving) {
-			_sprite = (Sprite*)sender;
-			stMoving();
-		}
-		break;
-	}
-	return messageResult;
-
-}
-
-uint32 AsScene1201TntMan::hmComingDown(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1201TntMan::suMoving() {
-	_x = _sprite->getX() + 100;
-}
-
-void AsScene1201TntMan::stStanding() {
-	startAnimation(0x654913D0, 0, -1);
-	SetMessageHandler(&AsScene1201TntMan::handleMessage);
-	SetSpriteUpdate(NULL);
-}
-
-void AsScene1201TntMan::stComingDown() {
-	startAnimation(0x356803D0, 0, -1);
-	SetMessageHandler(&AsScene1201TntMan::hmComingDown);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	NextState(&AsScene1201TntMan::stStanding);
-}
-
-void AsScene1201TntMan::stMoving() {
-	_vm->_soundMan->addSound(0x01D00560, 0x4B044624);
-	_vm->_soundMan->playSoundLooping(0x4B044624);
-	_isMoving = true;
-	startAnimation(0x85084190, 0, -1);
-	SetMessageHandler(&AsScene1201TntMan::handleMessage);
-	SetSpriteUpdate(&AsScene1201TntMan::suMoving);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-}
-
-AsScene1201TntManFlame::AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan)
-	: AnimatedSprite(vm, 1200), _asTntMan(asTntMan) {
-
-	createSurface1(0x828C0411, 995);
-	SetUpdateHandler(&AsScene1201TntManFlame::update);
-	SetMessageHandler(&Sprite::handleMessage);
-	SetSpriteUpdate(&AsScene1201TntManFlame::suUpdate);
-	startAnimation(0x828C0411, 0, -1);
-	setVisible(false);
-}
-
-AsScene1201TntManFlame::~AsScene1201TntManFlame() {
-	_vm->_soundMan->deleteSoundGroup(0x041080A4);
-}
-
-void AsScene1201TntManFlame::update() {
-	AnimatedSprite::update();
-	if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) {
-		setVisible(true);
-		SetUpdateHandler(&AnimatedSprite::update);
-		_vm->_soundMan->addSound(0x041080A4, 0x460A1050);
-		_vm->_soundMan->playSoundLooping(0x460A1050);
-	}
-}
-
-void AsScene1201TntManFlame::suUpdate() {
-	_x = _asTntMan->getX() - 18;
-	_y = _asTntMan->getY() - 158;
-}
-
-AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _countdown(0) {
-
-	createSurface(1100, 57, 60);
-	SetUpdateHandler(&AsScene1201Match::update);
-	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	switch (getGlobalVar(V_MATCH_STATUS)) {
-	case 0:
-		_x = 521;
-		_y = 112;
-		_status = 0;
-		stIdleOnDoorFrame();
-		break;
-	case 1:
-		_x = 521;
-		_y = 112;
-		_status = 2;
-		stOnDoorFrameAboutToMove();
-		loadSound(0, 0xD00230CD);
-		break;
-	case 2:
-		setDoDeltaX(1);
-		_x = 403;
-		_y = 337;
-		_status = 0;
-		stIdleOnFloor();
-		break;
-	}
-}
-
-void AsScene1201Match::update() {
-	if (_countdown != 0 && (--_countdown == 0))
-		gotoNextState();
-	updateAnim();
-	handleSpriteUpdate();
-	updatePosition();
-}
-
-uint32 AsScene1201Match::hmOnDoorFrameAboutToMove(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x86668011)
-			playSound(0);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1201Match::hmOnDoorFrameMoving(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1201Match::hmIdle(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		sendMessage(_parentScene, 0x2001, 0);
-		messageResult = 1;
-		break;
-	case 0x4806:
-		setVisible(false);
-		setGlobalVar(V_MATCH_STATUS, 3);
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1201Match::stOnDoorFrameMoving() {
-	startAnimation(0x00842374, 0, -1);
-	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving);
-	if (_status == 0) {
-		NextState(&AsScene1201Match::stFallingFromDoorFrame);
-	} else {
-		NextState(&AsScene1201Match::stOnDoorFrameAboutToMove);
-	}
-}
-
-void AsScene1201Match::stFallingFromDoorFrame() {
-	setGlobalVar(V_MATCH_STATUS, 2);
-	_x -= 199;
-	_y += 119;
-	startAnimation(0x018D0240, 0, -1);
-	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving);
-	NextState(&AsScene1201Match::stIdleOnFloor);
-}
-
-void AsScene1201Match::stOnDoorFrameAboutToMove() {
-	startAnimation(0x00842374, 0, -1);
-	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove);
-	_newStickFrameIndex = 0;
-	if (_status != 0) {
-		_countdown = 36;
-		_status--;
-		NextState(&AsScene1201Match::stOnDoorFrameMoving);
-	}
-}
-
-void AsScene1201Match::stIdleOnDoorFrame() {
-	startAnimation(0x00842374, 0, -1);
-	SetMessageHandler(&AsScene1201Match::hmIdle);
-	_newStickFrameIndex = 0;
-}
-
-void AsScene1201Match::stIdleOnFloor() {
-	setDoDeltaX(1);
-	_x = 403;
-	_y = 337;
-	startAnimation(0x00842374, 0, -1);
-	SetMessageHandler(&AsScene1201Match::hmIdle);
-	_newStickFrameIndex = 0;
-}
-
-AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen)
-	: AnimatedSprite(vm, 900), _parentScene(parentScene), _klaymen(klaymen), _klaymenTooClose(false) {
-
-	// NOTE: _countdown2 and _countdown3 were unused/without effect and thus removed
-
-	createSurface(1100, 203, 199);
-	SetUpdateHandler(&AsScene1201Creature::update);
-	SetMessageHandler(&AsScene1201Creature::hmWaiting);
-	_x = 540;
-	_y = 320;
-	stWaiting();
-}
-
-void AsScene1201Creature::update() {
-	bool oldKlaymenTooClose = _klaymenTooClose;
-	_klaymenTooClose = _klaymen->getX() >= 385;
-	if (_klaymenTooClose != oldKlaymenTooClose)
-		stWaiting();
-	if (_countdown != 0 && (--_countdown == 0))
-		gotoNextState();
-	updateAnim();
-	handleSpriteUpdate();
-	updatePosition();
-}
-
-uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x02060018)
-			playSound(0, 0xCD298116);
-		break;
-	case 0x2004:
-		GotoState(&AsScene1201Creature::stStartReachForTntDummy);
-		break;
-	case 0x2006:
-		GotoState(&AsScene1201Creature::stPincerSnapKlaymen);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1201Creature::hmPincerSnap(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmWaiting(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1201Creature::hmPincerSnapKlaymen(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x02060018) {
-			playSound(0, 0xCD298116);
-			sendMessage(_parentScene, 0x4814, 0);
-			sendMessage(_klaymen, 0x4814, 0);
-		}
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1201Creature::stWaiting() {
-	startAnimation(0x08081513, 0, -1);
-	SetMessageHandler(&AsScene1201Creature::hmWaiting);
-	NextState(&AsScene1201Creature::stPincerSnap);
-	_countdown = 36;
-}
-
-void AsScene1201Creature::stPincerSnap() {
-	if (!_klaymenTooClose) {
-		startAnimation(0xCA287133, 0, -1);
-		SetMessageHandler(&AsScene1201Creature::hmPincerSnap);
-		NextState(&AsScene1201Creature::stWaiting);
-	}
-}
-
-void AsScene1201Creature::stStartReachForTntDummy() {
-	startAnimation(0x08081513, 0, -1);
-	SetMessageHandler(&AsScene1201Creature::hmWaiting);
-	NextState(&AsScene1201Creature::stReachForTntDummy);
-	_countdown = 48;
-}
-
-void AsScene1201Creature::stReachForTntDummy() {
-	startAnimation(0x5A201453, 0, -1);
-	SetMessageHandler(&AsScene1201Creature::hmWaiting);
-	_countdown = 0;
-}
-
-void AsScene1201Creature::stPincerSnapKlaymen() {
-	startAnimation(0xCA287133, 0, -1);
-	SetMessageHandler(&AsScene1201Creature::hmPincerSnapKlaymen);
-	NextState(&AsScene1201Creature::stWaiting);
-	_countdown = 0;
-}
-
-AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen)
-	: AnimatedSprite(vm, 1100), _klaymen(klaymen) {
-
-	_x = 320;
-	_y = 240;
-	createSurface(800, 55, 199);
-	if (_klaymen->getX() < 100) {
-		startAnimation(0x508A111B, 0, -1);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-		playSound(0, calcHash("fxDoorOpen03"));
-	} else {
-		startAnimation(0x508A111B, -1, -1);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-	}
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1201LeftDoor::handleMessage);
-}
-
-uint32 AsScene1201LeftDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x4809:
-		stCloseDoor();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1201LeftDoor::stCloseDoor() {
-	startAnimation(0x508A111B, -1, -1);
-	_playBackwards = true;
-	_newStickFrameIndex = 0;
-}
-
 Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _creatureExploded(false), _asMatch(NULL), _asTntMan(NULL),
 	_asCreature(NULL), _asTntManRope(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) {
@@ -908,95 +353,10 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
-// Scene1202
-
 static const uint32 kScene1202Table[] = {
 	1, 2, 0, 4, 5, 3, 7, 8, 6, 10, 11, 9, 13, 14, 12, 16, 17, 15
 };
 
-static const NPoint kScene1202Points[] = {
-	{203, 140}, {316, 212}, {277, 264},
-	{176, 196}, {275, 159}, {366, 212},
-	{230, 195}, {412, 212}, {368, 263},
-	{204, 192}, {365, 164}, {316, 262},
-	{191, 255}, {280, 213}, {406, 266},
-	{214, 254}, {316, 158}, {402, 161}
-};
-
-static const uint32 kScene1202FileHashes[] = {
-	0x1AC00B8, 0x1AC14B8, 0x1AC14B8,
-	0x1AC30B8, 0x1AC14B8, 0x1AC14B8,
-	0x1AC00B8, 0x1AC14B8, 0x1AC14B8,
-	0x1AC90B8, 0x1AC18B8, 0x1AC18B8,
-	0x1AC30B8, 0x1AC14B8, 0x1AC14B8,
-	0x1AC50B8, 0x1AC14B8, 0x1AC14B8
-};
-
-AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int itemIndex)
-	: AnimatedSprite(vm, 900), _parentScene(parentScene), _itemIndex(itemIndex) {
-
-	int positionIndex;
-
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1202TntItem::hmShowIdle);
-	positionIndex = getSubVar(VA_TNT_POSITIONS, _itemIndex);
-	createSurface(900, 37, 67);
-	_x = kScene1202Points[positionIndex].x;
-	_y = kScene1202Points[positionIndex].y;
-	stShowIdle();
-}
-
-uint32 AsScene1202TntItem::hmShowIdle(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		sendMessage(_parentScene, 0x2000, _itemIndex);
-		messageResult = 1;
-		break;
-	case 0x2001:
-		_newPosition = (int)param.asInteger();
-		stChangePositionFadeOut();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1202TntItem::hmChangePosition(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1202TntItem::stShowIdle() {
-	startAnimation(kScene1202FileHashes[_itemIndex], 0, -1);
-	SetMessageHandler(&AsScene1202TntItem::hmShowIdle);
-	_newStickFrameIndex = 0;
-}
-
-void AsScene1202TntItem::stChangePositionFadeOut() {
-	startAnimation(kScene1202FileHashes[_itemIndex], 0, -1);
-	SetMessageHandler(&AsScene1202TntItem::hmChangePosition);
-	NextState(&AsScene1202TntItem::stChangePositionFadeIn);
-}
-
-void AsScene1202TntItem::stChangePositionFadeIn() {
-	_x = kScene1202Points[_newPosition].x;
-	_y = kScene1202Points[_newPosition].y;
-	startAnimation(kScene1202FileHashes[_itemIndex], 6, -1);
-	_playBackwards = true;
-	SetMessageHandler(&AsScene1202TntItem::hmChangePosition);
-	NextState(&AsScene1202TntItem::stChangePositionDone);
-}
-
-void AsScene1202TntItem::stChangePositionDone() {
-	sendMessage(_parentScene, 0x2002, _itemIndex);
-	stShowIdle();
-}
-
 Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule), _paletteResource(vm),
 	_soundToggle(true), _isPuzzleSolved(false), _counter(0), _clickedIndex(-1) {
diff --git a/engines/neverhood/modules/module1200.h b/engines/neverhood/modules/module1200.h
index e852731..d9d4dd1 100644
--- a/engines/neverhood/modules/module1200.h
+++ b/engines/neverhood/modules/module1200.h
@@ -29,8 +29,6 @@
 
 namespace Neverhood {
 
-// Module1200
-
 class Module1200 : public Module {
 public:
 	Module1200(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -41,121 +39,7 @@ protected:
 	void updateScene();
 };
 
-// Scene1201
-
-class AsScene1201Tape : public AnimatedSprite {
-public:
-	AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash);
-protected:
-	Scene *_parentScene;
-	uint32 _nameHash;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene1201TntManRope : public AnimatedSprite {
-public:
-	AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene1201RightDoor : public AnimatedSprite {
-public:
-	AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen);
-protected:
-	Sprite *_klaymen;
-	int _countdown;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stOpenDoor();
-	void stCloseDoor();
-	void stCloseDoorDone();
-};
-
-class AsScene1201KlaymenHead : public AnimatedSprite {
-public:
-	AsScene1201KlaymenHead(NeverhoodEngine *vm);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene1201TntMan : public AnimatedSprite {
-public:
-	AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isDown);
-	virtual ~AsScene1201TntMan();
-protected:
-	Scene *_parentScene;
-	Sprite *_asTntManRope;
-	Sprite *_sprite;
-	bool _isMoving;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmComingDown(int messageNum, const MessageParam &param, Entity *sender);
-	void suMoving();
-	void stStanding();
-	void stComingDown();
-	void stMoving();
-};
-
-class AsScene1201TntManFlame : public AnimatedSprite {
-public:
-	AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan);
-	~AsScene1201TntManFlame();
-protected:
-	Sprite *_asTntMan;
-	void update();
-	void suUpdate();
-};
-
-class AsScene1201Match : public AnimatedSprite {
-public:
-	AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	int _countdown;
-	int _status;
-	void update();
-	uint32 hmOnDoorFrameAboutToMove(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmOnDoorFrameMoving(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmIdle(int messageNum, const MessageParam &param, Entity *sender);
-	void stOnDoorFrameMoving();
-	void stFallingFromDoorFrame();
-	void stOnDoorFrameAboutToMove();
-	void stIdleOnDoorFrame();
-	void stIdleOnFloor();
-};
-
-class AsScene1201Creature : public AnimatedSprite {
-public:
-	AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen);
-protected:
-	Scene *_parentScene;
-	Sprite *_klaymen;
-	int _countdown;
-	bool _klaymenTooClose;
-	void update();
-	uint32 hmWaiting(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmPincerSnap(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmPincerSnapKlaymen(int messageNum, const MessageParam &param, Entity *sender);
-	void stWaiting();
-	void stPincerSnap();
-	void stStartReachForTntDummy();
-	void stReachForTntDummy();
-	void stPincerSnapKlaymen();
-};
-
-class AsScene1201LeftDoor : public AnimatedSprite {
-public:
-	AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen);
-protected:
-	Sprite *_klaymen;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void stCloseDoor();
-};
-
-class SsScene1201Tnt : public StaticSprite {
-public:
-	SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2);
-};
+class AsScene1201TntMan;
 
 class Scene1201 : public Scene {
 public:
@@ -175,22 +59,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-// Scene1202
-
-class AsScene1202TntItem : public AnimatedSprite {
-public:
-	AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int index);
-protected:
-	Scene *_parentScene;
-	int _itemIndex, _newPosition;
-	uint32 hmShowIdle(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmChangePosition(int messageNum, const MessageParam &param, Entity *sender);
-	void stShowIdle();
-	void stChangePositionFadeOut();
-	void stChangePositionFadeIn();
-	void stChangePositionDone();
-};
-
 class Scene1202 : public Scene {
 public:
 	Scene1202(NeverhoodEngine *vm, Module *parentModule);
diff --git a/engines/neverhood/modules/module1200_sprites.cpp b/engines/neverhood/modules/module1200_sprites.cpp
new file mode 100644
index 0000000..d5ba12f
--- /dev/null
+++ b/engines/neverhood/modules/module1200_sprites.cpp
@@ -0,0 +1,655 @@
+/* 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/module1200_sprites.h"
+
+namespace Neverhood {
+
+static const uint32 kScene1201TntFileHashList1[] = {
+	0x2098212D, 0x1600437E, 0x1600437E,
+	0x00A840E3, 0x1A1830F6, 0x1A1830F6,
+	0x00212062, 0x384010B6, 0x384010B6,
+	0x07A01080, 0xD80C2837, 0xD80C2837,
+	0x03A22092, 0xD8802CB6, 0xD8802CB6,
+	0x03A93831, 0xDA460476, 0xDA460476
+};
+
+static const uint32 kScene1201TntFileHashList2[] = {
+	0x3040C676, 0x10914448, 0x10914448,
+	0x3448A066, 0x1288C049, 0x1288C049,
+	0x78C0E026, 0x3098D05A, 0x3098D05A,
+	0x304890E6, 0x1284E048, 0x1284E048,
+	0xB140A1E6, 0x5088A068, 0x5088A068,
+	0x74C4C866, 0x3192C059, 0x3192C059
+};
+
+SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2)
+	: StaticSprite(vm, 900) {
+
+	int16 x = kScene1201PointArray[pointIndex].x;
+	int16 y = kScene1201PointArray[pointIndex].y;
+	if (x < 300)
+		loadSprite(kScene1201TntFileHashList1[elemIndex], kSLFDefDrawOffset | kSLFDefPosition, 50);
+	else
+		loadSprite(kScene1201TntFileHashList2[elemIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 50, x, y - 20);
+	setClipRect(0, 0, 640, clipY2);
+}
+
+AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash)
+	: AnimatedSprite(vm, fileHash, surfacePriority, x, y), _parentScene(parentScene), _nameHash(nameHash) {
+
+	if (!getSubVar(VA_HAS_TAPE, _nameHash) && !getSubVar(VA_IS_TAPE_INSERTED, _nameHash)) {
+		SetMessageHandler(&AsScene1201Tape::handleMessage);
+	} else {
+		setVisible(false);
+		SetMessageHandler(NULL);
+	}
+}
+
+uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		sendMessage(_parentScene, 0x4826, 0);
+		messageResult = 1;
+		break;
+	case 0x4806:
+		setSubVar(VA_HAS_TAPE, _nameHash, 1);
+		setVisible(false);
+		SetMessageHandler(NULL);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging)
+	: AnimatedSprite(vm, 1200) {
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1201TntManRope::handleMessage);
+	createSurface(10, 34, 149);
+	_x = 202;
+	_y = -32;
+	if (isDummyHanging) {
+		startAnimation(0x928F0C10, 15, -1);
+		_newStickFrameIndex = STICK_LAST_FRAME;
+	} else {
+		startAnimation(0x928F0C10, 0, -1);
+		_newStickFrameIndex = 0;
+	}
+}
+
+uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02060018)
+			playSound(0, 0x47900E06);
+		break;
+	case 0x2006:
+		startAnimation(0x928F0C10, 1, -1);
+		_newStickFrameIndex = STICK_LAST_FRAME;
+		break;
+	}
+	return messageResult;
+}
+
+AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen)
+	: AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown(0) {
+
+	createSurface1(0xD088AC30, 100);
+	_x = 320;
+	_y = 240;
+	SetUpdateHandler(&AsScene1201RightDoor::update);
+	SetMessageHandler(&AsScene1201RightDoor::handleMessage);
+	_newStickFrameIndex = STICK_LAST_FRAME;
+	if (isOpen) {
+		startAnimation(0xD088AC30, -1, -1);
+		_newStickFrameIndex = STICK_LAST_FRAME;
+		_countdown = 25;
+	} else {
+		stopAnimation();
+		setVisible(false);
+	}
+}
+
+void AsScene1201RightDoor::update() {
+	if (_countdown != 0 && (--_countdown == 0))
+		stCloseDoor();
+	AnimatedSprite::update();
+}
+
+uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	case 0x4829:
+		stOpenDoor();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1201RightDoor::stOpenDoor() {
+	startAnimation(0xD088AC30, 0, -1);
+	_newStickFrameIndex = STICK_LAST_FRAME;
+	setVisible(true);
+	playSound(0, calcHash("fxDoorOpen20"));
+}
+
+void AsScene1201RightDoor::stCloseDoor() {
+	startAnimation(0xD088AC30, -1, -1);
+	_playBackwards = true;
+	setVisible(true);
+	playSound(0, calcHash("fxDoorClose20"));
+	NextState(&AsScene1201RightDoor::stCloseDoorDone);
+}
+
+void AsScene1201RightDoor::stCloseDoorDone() {
+	stopAnimation();
+	setVisible(false);
+}
+
+AsScene1201KlaymenHead::AsScene1201KlaymenHead(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200) {
+
+	createSurface(1200, 69, 98);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1201KlaymenHead::handleMessage);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	setVisible(false);
+}
+
+uint32 AsScene1201KlaymenHead::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2006:
+		_x = 436;
+		_y = 339;
+		startAnimation(0xA060C599, 0, -1);
+		setVisible(true);
+		break;
+	case 0x3002:
+		stopAnimation();
+		setVisible(false);
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isComingDown)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _asTntManRope(asTntManRope),
+	_isMoving(false) {
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1201TntMan::handleMessage);
+	createSurface(990, 106, 181);
+	_x = 201;
+	if (isComingDown) {
+		_y = 297;
+		stComingDown();
+	} else {
+		_y = 334;
+		stStanding();
+	}
+}
+
+AsScene1201TntMan::~AsScene1201TntMan() {
+	_vm->_soundMan->deleteSoundGroup(0x01D00560);
+}
+
+uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x092870C0)
+			sendMessage(_asTntManRope, 0x2006, 0);
+		else if (param.asInteger() == 0x11CA0144)
+			playSound(0, 0x51800A04);
+		break;
+	case 0x1011:
+		sendMessage(_parentScene, 0x2002, 0);
+		messageResult = 1;
+		break;
+	case 0x480B:
+		if (!_isMoving) {
+			_sprite = (Sprite*)sender;
+			stMoving();
+		}
+		break;
+	}
+	return messageResult;
+
+}
+
+uint32 AsScene1201TntMan::hmComingDown(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1201TntMan::suMoving() {
+	_x = _sprite->getX() + 100;
+}
+
+void AsScene1201TntMan::stStanding() {
+	startAnimation(0x654913D0, 0, -1);
+	SetMessageHandler(&AsScene1201TntMan::handleMessage);
+	SetSpriteUpdate(NULL);
+}
+
+void AsScene1201TntMan::stComingDown() {
+	startAnimation(0x356803D0, 0, -1);
+	SetMessageHandler(&AsScene1201TntMan::hmComingDown);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	NextState(&AsScene1201TntMan::stStanding);
+}
+
+void AsScene1201TntMan::stMoving() {
+	_vm->_soundMan->addSound(0x01D00560, 0x4B044624);
+	_vm->_soundMan->playSoundLooping(0x4B044624);
+	_isMoving = true;
+	startAnimation(0x85084190, 0, -1);
+	SetMessageHandler(&AsScene1201TntMan::handleMessage);
+	SetSpriteUpdate(&AsScene1201TntMan::suMoving);
+	_newStickFrameIndex = STICK_LAST_FRAME;
+}
+
+AsScene1201TntManFlame::AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan)
+	: AnimatedSprite(vm, 1200), _asTntMan(asTntMan) {
+
+	createSurface1(0x828C0411, 995);
+	SetUpdateHandler(&AsScene1201TntManFlame::update);
+	SetMessageHandler(&Sprite::handleMessage);
+	SetSpriteUpdate(&AsScene1201TntManFlame::suUpdate);
+	startAnimation(0x828C0411, 0, -1);
+	setVisible(false);
+}
+
+AsScene1201TntManFlame::~AsScene1201TntManFlame() {
+	_vm->_soundMan->deleteSoundGroup(0x041080A4);
+}
+
+void AsScene1201TntManFlame::update() {
+	AnimatedSprite::update();
+	if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) {
+		setVisible(true);
+		SetUpdateHandler(&AnimatedSprite::update);
+		_vm->_soundMan->addSound(0x041080A4, 0x460A1050);
+		_vm->_soundMan->playSoundLooping(0x460A1050);
+	}
+}
+
+void AsScene1201TntManFlame::suUpdate() {
+	_x = _asTntMan->getX() - 18;
+	_y = _asTntMan->getY() - 158;
+}
+
+AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _countdown(0) {
+
+	createSurface(1100, 57, 60);
+	SetUpdateHandler(&AsScene1201Match::update);
+	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	switch (getGlobalVar(V_MATCH_STATUS)) {
+	case 0:
+		_x = 521;
+		_y = 112;
+		_status = 0;
+		stIdleOnDoorFrame();
+		break;
+	case 1:
+		_x = 521;
+		_y = 112;
+		_status = 2;
+		stOnDoorFrameAboutToMove();
+		loadSound(0, 0xD00230CD);
+		break;
+	case 2:
+		setDoDeltaX(1);
+		_x = 403;
+		_y = 337;
+		_status = 0;
+		stIdleOnFloor();
+		break;
+	}
+}
+
+void AsScene1201Match::update() {
+	if (_countdown != 0 && (--_countdown == 0))
+		gotoNextState();
+	updateAnim();
+	handleSpriteUpdate();
+	updatePosition();
+}
+
+uint32 AsScene1201Match::hmOnDoorFrameAboutToMove(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x86668011)
+			playSound(0);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1201Match::hmOnDoorFrameMoving(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1201Match::hmIdle(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		sendMessage(_parentScene, 0x2001, 0);
+		messageResult = 1;
+		break;
+	case 0x4806:
+		setVisible(false);
+		setGlobalVar(V_MATCH_STATUS, 3);
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1201Match::stOnDoorFrameMoving() {
+	startAnimation(0x00842374, 0, -1);
+	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving);
+	if (_status == 0) {
+		NextState(&AsScene1201Match::stFallingFromDoorFrame);
+	} else {
+		NextState(&AsScene1201Match::stOnDoorFrameAboutToMove);
+	}
+}
+
+void AsScene1201Match::stFallingFromDoorFrame() {
+	setGlobalVar(V_MATCH_STATUS, 2);
+	_x -= 199;
+	_y += 119;
+	startAnimation(0x018D0240, 0, -1);
+	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving);
+	NextState(&AsScene1201Match::stIdleOnFloor);
+}
+
+void AsScene1201Match::stOnDoorFrameAboutToMove() {
+	startAnimation(0x00842374, 0, -1);
+	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove);
+	_newStickFrameIndex = 0;
+	if (_status != 0) {
+		_countdown = 36;
+		_status--;
+		NextState(&AsScene1201Match::stOnDoorFrameMoving);
+	}
+}
+
+void AsScene1201Match::stIdleOnDoorFrame() {
+	startAnimation(0x00842374, 0, -1);
+	SetMessageHandler(&AsScene1201Match::hmIdle);
+	_newStickFrameIndex = 0;
+}
+
+void AsScene1201Match::stIdleOnFloor() {
+	setDoDeltaX(1);
+	_x = 403;
+	_y = 337;
+	startAnimation(0x00842374, 0, -1);
+	SetMessageHandler(&AsScene1201Match::hmIdle);
+	_newStickFrameIndex = 0;
+}
+
+AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen)
+	: AnimatedSprite(vm, 900), _parentScene(parentScene), _klaymen(klaymen), _klaymenTooClose(false) {
+
+	// NOTE: _countdown2 and _countdown3 were unused/without effect and thus removed
+
+	createSurface(1100, 203, 199);
+	SetUpdateHandler(&AsScene1201Creature::update);
+	SetMessageHandler(&AsScene1201Creature::hmWaiting);
+	_x = 540;
+	_y = 320;
+	stWaiting();
+}
+
+void AsScene1201Creature::update() {
+	bool oldKlaymenTooClose = _klaymenTooClose;
+	_klaymenTooClose = _klaymen->getX() >= 385;
+	if (_klaymenTooClose != oldKlaymenTooClose)
+		stWaiting();
+	if (_countdown != 0 && (--_countdown == 0))
+		gotoNextState();
+	updateAnim();
+	handleSpriteUpdate();
+	updatePosition();
+}
+
+uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02060018)
+			playSound(0, 0xCD298116);
+		break;
+	case 0x2004:
+		GotoState(&AsScene1201Creature::stStartReachForTntDummy);
+		break;
+	case 0x2006:
+		GotoState(&AsScene1201Creature::stPincerSnapKlaymen);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1201Creature::hmPincerSnap(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmWaiting(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1201Creature::hmPincerSnapKlaymen(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02060018) {
+			playSound(0, 0xCD298116);
+			sendMessage(_parentScene, 0x4814, 0);
+			sendMessage(_klaymen, 0x4814, 0);
+		}
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1201Creature::stWaiting() {
+	startAnimation(0x08081513, 0, -1);
+	SetMessageHandler(&AsScene1201Creature::hmWaiting);
+	NextState(&AsScene1201Creature::stPincerSnap);
+	_countdown = 36;
+}
+
+void AsScene1201Creature::stPincerSnap() {
+	if (!_klaymenTooClose) {
+		startAnimation(0xCA287133, 0, -1);
+		SetMessageHandler(&AsScene1201Creature::hmPincerSnap);
+		NextState(&AsScene1201Creature::stWaiting);
+	}
+}
+
+void AsScene1201Creature::stStartReachForTntDummy() {
+	startAnimation(0x08081513, 0, -1);
+	SetMessageHandler(&AsScene1201Creature::hmWaiting);
+	NextState(&AsScene1201Creature::stReachForTntDummy);
+	_countdown = 48;
+}
+
+void AsScene1201Creature::stReachForTntDummy() {
+	startAnimation(0x5A201453, 0, -1);
+	SetMessageHandler(&AsScene1201Creature::hmWaiting);
+	_countdown = 0;
+}
+
+void AsScene1201Creature::stPincerSnapKlaymen() {
+	startAnimation(0xCA287133, 0, -1);
+	SetMessageHandler(&AsScene1201Creature::hmPincerSnapKlaymen);
+	NextState(&AsScene1201Creature::stWaiting);
+	_countdown = 0;
+}
+
+AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen)
+	: AnimatedSprite(vm, 1100), _klaymen(klaymen) {
+
+	_x = 320;
+	_y = 240;
+	createSurface(800, 55, 199);
+	if (_klaymen->getX() < 100) {
+		startAnimation(0x508A111B, 0, -1);
+		_newStickFrameIndex = STICK_LAST_FRAME;
+		playSound(0, calcHash("fxDoorOpen03"));
+	} else {
+		startAnimation(0x508A111B, -1, -1);
+		_newStickFrameIndex = STICK_LAST_FRAME;
+	}
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1201LeftDoor::handleMessage);
+}
+
+uint32 AsScene1201LeftDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4809:
+		stCloseDoor();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1201LeftDoor::stCloseDoor() {
+	startAnimation(0x508A111B, -1, -1);
+	_playBackwards = true;
+	_newStickFrameIndex = 0;
+}
+
+static const NPoint kScene1202Points[] = {
+	{203, 140}, {316, 212}, {277, 264},
+	{176, 196}, {275, 159}, {366, 212},
+	{230, 195}, {412, 212}, {368, 263},
+	{204, 192}, {365, 164}, {316, 262},
+	{191, 255}, {280, 213}, {406, 266},
+	{214, 254}, {316, 158}, {402, 161}
+};
+
+static const uint32 kScene1202FileHashes[] = {
+	0x1AC00B8, 0x1AC14B8, 0x1AC14B8,
+	0x1AC30B8, 0x1AC14B8, 0x1AC14B8,
+	0x1AC00B8, 0x1AC14B8, 0x1AC14B8,
+	0x1AC90B8, 0x1AC18B8, 0x1AC18B8,
+	0x1AC30B8, 0x1AC14B8, 0x1AC14B8,
+	0x1AC50B8, 0x1AC14B8, 0x1AC14B8
+};
+
+AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int itemIndex)
+	: AnimatedSprite(vm, 900), _parentScene(parentScene), _itemIndex(itemIndex) {
+
+	int positionIndex;
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1202TntItem::hmShowIdle);
+	positionIndex = getSubVar(VA_TNT_POSITIONS, _itemIndex);
+	createSurface(900, 37, 67);
+	_x = kScene1202Points[positionIndex].x;
+	_y = kScene1202Points[positionIndex].y;
+	stShowIdle();
+}
+
+uint32 AsScene1202TntItem::hmShowIdle(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		sendMessage(_parentScene, 0x2000, _itemIndex);
+		messageResult = 1;
+		break;
+	case 0x2001:
+		_newPosition = (int)param.asInteger();
+		stChangePositionFadeOut();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1202TntItem::hmChangePosition(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1202TntItem::stShowIdle() {
+	startAnimation(kScene1202FileHashes[_itemIndex], 0, -1);
+	SetMessageHandler(&AsScene1202TntItem::hmShowIdle);
+	_newStickFrameIndex = 0;
+}
+
+void AsScene1202TntItem::stChangePositionFadeOut() {
+	startAnimation(kScene1202FileHashes[_itemIndex], 0, -1);
+	SetMessageHandler(&AsScene1202TntItem::hmChangePosition);
+	NextState(&AsScene1202TntItem::stChangePositionFadeIn);
+}
+
+void AsScene1202TntItem::stChangePositionFadeIn() {
+	_x = kScene1202Points[_newPosition].x;
+	_y = kScene1202Points[_newPosition].y;
+	startAnimation(kScene1202FileHashes[_itemIndex], 6, -1);
+	_playBackwards = true;
+	SetMessageHandler(&AsScene1202TntItem::hmChangePosition);
+	NextState(&AsScene1202TntItem::stChangePositionDone);
+}
+
+void AsScene1202TntItem::stChangePositionDone() {
+	sendMessage(_parentScene, 0x2002, _itemIndex);
+	stShowIdle();
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/modules/module1200_sprites.h b/engines/neverhood/modules/module1200_sprites.h
new file mode 100644
index 0000000..a5d7b68
--- /dev/null
+++ b/engines/neverhood/modules/module1200_sprites.h
@@ -0,0 +1,172 @@
+/* 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_MODULE1200_SPRITES_H
+#define NEVERHOOD_MODULES_MODULE1200_SPRITES_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Used for both the scene sprites and the scene itself (for clipping)
+static const NPoint kScene1201PointArray[] = {
+	{218, 193}, {410, 225}, {368, 277},
+	{194, 227}, {366, 174}, {458, 224},
+	{242, 228}, {512, 228}, {458, 277},
+	{217, 233}, {458, 173}, {410, 276},
+	{203, 280}, {371, 226}, {508, 279},
+	{230, 273}, {410, 171}, {493, 174}
+};
+
+class AsScene1201Tape : public AnimatedSprite {
+public:
+	AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash);
+protected:
+	Scene *_parentScene;
+	uint32 _nameHash;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene1201TntManRope : public AnimatedSprite {
+public:
+	AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene1201RightDoor : public AnimatedSprite {
+public:
+	AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen);
+protected:
+	Sprite *_klaymen;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stOpenDoor();
+	void stCloseDoor();
+	void stCloseDoorDone();
+};
+
+class AsScene1201KlaymenHead : public AnimatedSprite {
+public:
+	AsScene1201KlaymenHead(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene1201TntMan : public AnimatedSprite {
+public:
+	AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isDown);
+	virtual ~AsScene1201TntMan();
+protected:
+	Scene *_parentScene;
+	Sprite *_asTntManRope;
+	Sprite *_sprite;
+	bool _isMoving;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmComingDown(int messageNum, const MessageParam &param, Entity *sender);
+	void suMoving();
+	void stStanding();
+	void stComingDown();
+	void stMoving();
+};
+
+class AsScene1201TntManFlame : public AnimatedSprite {
+public:
+	AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan);
+	~AsScene1201TntManFlame();
+protected:
+	Sprite *_asTntMan;
+	void update();
+	void suUpdate();
+};
+
+class AsScene1201Match : public AnimatedSprite {
+public:
+	AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	int _countdown;
+	int _status;
+	void update();
+	uint32 hmOnDoorFrameAboutToMove(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmOnDoorFrameMoving(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmIdle(int messageNum, const MessageParam &param, Entity *sender);
+	void stOnDoorFrameMoving();
+	void stFallingFromDoorFrame();
+	void stOnDoorFrameAboutToMove();
+	void stIdleOnDoorFrame();
+	void stIdleOnFloor();
+};
+
+class AsScene1201Creature : public AnimatedSprite {
+public:
+	AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen);
+protected:
+	Scene *_parentScene;
+	Sprite *_klaymen;
+	int _countdown;
+	bool _klaymenTooClose;
+	void update();
+	uint32 hmWaiting(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPincerSnap(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPincerSnapKlaymen(int messageNum, const MessageParam &param, Entity *sender);
+	void stWaiting();
+	void stPincerSnap();
+	void stStartReachForTntDummy();
+	void stReachForTntDummy();
+	void stPincerSnapKlaymen();
+};
+
+class AsScene1201LeftDoor : public AnimatedSprite {
+public:
+	AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen);
+protected:
+	Sprite *_klaymen;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stCloseDoor();
+};
+
+class SsScene1201Tnt : public StaticSprite {
+public:
+	SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2);
+};
+
+class AsScene1202TntItem : public AnimatedSprite {
+public:
+	AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int index);
+protected:
+	Scene *_parentScene;
+	int _itemIndex, _newPosition;
+	uint32 hmShowIdle(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmChangePosition(int messageNum, const MessageParam &param, Entity *sender);
+	void stShowIdle();
+	void stChangePositionFadeOut();
+	void stChangePositionFadeIn();
+	void stChangePositionDone();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULES_MODULE1200_SPRITES_H */
diff --git a/engines/neverhood/modules/module1300.cpp b/engines/neverhood/modules/module1300.cpp
index 604f60d..9fa266c 100644
--- a/engines/neverhood/modules/module1300.cpp
+++ b/engines/neverhood/modules/module1300.cpp
@@ -21,7 +21,7 @@
  */
 
 #include "neverhood/modules/module1000.h"
-#include "neverhood/modules/module1200.h"
+#include "neverhood/modules/module1200_sprites.h"
 #include "neverhood/modules/module1300.h"
 #include "neverhood/modules/module1300_sprites.h"
 #include "neverhood/modules/module1400_sprites.h"
diff --git a/engines/neverhood/modules/module1400.cpp b/engines/neverhood/modules/module1400.cpp
index 655aa15..2766a1c 100644
--- a/engines/neverhood/modules/module1400.cpp
+++ b/engines/neverhood/modules/module1400.cpp
@@ -23,7 +23,7 @@
 #include "neverhood/diskplayerscene.h"
 #include "neverhood/gamemodule.h"
 #include "neverhood/modules/module1000.h"
-#include "neverhood/modules/module1200.h"
+#include "neverhood/modules/module1200_sprites.h"
 #include "neverhood/modules/module1400.h"
 #include "neverhood/modules/module1400_sprites.h"
 #include "neverhood/modules/module2100_sprites.h"
diff --git a/engines/neverhood/modules/module1600.cpp b/engines/neverhood/modules/module1600.cpp
index 165855a..0df7dd8 100644
--- a/engines/neverhood/modules/module1600.cpp
+++ b/engines/neverhood/modules/module1600.cpp
@@ -21,7 +21,7 @@
  */
 
 #include "neverhood/gamemodule.h"
-#include "neverhood/modules/module1200.h"
+#include "neverhood/modules/module1200_sprites.h"
 #include "neverhood/modules/module1600.h"
 #include "neverhood/modules/module1600_sprites.h"
 #include "neverhood/modules/module2200_sprites.h"
diff --git a/engines/neverhood/modules/module2100.cpp b/engines/neverhood/modules/module2100.cpp
index 21df622..275659d 100644
--- a/engines/neverhood/modules/module2100.cpp
+++ b/engines/neverhood/modules/module2100.cpp
@@ -20,10 +20,10 @@
  *
  */
 
+#include "neverhood/gamemodule.h"
+#include "neverhood/modules/module1200_sprites.h"
 #include "neverhood/modules/module2100.h"
 #include "neverhood/modules/module2100_sprites.h"
-#include "neverhood/gamemodule.h"
-#include "neverhood/modules/module1200.h"
 
 namespace Neverhood {
 
diff --git a/engines/neverhood/modules/module2200.cpp b/engines/neverhood/modules/module2200.cpp
index 7220c25..685f982 100644
--- a/engines/neverhood/modules/module2200.cpp
+++ b/engines/neverhood/modules/module2200.cpp
@@ -20,10 +20,10 @@
  *
  */
 
+#include "neverhood/modules/module1000.h"
+#include "neverhood/modules/module1200_sprites.h"
 #include "neverhood/modules/module2200.h"
 #include "neverhood/modules/module2200_sprites.h"
-#include "neverhood/modules/module1000.h"
-#include "neverhood/modules/module1200.h"
 #include "neverhood/gamemodule.h"
 #include "neverhood/diskplayerscene.h"
 
diff --git a/engines/neverhood/modules/module2400.cpp b/engines/neverhood/modules/module2400.cpp
index a045dcd..6cc441a 100644
--- a/engines/neverhood/modules/module2400.cpp
+++ b/engines/neverhood/modules/module2400.cpp
@@ -21,7 +21,7 @@
  */
 
 #include "neverhood/modules/module1000.h"
-#include "neverhood/modules/module1200.h"
+#include "neverhood/modules/module1200_sprites.h"
 #include "neverhood/modules/module2400.h"
 #include "neverhood/modules/module2100_sprites.h"
 #include "neverhood/modules/module2200_sprites.h"
diff --git a/engines/neverhood/modules/module2800.cpp b/engines/neverhood/modules/module2800.cpp
index 289fc88..00d1f97 100644
--- a/engines/neverhood/modules/module2800.cpp
+++ b/engines/neverhood/modules/module2800.cpp
@@ -23,7 +23,7 @@
 #include "neverhood/modules/module2800.h"
 #include "neverhood/gamemodule.h"
 #include "neverhood/modules/module1000.h"
-#include "neverhood/modules/module1200.h"
+#include "neverhood/modules/module1200_sprites.h"
 #include "neverhood/modules/module1700_sprites.h"
 #include "neverhood/modules/module2200_sprites.h"
 #include "neverhood/modules/module2800_sprites.h"


Commit: 1e87d135bedf9844e3e44a4261ffcb44aac67feb
    https://github.com/scummvm/scummvm/commit/1e87d135bedf9844e3e44a4261ffcb44aac67feb
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-10-05T11:32:16-07:00

Commit Message:
FULLPIPE: Silence false positives about uninitialized variables in MSVC

Changed paths:
    engines/fullpipe/behavior.cpp
    engines/fullpipe/motion.cpp



diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index 1a2b7bb..c1fe835 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -239,7 +239,7 @@ void BehaviorInfo::initObjectBehavior(GameVar *var, Scene *sc, StaticANIObject *
 	}
 
 	for (int i = 0; i < _itemsCount; i++) {
-		int maxDelay;
+		int maxDelay = 0;
 
 		_bheItems.push_back(new BehaviorEntry(var->getSubVarByIndex(i), sc, ani, &maxDelay));
 
@@ -275,7 +275,7 @@ BehaviorEntry::BehaviorEntry(GameVar *var, Scene *sc, StaticANIObject *ani, int
 
 		for (int i = 0; i < _itemsCount; i++) {
 			GameVar *subvar = var->getSubVarByIndex(i);
-			int delay;
+			int delay = 0;
 
 			_items[i] = new BehaviorEntryInfo(subvar, sc, &delay);
 			totalPercent += delay;
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index 78fdbe2..ecf128e 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -401,7 +401,7 @@ bool MovGraph2::initDirections(StaticANIObject *obj, MovGraph2Item *item) {
 			return false;
 
 		for (int act = 0; act < 3; act++) {
-			int idx;
+			int idx = 0;
 
 			switch(act) {
 			case 0:
@@ -428,7 +428,7 @@ bool MovGraph2::initDirections(StaticANIObject *obj, MovGraph2Item *item) {
 		}
 
 		for (int act = 0; act < 4; act++) {
-			int idx;
+			int idx = 0;
 
 			switch(act) {
 			case 0:
@@ -458,7 +458,7 @@ bool MovGraph2::initDirections(StaticANIObject *obj, MovGraph2Item *item) {
 		}
 
 		for (int act = 0; act < 4; act++) {
-			int idx;
+			int idx = 0;
 
 			switch(act) {
 			case 0:






More information about the Scummvm-git-logs mailing list